java虚拟机 —— 垃圾回收机制

1. 什么是java虚拟机

java虚拟机我们简称(jvm) 是java virtual machine 的简写,它是java虚构出来的计算机,有自己的指令集,寄存器和堆栈内存。它屏蔽了java应用程序与具体的操作平台相关的信息,java程序只需生成jvm的目标代码既字节码,jvm通过对字节码的解释最终转化为具体平台的指令,实现了java的 跨平台。

2. jvm中的垃圾回收机制

什么是垃圾回收机制

在java的虚拟机当中,在我们进行实例化的时候,堆会给我们开辟新的空间存放实例。而由于堆,方法区是线程公有,不会像栈区一样随着线程的销毁而销毁。因此在java虚拟机中必须要有垃圾回收的机制,定时清理内存,防止内存溢出的情况。

哪些运行时数据区中的哪些内存需要被GC(垃圾回收)

虚拟机栈,本地方法栈中的内存会随着线程的销毁而清空,而方法区和堆不会自动情况这是垃圾收集器所关注的部分,因此需要JVM进行垃圾回收。

3. 如何判断哪些内存需要被回收

3.1 引用计数算法。

当创建对象实例时候,就会给该变量的实例创建一个计数器,初始值为1。当其他变量用这个对象进行赋值的时候,这个对象的变量就会+1。当这个对象过了生命周期或者赋了新的值后,该计数器就会减1.当计数器的值为0,该对象也就会被回收。

优点:对线程的运行影响不大,而且执行快。

缺点:无法检测循环的引用。如父对象引用子对象,子对象引用父对象这种情况下计数器不可能为0,也不可能被回收。

3.2 可达性算法

可达性算法的算法思路。他就像一颗树,不断的进行引用,假设从A作为一个根开始,引用链B和C然后B和C又引用链到D和E。当有对象没有被引用链的时候,就会出现对象不可达的情况,此时就代表对象是不可用的,它就会被当做垃圾回收处理掉。

方法区的垃圾如何回收?

1、废弃常量。

如何判断废弃常量呢?以字面量回收为例,如果一个字符串“abc”已经进入常量池,但是当前系统没有任何一个String对象引用了叫做“abc”的字面量,那么,如果发生垃圾回收并且有必要时,“abc”就会被系统移出常量池。常量池中的其他类(接口)、方法、字段的符号引用也与此类似。

2、无用的类。

如何判断无用的类,满足一下三个条件。

1、该类的所有实例被回收。堆中没有该类的任何实例。

2、加载该类的ClassLoader被回收。

3、该类对于的java.lang.Class对象没有在任何地方被引用,任何地方无法通过放射调用该方法。

以上就是个人对jvm中GC的理解,如若有误,欢迎大佬指导!

评论区评论“ 学习 ”,即可免费获取一套学习资料!私信小编也可获取

你可能感兴趣的:(java虚拟机 —— 垃圾回收机制)