JVM是什么?
JVM是Java Virtual Machine(Java虚拟机)的缩写,它是一个虚拟的计算机。
- **跨平台 **
Java为什么说是无关平台的编程语言呢?其实就是因为JVM,JAVA语言只需要把代码编译成JVM上可以运行的字节码就行了,JVM在运行的时候会把字节码转换成各个操作系统上可执行的指令,就可实现"一次编译,处处运行"。举个例子,假如你要去英国,但是你不会英语,这时候你就需要找一个既懂中文又懂英文的人来当翻译,JVM就可以比喻成一个翻译官。 -
类加载器的分工
(1)引导类加载器负责加载JAVA_HOME/jre/lib/rt.jar(核心类库)。
(2)扩展类加载器负责加载JAVA_HOME/jre/lib/ext/(扩展类库)。
(3)系统类加载器负责加载我们自己写的Java类和main方法类。 -
JVM的垃圾回收机制(GC)
(1).如何辨别垃圾?
引用计数法
引用堆里的对象,每次引用一次对象就+1,如果对象赋值为null就-1。但是这个算法有一个致命的缺陷,那就是对于循环引用的对象无法进行回收,GC也不会去处理。这种方式实在JDK1.5以后就被淘汰了。
优点:引用计数法实现起来比较简单,对程序不被长时间打断的实时环境比较有利。
缺点:需要额外的空间来存储计数器,难以检测出对象之间的循环引用。
根搜索算法
设立若干种根对象,当任何一个根对象到某一个对象均不可达时,则认为这个对象是可以被回收的。这个方法解决了循环引用的问题。
(2).怎么回收垃圾?*
标记清除算法:*
找到之后直接清除掉,有一个明显的缺点,内容利用的效率不高,存在这许多内容碎片。
分段复制算法:
解决了内存碎片的问题,但是会有大量的对象移动,就会导致JVM的卡顿。
标记整理算法:
碎片少,是以上两种方式的整合。
分代收集算法:
将堆内存划分为新生代、老年代和永久代(元空间)。
这是因为不同对象存活时间不一致,有些可能只使用一次,使用后就需要回收,而有些对象却会伴随整个程序的生命周期。分代有利于堆不同生命周期的对象进行管理,减少GC次数,提高运行效率。
新生代(Eden):朝生夕灭的对象(方法的局部变量等)。
老年代 (survivor):存活得比较久,但还是要死的对象(缓存对象、单例对象等)。
永久代(Tentred):对象生成后几乎不灭的对象(加载过的类信息)。
分代收集算法是现在的jvm采用的算法。