JVM总结
对JVM的理解?
JVM虚拟机它能够将.class文件解释为可供机器执行的机器码,它使得Java可以跨平台的执行,因为由它屏蔽了各个平台软硬件的差异。
Java内存模型由哪几部分组成?并分别解释他们的作用。
堆、方法区、虚拟机栈、本地方法栈、PC计数器。
PC计数器:一块较小的内存空间, 是当前线程所执行的字节码的行号指示器。这里是唯一一个不会产生oom的区域。
虚拟机栈:描述java方法执行的内存模型,每个方法在执行的同时都会记录一个栈帧。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
本地方法栈:描述native方法执行的内存模型。
堆:存储对象、数组。其中存储对象的可以被划分为新生代、老年代,其中新生代又被划分为eden区、from survivor区和to survivor区。
方法区(永久代):用于存储被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
哪些是线程私有?哪些是线程共享?
线程私有:虚拟机栈、本地方法栈、PC计数器。
线程共享:堆、方法区。
堆的结构
1/3的新生代和2/3的老年代,新生代中eden占8/10,from survivor占1/10,to survivor占1/10。
MinorGC的过程
采用复制算法
1.首先,把eden区和from survivor区的存活对象移到to survivor区(如果有对象达到了年龄就放到老年代区),同时把这些对象的年龄+1岁(如果当to survivor区地方不够时,也移到老年代)。
2.清空eden区和from survivor区的对象。
3.to survivor区将成为下一次的from survivor区,from survivor区将成为下一次的to survivor区。
MajorGC的过程
采用标记清除算法
扫描一遍老年代,标记出存活的对象,然后回收没有标记的对象。
jdk8与元数据
在jdk8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。元空间并不在虚拟机中,而是使用本地内存。类的元数据放入native memory, 字符串池和类的静态变量放入java堆中,这样可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制。
垃圾回收算法?
标记-清除算法:标记被引用的对象,然后直接清除掉未被引用的。
缺点:会产生内存碎片,而且标记和清除这两个过程效率都比较低。
标记-整理算法:标记被引用的对象,并把它们移动到一边,清除掉另一边的垃圾对象。
优点:不会有内存碎片,进而提升了对象创建分配内存的速度。
缺点:标记和整理的效率都不高。
复制算法:使用两块内存区域,先使用一块区域,当这块区域内存满了之后,将存活下来的对象放到另一块区域。
优点:没有内存碎片,且效率高。
缺点:浪费一半空间,在对象存活率较高时就要进行较多的复制操作,效率将会变低。
分代收集算法:以HotSpot为例,在新生代、生存者0区和生存者1区使用复制算法,因为这三个区域会有大量的对象不再被引用。而在老年代则使用标记清除或者标记整理算法。