System.gc()做了什么?

简介: System.gc()我们都知道是手动垃圾回收,这点无需多说,今天我们来了解一下System.gc()是怎么进行垃圾回收的。

1. System.gc()

System.gc()我们都知道是手动垃圾回收,这点无需多说,今天我们来了解一下System.gc()是怎么进行垃圾回收的。

System.gc()内部调用了 Runtime.getRuntiom

publicstaticvoidgc() {
Runtime.getRuntime().gc();
}


在往深一层则是本地方法了

publicnativevoidgc();



System.gc()会执行FullGC,对新生代和老年代进行回收

注意: 此时垃圾回收线程可能并不会立即执行

证明:

packagecom.zy.study14;
/*** @Author: Zy* @Date: 2021/12/29 11:13* 测试system.gc()方法*/publicclassSystemGcTest {
publicstaticvoidmain(String[] args) {
newSystemGcTest();
// 告知垃圾回收器执行垃圾回收,当并不一定立刻执行// 证明如下: 如果执行了就会执行finalize方法,否则程序结束,垃圾回收线程也不会执行System.gc();
// 立刻执行对象的finalize方法//System.runFinalization();    }
@Overrideprotectedvoidfinalize() throwsThrowable {
super.finalize();
System.out.println("执行了finalize方法");
    }
}



以下五种情况测试System.gc对对象的回收,同时验证垃圾回收算法的回收。

System.gc对对象的回收情况:

packagecom.zy.study14;
/*** @Author: Zy* @Date: 2021/12/29 11:30* 测试垃圾回收对象* -XX:+PrintGCDetails 打印gc细节*/publicclassSystemGcObjectTest {
publicvoidtest1(){
// 栈中有引用不会回收byte[] buffer=newbyte[10*1024*1024];
System.gc();
    }
publicvoidtest2(){
// 将引用置空,此时可以回收byte[] buffer=newbyte[10*1024*1024];
buffer=null;
System.gc();
    }
publicvoidtest3(){
// 代码块中引用并没有被覆盖,局部变量表中深度为2,第一个变量为this,第二个仍然为buffer,有该引用,所以不会被回收        {
byte[] buffer=newbyte[10*1024*1024];
        }
System.gc();
    }
publicvoidtest4(){
// 代码块中buffer引用被被覆盖,局部变量表中深度为2,第一个变量为this,第二个buffer被覆盖为value,引用置空,所以被回收        {
byte[] buffer=newbyte[10*1024*1024];
        }
intvalue=10;
System.gc();
    }
publicvoidtest5(){
// 引用置空 会被回收test1();
System.gc();
    }
publicstaticvoidmain(String[] args) {
SystemGcObjectTestsystemGcObjectTest=newSystemGcObjectTest();
systemGcObjectTest.test1();
    }
}



通过对打印的gc信息可以观察到是否符合该方法中描述的回收情况,同时可以结合jclasslib查看局部变量表引用信息.

方法1,2,5都是比较简单的

比较复杂的就是3和4

针对3来说:

局部变量表的深度为2,但是变量表里只显示this对象,索引为1的仍然是代码块中的buffer引用.所以不会回收.

目录
相关文章
|
6月前
|
Java
JVM打印GC信息
JVM打印GC信息
|
7月前
Cannot request memory (Xms 65536 kb, Xmx 270336 kb) from system for job test, sleep for 60 secs and
Azkaban任务因内存不足持续运行,日志显示无法申请65536kb至270336kb内存。系统要求至少3GB内存,但当前executor节点内存低于此阈值。解决方案包括释放内存、增加内存或关闭内存检查(通过在`commonprivate.properties`设置`memCheck.enabled=false`)。
40 5
|
7月前
|
存储 算法 Java
JVM(垃圾回收机制 --- GC)
JVM(垃圾回收机制 --- GC)
85 5
调用 System.gc() 后究竟发生了什么?
调用 System.gc() 后究竟发生了什么?
|
算法 Java API
Java虚拟机System.gc()解析
对于Java语言来说是不用刻意手动去释放内存,同时,也尽可能不需要手动去干预Java虚拟机的GC行为。在本篇文章中,我们试图从多个方面去解析有关System.gc()API调用的最常见问题。希望对需要了解这块技术的朋友有所帮助。
206 0
|
Java
JVM-08垃圾收集Garbage Collection【GC常用参数】
JVM-08垃圾收集Garbage Collection【GC常用参数】
72 0
|
存储 监控 算法
System.gc()与Runtime.gc()的区别
System.gc()与Runtime.gc()的区别
205 0
|
Java
Java Finalize和System.gc方法
Java Finalize和System.gc方法
112 0
|
消息中间件 Java 测试技术
JVM相关 - 深入理解 System.gc()
本文基于 Java 17-ea,但是相关设计在 Java 11 之后是大致一样的 我们经常在面试中询问 System.gc() 究竟会不会 立刻 触发 Full GC ,网上也有很多人给出了答案,但是这些答案都有些过时了。本文基于最新的信息 Java 的下一个即将发布的 LTS 版本 Java 17(ea)的源代码,深入解析 System.gc() 背后的故事。
System类以及垃圾回收gc()使用详情
System类以及垃圾回收gc()使用详情