JVM_垃圾收集器与内存分配策略01

垃圾回收器(GC Garbage Collection)。

  • 那些内存是需要回收的
  • 什么时候进行回收
  • 如何回收

有哪些内存需要回收,首先程序计数器、虚拟机栈、本地方法栈这些的生命周期和线程的生命周期是一样的,栈中栈帧是随着方法的进入和退出而执行着入栈和出栈,他们在内存分配和回收都是具有确定性的,因为在方法结束或者线程结束时,内存自然就跟着回收了,所以他们不需要过多的考虑回收的问题。
但是Java堆和方法区则不一样,因为一个接口他会有多个实现类,这样内存是不一定的,一个方法中多个分支需要的内存也可能不一样,因为我们只有在程序运行期间才会知道要创建那些对象,这部分内存他是动态的分配和回收也是动态的,垃圾收集器所关注的是这部分内存。

对象是否还存在的问题:
堆中放在几乎所有的实例对象,垃圾收集器在对堆进行回收前,第一件事就是判断哪些对象是“活着”,那些对象是“死去”(既不可能再被任何途径使用的对象)。
引用计数算法:
在这里插入图片描述
在这里插入图片描述
根搜索算法:
在这里插入图片描述
在这里插入图片描述
引用:
在jdk1.2之后,Java对引用进行了扩充,分为:强引用(strong reference)、软引用(soft reference)、弱引用(week reference)、虚引用(phantom reference)四种,这四种引用强度依次逐渐减弱。
在这里插入图片描述
在这里插入图片描述
如何判断是否这个对象要被回收:
在根搜索算法不可达的对象,也不是一定要死亡,宣布一个对象死亡,至少要经历两次标记的过程:一是是根搜索后的发现没有与GC Roots相连接的引用链,那它将会被第一次标记且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。
假如被判定为有必要执行finalize()方法,那么这个对象将会被放置在一个名为F-Queue的队列中,并在稍后由一条由虚拟机自动建立的、低优先级的Finalizer线程去执行。
在这里插入图片描述
Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。

  • (1).对象不一定会被回收。
  • (2).垃圾回收不是析构函数。
  • (3).垃圾回收只与内存有关。
  • (4).垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。
    有时当撤消一个对象时,需要完成一些操作。例如,如果一个对象正在处理的是非Java 资源,如文件句柄或window 字符字体,这时你要确认在一个对象被撤消以前要保证这些资源被释放。为处理这样的状况,Java 提供了被称为收尾(finalization )的机制。使用该机制你可以定义一些特殊的操作,这些操作在一个对象将要被垃圾回收程序释放时执行。

要给一个类增加收尾(finalizer ),你只要定义finalize ( ) 方法即可。Java 回收该类的一个对象时,就会调用这个方法。在finalize ( )方法中,你要指定在一个对象被撤消前必须执行的操作。垃圾回收周期性地运行,检查对象不再被运行状态引用或间接地通过其他对象引用。就在对象被释放之前,Java 运行系统调用该对象的finalize( ) 方法。

方法区的回收:
方法区又叫做hotspot虚拟机中的永久代。永久代收集主要回收两部分:废弃常量和无用类。
在这里插入图片描述
在这里插入图片描述

发布了20 篇原创文章 · 获赞 3 · 访问量 1705

猜你喜欢

转载自blog.csdn.net/weixin_43493354/article/details/104907762
今日推荐