1,java虚拟机的特性

答:

  • 特点 
    java语言的重要特点是与平台无关性,java虚拟机是实现这一特点的关键。
  • 【对比高级语言】 
    一般高级语言要想在不同平台运行,至少需要生成不同目标代码。而java虚拟机屏蔽了与具体系统平台信息,只要编译生成在java虚拟机运行的字节码,就可以在多种平台运行,不需要重复编译。
  • 【解释字节码】 
    java虚拟机在执行字节码时,把字节码解释成具体平台的机器指令执行。

2,谈谈对jvm的理解

答:

这里和大家简单分享一下JAVA和JVM运行的原理,Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行,而JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器

JAVA和JVM运行的原理

1.Java语言运行的过程

Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行。

ubuntu和Android内核一样吗_ubuntu和Android内核一样吗

也相当与

ubuntu和Android内核一样吗_JVM_02

注:JVM(java虚拟机)包括解释器,不同的JDK虚拟机是相同的,解释器不同。

2.JVM:

JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。

java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。

JVM执行程序的过程 :

I.加载。class文件

II.管理并分配内存

III.执行垃圾收集

JRE(java运行时环境)由JVM构造的java程序的运行环境 

ubuntu和Android内核一样吗_ubuntu和Android内核一样吗_03

3,JVM内存区域,开线程影响哪块内存

4,对Dalvik、ART虚拟机有什么了解?

5,Art和Dalvik对比

6,虚拟机原理,如何自己设计一个虚拟机(内存管理,类加载,双亲委派)

7,谈谈对双亲委派模型理解

8,JVM内存模型,内存区域

9,类加载机制

10,谈谈对ClassLoader(类加载器)的理解

答:ClassLoader顾名思义就是用来加载Class文件到JVM,以供程序使用的,java程序可以动态加载类定义,而这个动态加载的机制就是通过ClassLoader来实现的。

ClassLoader的类型有很多,但是最重要的是Bootstrap Classloader,这个是启动类加载器,这个ClassLoader在JVM运行时候加载java核心的API以满足java程序的基本需求,这就包括了其他的ClassLoader,其中包括用户自定义的ClassLoader和ExtClassLoader,还有一个是AppClassLoader。

其实,也就是说当运行一个程序的时候,JVM启动,运行bootstrap classloader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。 

在定义一个ClassLoader的时候都必须继承ClassLoader这个抽象类,而每个ClassLoader都会有一个parent ClassLoader,我们可以看一下ClassLoader这个抽象类中有一个getParent()方法,这个方法用来返回当前ClassLoader的parent,注意,这个parent不是指的被继承的类,而是在实例化该ClassLoader时指定的一个ClassLoader,如果这个parent为null,那么就默认该ClassLoader的parent是Bootstrap Classloader。 

如果自定义了一个UserClassLoader,使用这个自定义的ClassLoader加载java.lang.String,那么这里String是否会被这个ClassLoader加载呢?事实上java.lang.String这个类并不是被这个UserClassLoader加载,而是由Bootstrap Classloader进行加载,这就是双亲委托模式机制,也就是在任何一个自定义ClassLoader加载一个类之前,它都会先委托它的父亲ClassLoader进行加载,只有当父亲ClassLoader无法加载成功后,才会由自己加载。

在ClassLoader中的一段源代码中有描述: 

Java代码  

[javascript]

1. protected synchronized Class loadClass(String name, boolean resolve)    
2. throws ClassNotFoundException    
3.    {    
4. // 首先检查该name指定的class是否有被加载    
5.  Class c = findLoadedClass(name);    
6. if (c == null) {    
7. try {    
8. if (parent != null) {    
9. //如果parent不为null,则调用parent的loadClass进行加载    
10. false);    
11. else {    
12. //parent为null,则调用BootstrapClassLoader进行加载    
13.         c = findBootstrapClass0(name);    
14.     }    
15. catch (ClassNotFoundException e) {    
16. //如果仍然无法加载成功,则调用自身的findClass进行加载                
17.         c = findClass(name);    
18.     }    
19. }    
20. if (resolve) {    
21.     resolveClass(c);    
22. }    
23. return c;    
24.    }


这种双亲委托模式可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。还有一个原因就是如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患。当ClassLoader加载class的时候会经过三步装载、连接、初始化。

其中装载就是找到相应的class文件,读入JVM;连接分三步,第一步是验证class是否符合规格,第二步是准备,就是为类变量分配内存同时设置默认初始值,第三步就是解释。初始化就是将类实例化成对象,以待其他应用程序使用。

其实ClassLoader就这样简单,知道了这些原理和理论,如果项目或者产品中遇到使用ClassLoader的情况就应该会非常轻松。

11,谈谈对动态加载(OSGl)的理解

12,内存对象的循环引用及避免

13,内存回收机制、GC回收策略、GC原理时机以及GC对象

14,垃圾回收机制与调用System.gc()区别

15,Ubuntu编译安卓系统

16,系统启动流程是什么?(提示:Zygote进程->SystemServer进程->各种系统服务->应用进程)

17,大体说清一个应用程序安装到手机上时发生了什么

18,简述Activity启动全部过程

答:七大生命周期讲解

19,App启动流程,从点击桌面开始

20,逻辑地址与物理地址,为什么使用逻辑地址?

21,Android为每个应用程序分配的内存大小是多少?

22,Android 中进程内存的分配,能不能自己分配定额内存?

23,进程保活的方式

24,如何保证一个后台服务不被杀死?(相同问题:如何保证service在后台不被kill?)比较省电的方式是什么?

25,App中唤醒其他进程的实现方式