JVM
JVM是Java Virual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,他是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。JVM屏蔽了与具体操作系统平台相关的信息,Java程序只需生成在Java虚拟机上运行的字节码,就可以在多种平台上不加修改的运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。我们划重点去理解:
JVM是虚构计算机 ,可以理解为JVM是java程序的操作系统,而这个操作系统可运行的文件是.class文件;
虚拟机组成 ,一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域;
屏蔽具体操作系统平台, 这也就是平时说的java平台无关,一次编译,随处运行。
JVM垃圾回收
Java类的实例所需的存储空间是在堆上分配的。前面在类加载的时候说过的解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后,便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕,便将其回收到堆中。在Java语言中,除了new语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由Java运行系统承担的。这允许Java运行系统的设计者自己决定碎片回收的方法。在SUN公司开发的Java解释器和Hot Java环境中,碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能,而且使程序设计人员摆脱了自己控制内存使用的风险。
JVM垃圾回收的一些功能 Garbage Collection(GC)
对新生代的对象的收集称为minor GC;
对老年代的对象的收集称为full GC;
程序中主动调用System.gc()强制执行的GC为full GC;
强引用:默认情况下,对象采用的均为强引用;
软引用:适用于缓存场景(只有在内存不够用的情况下才会被回收)
弱引用:在GC时一定会被GC回收
虚引用:用于判断对象是否被GC
那么JVM是如何判断对象是否要回收的呢?
这里用到:可达性分析法
通过一系列**“GC Roots”对象**作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的。不可达对象不一定会成为可回收对象。进入DEAD状态的线程还可以恢复,GC不会回收它的内存。(把一些对象当做root对象,JVM认为root对象是不可回收的,并且root对象引用的对象也是不可回收的)。
这里我们可以看到,可达性分析法的起点是GC Roots”对象,那么怎样才能将对象认为是root对象呢,遵循以下原则:
(1) 虚拟机栈(栈帧中本地变量表)中引用的对象
(2) 方法区中静态属性引用的对象
(3) 方法区中常量引用的对象
(4) 本地方法栈中Native方法引用的对象
注:原文链接https://blog.csdn.net/TiYong/article/details/106247183