0

0

浅析Java中的GC垃圾回收器的意义及与GC的交互

高洛峰

高洛峰

发布时间:2017-01-17 15:43:34

|

1119人浏览过

|

来源于php中文网

原创

对象是使用new创建的,但是并没有与之相对应的delete操作来回收对象占用的内存。当我们完成对某个对象的使用时,只需停止对该对象的引用:将我们的引用改变为指向其他对象或指向null;或者从方法中返回,使得该方法的局部变量不复存在,从而使得对这些局部变量的引用变为不指向任何对象。不再被引用的对象被称为垃圾(garbage),查找并回收这些对象的过程叫做垃圾回收(garbage collection) o

  Java虚拟机利用垃圾回收来保证被引用的对象将会在内存中保留,同时会释放在执行代码中通过任何引用都不可达的对象所占用的存储空间。这是一种强保证—如果顺着从根引用(即在执行代码中可以直接访问的引用)开始的引用链可以到达某个对象,那么该对象就不会被回收。

  简言之,当我们从任何可执行代码都无法到达某个对象时,它所占用的空间就可以被回收。注意,我们用的是“可以”这个词,因为内存空间是否回收是由垃圾回收器来决定的,通常情况下,只有需要更多的内存空间或者为了避免发生内存溢出时,垃圾回收器才会运行。但是程序可能在没有发生内存溢出,甚至在没有接近内存溢出的时候就退出了,所以可能根本就不需要执行垃圾回收。在当前执行的所有方法中,如果所有变量都不包含指向某个对象的引用,并且从这些变量出发,顺着引用链在所有域或数组元素中也找不到对这个对象的引用,那么我们就说这个对象是“不可达的”。

  垃圾回收意味着我们永远不必担心出现虚悬引用(dangling reference)。在那些可以由程序员直接控制何时删除对象的系统中,程序员可以删除某个其他对象还在引用的对象,如果程序员删除了这样的对象,那么还在引用被删除对象的引用就会变为虚悬的,因为它们引用的是操

  作系统认为是可分配的内存空间(但实际上该空间已经被释放)。系统可以将这个可分配空间分配给新的对象,这样那些原来指向该空间的引用实际上得到的对象与它们所预期的就完全不同了。在这种情况下,当程序使用存储于这个空间中的值并将其当作它们并不属于的对象来操作时,就可能会引起不可预知的灾难。垃圾回收为我们解决了虚悬引用问题,因为所有仍然被引用的对象都不会被当作垃圾回收,所以它们所占用的空间也不可能被释放。垃圾回收同时还解决了意外地多次删除同一个对象的问题—这种问题也会引发灾难。 垃圾对象的回收并不需要我们的介入,但是回收垃圾会占用一定的系统资源。大量对象的创建和回收对时间关键的应用会产生干扰,因此我们在设计这种系统时,要审慎地处理创建的对象数量,以便减少要回收的垃圾数量。

立即学习Java免费学习笔记(深入)”;

  垃圾回收并不能保证内存总是会有空间来创建新对象。例如,如果我们不停地创建对象,并把这些对象置于某个列表中,那么当没有足够的空间来创建新对象,同时也没有任何未被引用的对象时,就无法再创建新对象了。如果我们让上述列表保持对不再需要的对象的引用,那么就会造成内存泄漏。垃圾回收解决了很多(但并非全部)的内存分配问题。


与垃圾回收器交互
尽管Java语言本身没有任何显式地处置空闲对象的方法,我们还是可以通过直接调用垃圾回收器来寻找不再使用的对象。Runtime类以及system类中的一些便捷方法使得我们可以调用垃圾回收器,请求运行所有待运行的终结器,或者查看当前的内存状态:

  .public void gc Q:该方法请求Java虚拟机花费精力去回收不再使用的对象,以便能够重用这些对象所占据的内存。

  .public void runFinalization():该方法请求Java虚拟机花费精力去运行如下的终结器:那些已经被发现是不可达的,但是其终结器还未执行的对象。

  “public long freememory():返回系统内存可用字节的估测数。

微信 WeLM
微信 WeLM

WeLM不是一个直接的对话机器人,而是一个补全用户输入信息的生成模型。

