Java虚拟机的作用?
解释运行字节码程序消除平台相关性。
jvm将java字节码解释为具体平台的具体指令。一般的高级语言如要在不同的平台上运行,至少需要编译成不同的目标代码。而引入JVM后,Java语言在不同平台上运行时不需要重新编译。
Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
链接:https://www.nowcoder.com/questionTerminal/057e91ba0d14402c93a7262ef68b5892
内存分配策略?(书 - 91)
Java体系提倡自动内存管理最终归结于自动化解决内存分配问题,其中几条最普遍的内存分配规则是遵循对象优先在新生代分配,大对象直接进入老年代,长期存活的对象进入老年代。
什么是大对象?
需要大量连续内存空间的Java对象,典型的是很长的字符串以及数组
如何理解长期存活的对象?
如果对象在Eden出生并经过第一Minor GC后仍然存活,并且能被Survivor容纳的话,将被移动到survivor空间中,并且对象年龄设为1。对象在survivor区中每“熬过“一次minor GC,年龄就增加1,当它的年龄增加到一定程度(默认为15岁),就将会被晋升到老年代。
对象晋升老年代的年龄阈值可以通过参数设置。
类的生命周期
加载->验证->准备->解析->初始化->使用->卸载
类加载的过程(p214)
类加载时机(书-210)
Java虚拟机规范中并没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。
对初始化阶段了解?(书-210~211)
- - 虚拟机规范严格规定有且只有5种情况必须立即对类进行“初始化”
- 遇到new 、getstatic 、putstatic、 invokestatic这4条字节码指令时(实例化对象,读取和设置类的静态字段、调用类的静态方法),如果类没有进行初始化,则需要先触发其初始化
- 使用java.lang.reflect包的方法对类进行反射调用时候,如果类没有进行过初始化,则需要先触发其初始化
- 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化
- 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类
- 使用jdk1.7的动态语言支持时,…
描述一下类加载器及其在Java程序中的作用(与类的关系)(p228)?
类加载器用于实现类的加载动作。
对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性。比较两个类是否“相等”(class对象的equal()方法、isAssignableForm()方法、isInstance()防方法),
只有在这两个类是由一个类加载器加载的前提下才有意义,否则,即使两个类来源同一个class文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等。
双亲委派模型的工作过程?(p231)
- 如果一个类加载器收到类加载的请求,它首先不会去尝试加载这个类,而是把这个类请求委派给父类加载器去完成,每一层次的类加载器都是如此,因此所有的加载器请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个请求时,子加载器才会尝试自己去加载。
- 好处是java类随着它的类加载器一起具备了一种带有优先级的层次关系。