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

目录
相关文章
Java CompletableFuture:allOf等待所有异步线程任务结束(4)
Java CompletableFuture:allOf等待所有线程任务结束(4) private void method() throws ExecutionException, InterruptedExcept...
6563 0
|
10月前
|
JSON 人工智能 算法
探索大型语言模型LLM推理全阶段的JSON格式输出限制方法
本篇文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
1231 48
|
云安全 SQL 安全
盘点分析2024上半年网络攻击趋势
2024年上半年,随着数字化进程加速,网络安全问题愈发凸显。网络攻击频发,影响广泛。APT攻击持续,境外团伙重点针对广东等地的信息技术、政府及科研机构;勒索软件采用“双重勒索”策略,危害加剧;DDoS攻击与Web攻击频次显著提升。互联网服务、政府及科研机构为主要受害对象,其他行业亦受影响。相较2023年,攻击更加多样与频繁。企业需强化密码安全、网络防护,及时更新软件补丁,并定期备份数据,以抵御不断演进的网络安全威胁。
|
小程序
微信小程序App()方法与getApp()方法
微信小程序App()方法与getApp()方法
876 0
微信小程序App()方法与getApp()方法
|
监控 Java Linux
linux下监控java进程 实现自动重启服务
linux下监控java进程 实现自动重启服务
|
Shell 应用服务中间件 开发工具
bash: vi: command not found
bash: vi: command not found
|
算法 Java C++
【Java】深入理解Java中的Native关键字
【Java】深入理解Java中的Native关键字
549 0
|
Java 芯片
Mac Idea卡顿、慢解决方案 限制jvm也没有用【超实用】
Mac Idea卡顿、慢解决方案 限制jvm也没有用【超实用】
|
Oracle Java 关系型数据库
深入理解JVM系列教程(01) - HotSpot VM
深入理解JVM系列教程(01) - HotSpot VM
370 0
|
XML 开发框架 Java
J2EE——13种规范总结
J2EE——13种规范总结
679 0