下载

  ·public long total Memory ():返回系统内存的总字节数。

  .public long maxmemoryo:返回Java虚拟机可用的系统内存的最大字节数。如果操作系统对Java虚拟机没有内存使用上的限制,将返回Long . MAX-VALUE. Java中没有任何用来设置系统最大内存的方法,通常,Java虚拟机是通过命令行或者其他配置选项来设置这个值的。

  要调用上述方法,我们需要通过静态方法Runtime.getRuntime来获取对当前Runtime对象的引用。而system类支持静态的gc和runFinalization方法,它们将调用当前Runt-ime对象上的相应方法;换句话说,System.gc()与Runtime.getRuntime().gc()方法是等价的。

  在调用Runtime.gc()方法时,垃圾回收器可能并不能释放出任何额外的内存,因为可能并没有垃圾可以回收,而且并非所有的垃圾回收器都可以按需发现可回收对象。因此调用垃圾回收器可能不会产生任何效果。然而,在创建大量的对象之前,特别是在垃圾回收的开销可能会对其造成影响的时间关键的应用中,调用Runtime.gc()方法还是可取的。执行它有两点潜在的好处:第一点是我们在运行应用程序之前可以得到尽可能多的内存,第二点是我们可以降低执行任务期间垃圾回收器运行的可能性。下面的方法在运行时刻积极地释放了可以释放的所有空间:

public static vo记ful1GC(){
 
Runtime rt=Runtime.getRuntime();
 
long isFree=rt.freeMemory ();
 
long wasFree;
 
do{
 
wasFree=isFree;
 
rt.runFinalization ();
 
rt.gc();
 
isFree二rt.freeMemory();
 
}while (isFree>wasFree);
 
}

  该方法在不断地循环,通过连续调用runFinalization和gc方法,freememory的值不断地增大。当空闲内存的数量不再增大时,该方法的循环也就结束了。

  我们通常不需要调用runFinalization方法,因为finalize方法是由垃圾回收器异步调用的。在某些情况下,例如某项可以由finalize方法回收的资源被耗尽时,通过调用run-Finalization来强制执行尽可能多的终结才会显得有用。但是请记住,我们并不能保证任何等待被终结的对象都在使用这项资源,因此runFinalization可能不会有任何作用。

  fullGc方法对于大多数应用程序来说都显得过于激进。在需要强制进行垃圾回收的特殊情况下,对system.gc方法的单次调用所收集到的垃圾即便不是全部的可利用垃圾,也是其中的绝大部分,因此重复调用会降低垃圾回收的产出率,而且在许多系统中,这些重复调用是毫无产出的。

更多浅析Java中的GC垃圾回收器的意义及与GC的交互相关文章请关注PHP中文网!

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

28

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

8

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

31

2026.01.26

npd人格什么意思 npd人格有什么特征
npd人格什么意思 npd人格有什么特征

NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

3

2026.01.26

windows安全中心怎么关闭 windows安全中心怎么执行操作
windows安全中心怎么关闭 windows安全中心怎么执行操作

关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

5

2026.01.26

2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】
2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】

铁路12306提供起售时间查询、起售提醒、购票预填、候补购票及误购限时免费退票五项服务,并强调官方渠道唯一性与信息安全。

35

2026.01.26

个人所得税税率表2026 个人所得税率最新税率表
个人所得税税率表2026 个人所得税率最新税率表

以工资薪金所得为例,应纳税额 = 应纳税所得额 × 税率 - 速算扣除数。应纳税所得额 = 月度收入 - 5000 元 - 专项扣除 - 专项附加扣除 - 依法确定的其他扣除。假设某员工月工资 10000 元,专项扣除 1000 元,专项附加扣除 2000 元,当月应纳税所得额为 10000 - 5000 - 1000 - 2000 = 2000 元,对应税率为 3%,速算扣除数为 0,则当月应纳税额为 2000×3% = 60 元。

12

2026.01.26

oppo云服务官网登录入口 oppo云服务登录手机版
oppo云服务官网登录入口 oppo云服务登录手机版

oppo云服务https://cloud.oppo.com/可以在云端安全存储您的照片、视频、联系人、便签等重要数据。当您的手机数据意外丢失或者需要更换手机时,可以随时将这些存储在云端的数据快速恢复到手机中。

40

2026.01.26

抖币充值官方网站 抖币性价比充值链接地址
抖币充值官方网站 抖币性价比充值链接地址

网页端充值步骤:打开浏览器,输入https://www.douyin.com,登录账号;点击右上角头像,选择“钱包”;进入“充值中心”,操作和APP端一致。注意:切勿通过第三方链接、二维码充值,谨防受骗

7

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
php-src源码分析探索
php-src源码分析探索

共6课时 | 0.5万人学习

Golang云原生架构师课程
Golang云原生架构师课程

共49课时 | 3.1万人学习

Golang基础入门到精通(第二季)
Golang基础入门到精通(第二季)

共49课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号