jvm是java虚拟机吧,简述java虚拟机的垃圾回收机制
在上一篇文章中,我们说过自动内存管理分为两部分:给对象分配内存和回收分配给对象的内存。本文谈的是后者,即回收分配给对象的内存。垃圾收集机制是用来回收内存的,英文名为GC(Garbage Collection)。
在这一部分,我们需要解决以下问题:
1.有哪些内存需要回收?
2.什么时候回收?
3.怎么回收?
哪些内存需要回收?
堆和方法区域的内存需要回收,而其余的不需要回收。
因为只有堆和方法区是线程共享的,其余的都是和线程一起“生与死”的。线程结束,内存自然会回收,不用管他们。
什么时候回收?
(1)桩内:
当对象“死”了,就要回收它的内存。什么叫约会没戏了?没有地方引用,没用。那么怎么判断它是不是死了呢?
有两种方法:
引用计数算法
向对象添加引用计数器。每当有对它的引用时,计数器的值将是1。当引用无效时,计数器的值将为-1。当计数器的值为0时,表示该对象没有被引用,即“可以死了”。
但是有一个弊端,就是循环引用的问题。如下图所示,堆中的两个对象即使没用也不能回收,因为它们相互引用,计数器的值至少为1。
如何解决写爬虫IP受阻的问题?立即使用。
可达性分析
所有生成的对象都是名为“GC根”的根的子树。从GC根向下搜索,搜索经过的路径叫做引用链。当一个对象没有指向GC根的引用链时,称为不可达,即可以被GC回收。这是Java中比较常见的方式。
就像下图堆中的未引用对象一样,可以回收。
如何判断一个对象是否还有引用?java中有四种引用:
强引用:Object o=new Object()。只要强引用存在,GC就永远不会回收被引用的对象。
软引用:描述一些有用但不必要的对象。当系统即将耗尽内存时,它将被回收。
弱参考:只要进行GC,就会被回收。
虚拟引用:这是最弱的引用关系,无法通过虚拟引用获得对象实例。它的功能是当这个对象被收集器收集时接收系统通知。
(2)在方法区域:
正如我们所知,方法区存储的数据包括类信息、常量、静态变量和由实时编译器编译的、已经被虚拟机加载的代码。所以我们在方法区做垃圾收集,一些丢弃的常量和无用的类被收集起来。
如何判断一个常量是否被废弃?
看看引用计数就知道了。如果没有对象引用该常量,说明该常量已经被放弃,可以回收。
如何判断一门课没用?
有三种情况:
A.该类的所有实例都已被回收。
加载这个类的类加载器已经被回收了。
C.这个类对应的java.lang.Class对象在任何地方都没有被引用,这个类的方法在任何地方都不能被反射访问。
如何回收?
理论上有4种算法:
标记清除算法
复制算法
标记排序算法
世代收集算法
实现有5种收集器:
后记
内存溢出:系统无法再分配您需要的空间。例如,不能在堆中为新对象分配内存,并且当堆栈已满时,不能将新的堆栈帧放入堆栈。
内存泄漏:内存被一个对象占用而不返回,称为内存泄漏。
以上是对JVM中垃圾收集机制的详细解释。更多相关问题请访问PHP中文网:JAVA视频教程。以上是JAVA虚拟机(JVM)的详细介绍(3)3354的垃圾收集机制的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。