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

目录
相关文章
|
网络协议 算法 网络性能优化
TCP滑动窗口、流量控制及拥塞控制详解
TCP滑动窗口、流量控制及拥塞控制详解
|
存储 安全 Cloud Native
Nacos 2.1.0发布,支持特性定制插件
Nacos 全称为 Dynamic Naming and Configuration Service,其目标是更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 诞生于阿里巴巴 2008 年的五彩石项目,在阿里十年双 11 中成长,帮助业务解决微服务的扩展性和高可用问题。
Nacos 2.1.0发布,支持特性定制插件
|
2月前
|
安全 关系型数据库 数据库
我是怎么把 Docker 容器从一台服务器搬到另一台的
本文手把手教你零基础搞定Docker容器迁移:涵盖普通容器镜像打包(commit→save→scp→load→tag)和带Volume数据卷的完整迁移流程,详解备份恢复、路径权限、一致性等避坑要点,实操性强,小白也能一次成功。(239字)
|
存储 缓存 数据库
数据库数据删除策略:硬删除vs软删除的最佳实践指南
在项目开发中,“删除”操作常见但方式多样,主要分为硬删除与软删除。硬删除直接从数据库移除数据,操作简单、高效,但不可恢复;适用于临时或敏感数据。软删除通过标记字段保留数据,支持恢复和审计,但增加查询复杂度与数据量;适合需追踪历史或可恢复的场景。两者各有优劣,实际开发中常结合使用以满足不同需求。
1315 4
|
小程序
微信小程序App()方法与getApp()方法
微信小程序App()方法与getApp()方法
1092 0
微信小程序App()方法与getApp()方法
|
云安全 SQL 安全
盘点分析2024上半年网络攻击趋势
2024年上半年,随着数字化进程加速,网络安全问题愈发凸显。网络攻击频发,影响广泛。APT攻击持续,境外团伙重点针对广东等地的信息技术、政府及科研机构;勒索软件采用“双重勒索”策略,危害加剧;DDoS攻击与Web攻击频次显著提升。互联网服务、政府及科研机构为主要受害对象,其他行业亦受影响。相较2023年,攻击更加多样与频繁。企业需强化密码安全、网络防护,及时更新软件补丁,并定期备份数据,以抵御不断演进的网络安全威胁。
|
设计模式 测试技术
"揭秘!Service层接口之谜:你的项目究竟该不该‘接口化’?一文带你走出设计迷雾!"
【8月更文挑战第11天】在软件开发中,分层设计确保了项目的清晰与可维护性。Service层作为核心,其是否应实现接口一直是热议话题。支持者认为接口能解耦系统、便于测试并提供灵活性;反对者则担心增加复杂度与冗余。通过示例对比直接实现与基于接口的设计,本文探讨了不同场景下的最佳实践,强调设计应根据项目规模与需求权衡,旨在实现架构的平衡。
551 4
|
缓存 Java Apache
常见的 HTTP 状态码分类及说明
这篇文章介绍了常见的HTTP状态码分类及其说明,包括1xx信息响应、2xx成功、3xx重定向、4xx客户端错误和5xx服务器错误,并提供了一个使用Apache HttpClient进行HTTP POST请求的Java代码示例。
|
Python
【Python笔记】pip intall -e命令:让你的工程直接使用开源包的源码,可断点调试,修改源码!
【Python笔记】pip intall -e命令:让你的工程直接使用开源包的源码,可断点调试,修改源码!
2407 0
|
监控 前端开发 网络协议
如何使用Spring Boot实现WebSocket通信
如何使用Spring Boot实现WebSocket通信