jvm是java虚拟机吧,简述java虚拟机的垃圾回收机制

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: