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引用.所以不会回收.

目录
相关文章
|
5月前
|
Java
JVM打印GC信息
JVM打印GC信息
|
6月前
|
Java 开发者 iOS开发
8 种 Java- 内存溢出之二 -GC overhead limit exceeded
8 种 Java- 内存溢出之二 -GC overhead limit exceeded
调用 System.gc() 后究竟发生了什么?
调用 System.gc() 后究竟发生了什么?
|
算法 Java API
Java虚拟机System.gc()解析
对于Java语言来说是不用刻意手动去释放内存,同时,也尽可能不需要手动去干预Java虚拟机的GC行为。在本篇文章中,我们试图从多个方面去解析有关System.gc()API调用的最常见问题。希望对需要了解这块技术的朋友有所帮助。
193 0
|
算法 Java 程序员
|
存储 监控 算法
System.gc()与Runtime.gc()的区别
System.gc()与Runtime.gc()的区别
194 0
|
Java
Java Finalize和System.gc方法
Java Finalize和System.gc方法
106 0
|
Java
GC是什么? 为什么要有GC?
GC是垃圾收集的意思(Gabage Collection)
191 0
|
Java 程序员 Android开发
GC是什么?为什么要有GC?
GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
2318 0
|
消息中间件 Java 测试技术
JVM相关 - 深入理解 System.gc()
本文基于 Java 17-ea,但是相关设计在 Java 11 之后是大致一样的 我们经常在面试中询问 System.gc() 究竟会不会 立刻 触发 Full GC ,网上也有很多人给出了答案,但是这些答案都有些过时了。本文基于最新的信息 Java 的下一个即将发布的 LTS 版本 Java 17(ea)的源代码,深入解析 System.gc() 背后的故事。