Java垃圾回收(java GC)

Java垃圾回收(java GC)
guibin.beijing@gmail.com

[size=medium]GC的阶段[/size]
对每个对象而言,垃圾回收分为两个阶段:finalization和reclamation。
[list]
[*]finalization: 指运行这个对象的finalize的方法。
[*]reclamation: 回收被这个对象使用的内存。
[/list]

[size=medium]GC的过程的基本步骤[/size]
[list]
[*]首先确认对象是不可达的,即将被回收。
[*]其次,如果对象有finalize方法,那么对象被添加进finalization queue中;然后在某个时间点finalize方法被调用以释放finalize中的资源。
[*]最后,回收对象占用的内存。
[/list]

[size=medium]关于finalize方法的问题[/size]
[list]
[*]finalize方法使得GC过程做了更多的事情,增加的GC的负担。
[*]如果某个对象的finalize方法运行时间过长,它会使得其他对象的finalize方法被延迟执行。
[*]finalize方法中如果创建了strong reference引用了其他对象,这会阻止此对象被GC。
[*]finalize方法有可能以不可确定的顺序执行(也就是说要在安全性要求严格的场景中尽量避免使用finalize方法)。
[*]不确保finalize方法会被及时调用,也许程序都退出了,但是finalize方法还没被调用。
[/list]

[size=medium]对象引用的类型[/size]
[list]
[*]Reference(or named Strong Reference):普通类型的引用。
[*]SoftReference:被这种引用指向的对象,如果此对象没要再被其他Strong Reference引用的话,可能在任何时候被GC。虽然是可能在任何时候被GC,但是[b]通常是在可用内存数比较低的时候,并且在程序抛出OutOfMemoryError之前才发生对此对象的GC[/b]。SoftReference通常被用作实现Cache的对象引用,如果这个对象被GC了,那么他可以在任何时候再重新被创建。另外,根据JDK文档中介绍,实际JVM的实现是鼓励不回收最近创建和最近使用的对象。
[*]WeakReference:如果一个被WeakReference引用的对象,当没要任何SoftReference和StrongReference引用时,立即会被GC。和SoftReference的区别是:WeakReference对象是被eagerly collected,即一旦没要任何SoftReference和StrongReference引用,立即被清楚;而只被SoftReference引用的对象,不回立即被清楚,只有当内存不够,即将发生OutOfMemoryError时才被清除,而且是先清除不常用的。SoftReference适合实现Cache用。
[*]PhantomReference(幻影引用):当没有StrongReference,SoftReference和WeakReference引用时,随时可被GC。通常和ReferenceQueue联合使用,管理和清除与被引用对象(没有finalize方法)相关的本地资源。
[/list]

[size=medium]衡量GC的指标(GC Metrics)[/size]
[list]
[*]Throughput(吞吐量):所有没有花在执行GC上的时间占总运行时间的比重。
[*]Pauses(暂停):当GC在运行时程序的暂停次数。或者是在感兴趣的暂停次数中,暂停的平均时长和最大时长。
[*]Footprint(足迹?):当前使用的堆内存大小。
[*]Promptness(及时性):不再使用的对象多久能被清除掉并释放其内存。
[/list]

[size=medium]通用GC算法[/size]
Java所使用的所有的GC算法都是通用GC算法概念的变种。
通用GC算法的假设:
[list]
[*]最近创建的对象很可能很快就不可达了(unreachable,即可被回收了),比如方法内部声明的本地变量,当程序运行出了本地变量的作用范围后,本地变量引用的对象就很快不可达了。
[*]一个对象保持可达(reachable)的越久就越不可能被回收。
[/list]
在Java GC中,对象被划分为generations(代)或spaces(空间)。Java把对象分为young(年轻代),tenured(年老代)和perm(永久代)。在GC过程中,对象从一个space(空间)移动到另一个space。

[size=medium]Object Spaces(对象空间)[/size]
[list]
[*]Young:年轻代中保存着刚创建的对象,这个代中的对象能够“minor” or “major” 收集中被回收。
[*]Tenured:年老代中保存着从年轻代中幸存下来的对象,只能够在“major”中被回收。
[*]Perm:永久代中保存着JVM所需的对象,比如Class对象和Method对象,以及他们的字节码和内部字符串等。对Perm中的对象GC意味着所有的Class都被卸载了。
[/list]
每块空间的大小由当前的对内存大小决定,并且能够在运行时改变。每个空间之间的关系如下图所示:
[img]http://dl.iteye.com/upload/attachment/527305/3500d000-a5f2-3c6f-b3e1-8be0deb71c72.png[/img]

[size=medium]Young Spaces(年轻空间)[/size]
[list]
[*]Eden space:存储自从上次GC完毕之后新创建的对象,除了属于Perm的对象。当minor collection发生时,Eden space中的对象或者GC清理掉,或者被移到survivor space。
[*]Survivor spaces:这个空间中存储的是自从上次GC幸存下来的young object。在minor GC中,这些对象或者被GC清理掉,或者被移到另外一个survivor空间中。
[/list]

[size=medium]Minor collections和Major collections[/size]
[list]
[*]Minor collection当young space被占满时执行。它比major collections快,因为minor collection仅仅检查major collection相应的一个子集对象。minor collection比major collection发生的频率高。
[*]Major collection当tenured space被占满时执行。他会清理tenured和young。
[/list]

[size=medium]GC运行的三种方式[/size]
在java5和java6中有4中垃圾回收的算法,有一种算法将不再支持,剩余的三种垃圾回收算法是:[b]serial[/b], [b]throughput[/b] and [b]concurrent low pause[/b]。
[list]
[*]Stop the world(停止所有程序的方式):在这种方式运行的GC,在GC完成前,JVM中的所有程序都不允许运行。Serial collector此时做minor和major收集。Throughput collector此时做major collector。
[*]Incremental(增量运行方式):目前没要Java GC算法支持这种运行方式。GC以这种方式运行时,GC允许程序做一小段时间的工作,然后做垃圾回收工作。
[*]Concurrent(并行运行):Throughput collector此时做minor collect,Concurrent low pause collector此时做minor和major收集。在这种运行方式下,GC和程序并行的运行,因此程序仅仅被短暂的暂停。
[/list]

[size=medium]GC算法[/size]
[list]
[*]Serial算法: 使用-XX:+UseSerialGC开启此算法的GC。GC使用和应用程序相同的线程去做minor collection和major collection。
[*]Throughput:使用-XX:+UseParallelGC开启此算法GC。GC使用多线程去做minor collection以减少程序停止的时间。但是对于major collection,还是使用同程序相同的线程去做。当具有多核cpu时,并且程序有大量的短生命周期的对象时,并且对程序停顿时间不限制时较好。
[*]Concurrent Low Pause: 使用-XX:+UseConcMarkSweepGC开启此算法GC。使用多线程去做minor和major collection。当具有多核cpu,并且程序有大量的长生命周期的对象,并且对程序停顿时间有限制时,效果较好。
[/list]

[size=medium]什么时候发生GC[/size]
GC发生的时刻受堆内存大小的影响。如果堆内存小,GC会执行的很快,但是又会很快的被填满,因此GC比频繁;如果堆内存很大,GC会执行的较慢,而且不会很快被填满,因此执行的比较频率比较低。

[size=medium]基本的GC调试[/size]
throughput goal -XX:GCTimeRatio=n: 表示花费总时间百分之多少的CPU时间去运行程序。
maximum pause time goal -XX:MaxGCPauseMillis=n:每次GC时程序暂停最多多少毫秒。
footprint goal:如果其他目标都达到了,那么首先减少heap size,直到前两个goal不再满足,然后再慢慢增加。直到满足前面两个goal。
-Xms=n (starting) and -Xmx=n (maximum) heap size,这两个参数应该都很熟悉,就是JVM使用的最小堆内存数和最大堆内存数。
-XX:MinHeapFreeRatio=n, -XX:MaxHeapFreeRatio=n:最小和最大的空闲堆内存和被使用堆内存的比例。当空闲堆内存比例小于MinHeapFreeRatio时,内存空间开始扩展。当空闲堆内存比例大于MaxHeapFreeRatio时,内存空间开始减小。
-XX:NewSize=n, -XX:MaxNewSize=n:默认的young space的大小(包括eden + survivor 1 + survivor 2)。
-XX:NewRatio=n:young和tenured的比例。
-XX:SurvivorRatio=n:每个survivor space 和 eden之间的比例。
-XX:MaxPermSize=n:perm的最大size。
-XX:TargetSurvivorRatio=n:每次GC之后幸存下来的空间的目标比例。
-XX:+DisableExplicitGC:当此参数打开时,在程序中调用System.gc()将会不起作用。默认是off。
-XX:+ScavengeBeforeFullGC:当打开此参数时,在每次major collection时先执行一次minor collection。默认打开。
-XX:+UseGCOverheadLimit:当打开此参数时,如果总运行时间的98%的时间都在做GC,则抛出OutOfMemmoryError。默认打开。

参考资料:[url]http://java.ociweb.com/mark/other-presentations/JavaGC.pdf[/url]

Guibin
Java8 默认垃圾回收器(GC) 一 概述 GC(Garbage Collection),在程序运行过程中内存空间是有限的,为了更好的的使用有限的内存空间,GC会将不再使用的对象清除然后将其所占用的内存释放出来。 触发GC的条件: 1. 程序调用System.gc的时候触发GC。 /** * Runs the garbage collector. * <p> * Calling the <code>gc</code> method suggests that 阅读详情

相关推荐

Java GC垃圾回收机制

文章目录一、Java GC二、GC 回收的对象三、GC 回收过程1、图解分代内存1.1 年轻代1.2 年老代1.3 永久代2、图解 GC 回收过程对象分配策略3、Minor GC 和 Full GC 本文内容基于目前使用最广泛的 HotSpot JVM。 参考书籍:《深入理解Java虚拟机:JVM高级特性与最佳实践》–周志明 一、Java GC Java 垃圾回收机制是由 GC(Garbage...

媛测 696

频繁GC问题原因总结

此外,合理的内存管理和代码优化也是减少频繁垃圾回收的关键。使用不合理的垃圾回收策略:Java提供了不同的垃圾回收器,每个回收器适用于不同的场景。内存分配过多:如果应用程序频繁地分配新的对象而不释放旧的对象,堆内存将快速用满,触发频繁的垃圾回收。堆内存不足:如果为Java应用程序分配的堆内存不足以容纳应用程序所需的数据,垃圾回收将更频繁地运行,以尝试释放未使用的内存。使用了大量的弱引用或软引用:虽然弱引用和软引用对于某些应用程序非常有用,但过度使用它们可能导致垃圾回收更频繁,因为这些引用的对象更容易被回收。

Artisan_w 1747

Java面试题:GC垃圾回收机制

GC垃圾回收(Garbage Collection的简称):当需要分配的内存空间不再使用的时候,JVM将调用垃圾回收机制来回收不再使用的内存空间。系统级线程跟踪存储空间的分配情况。并在JVM的空闲时,检查并释放那些可被释放的存储空间。在程序运行中会不断地创建很多的对象,这些对象数据会占用系统内存,如果得不到有效的管理,内存的占用会越来越多,甚至会出现内存溢出的情况,所以需要对内存进行合理地释放,这个时候就要用到GC垃圾回收机制。

m0_74825699的博客 1548

java 不断gc原因_java垃圾回收器不停的做GC,怎么回事?

最近写了个服务器小程序,开的线程比较多,大约在1000左右吧,高峰期会更多。今天忽然不停的GC,觉得很纳闷,不知道是怎么一回事,应该如何去做优化?GC日志如下:一次GC的时间间隔不到一秒,每次GC的时间也不到一秒。{Heap before GC invocations=306 (full 0):par new generation total 511936K, used 511872K [0x00...

weixin_39847437的博客 869

Java 垃圾回收(GC)机制与算法详解

垃圾回收(Garbage Collection,GC)是 Java 自动内存管理的核心机制,负责。,避免内存泄漏和手动内存管理的复杂性。理解 GC 机制是 Java 性能优化的关键一步!整理阶段: 存活对象向一端移动。标记阶段: 标记所有可达对象。清除阶段: 回收未标记对象。存活对象复制到另一块。

记录学习的过程 1495

java面试-GC垃圾回收机制

JVM 中的堆,一般分为三大部分:新生代、老年代、永久代。

Ase5gqe的博客 866

JVM频繁Full GC问题的排查与解决方案

堆内存(Heap Memory):这是Java对象的主要存储区域,分为年轻代(Young Generation)和老年代(Old Generation)。栈内存(Stack Memory):每个线程的栈用于存储局部变量和方法调用的上下文。永久代(PermGen)/元空间(Metaspace):存储类的元数据。在JDK 8之前是永久代,之后被元空间取代。

lssffy的博客 4392

Java 垃圾回收(GC)

前言==垃圾回收(Garbage Collection,简写为 GC)可能是虚拟机众多知识点中最为大众所熟知的一个了,也是Java开发者最关注的一块知识点。Java 语言开发者比 C 语言开发者幸福的地方就在于,我们不需要手动释放对象的内存,JVM 中的垃圾回收器(Garbage Collector)会为我们自动回收。但是这种幸福是有代价的:一旦这种自动化机制出错,我们又不得不去深入理解 GC 回收机制,甚至需要对这些"自动化"的技术实施必要的监控和调节。

2501_90389279的博客 1026

java System.gc() 频繁垃圾回收

通过依赖 JVM 自动管理垃圾回收,分析和优化内存使用,并调整 JVM 参数,可以有效提升应用程序的性能和稳定性。1. 误解垃圾回收机制**: Java 的垃圾回收器是自动管理的,通常不需要手动干预。3. 不必要的调用**: 某些情况下,开发者可能会错误地认为手动调用 System.gc()` 可以立即释放内存,从而避免 OutOfMemoryError。如果在代码中发现频繁调用 System.gc()` 的情况,建议重构代码,删除这些调用,改为依赖 JVM 自动进行垃圾回收。

nbspzs的专栏 784

Java 详解(JVM) 垃圾回收机制原理(csdn)————程序.pdf

Java 详解(JVM) 垃圾回收机制原理(csdn)————程序

QuestaSim使用Xilinx库的设置

安装QuestaSim

miracle_eicont的专栏 3407

GC.Collect()

GC.Collect()其功能就是强制对所有代进行垃圾回收 垃圾的产生 class Person{ String name; //人员的姓名 int age; //人的年龄 public void tell(){ System.out.println("姓名:" + name + "、年龄:" + age); } } public class JavaDemo{ public static void main(String args[]){ Person per1 =

Ydi1115的博客 1万+

别再为电路自激发愁了:手把手教你用吸波材料搞定微波腔体谐振(附HFSS仿真设置)

本文详细解析了微波腔体谐振问题的工程解决方案,重点介绍了吸波材料的选型、安装工艺及HFSS仿真设置。通过实际案例和计算工具,帮助射频工程师有效抑制腔体自激,提升系统稳定性。特别适用于35GHz毫米波雷达等高频电路设计场景。

weixin_42662293的博客 383

Java面试--垃圾回收机制(GC)

面试题:垃圾回收机制(阿里、三七互娱、商汤、大疆面试题) 面试题:jvm查看gc命令(蘑菇街面试题) 面试题:如果频繁老年代回收怎么分析解决(蚂蚁金服面试题) 面试题:gc的Gengerational collector(携程面试题) 一、要回收哪些区域 在JVM内存模型中,有三个是不需要进行垃圾回收的:程序计数器、JVM栈、本地方法栈。因为它们的生命周期是和线程同步...

小刺猬 1万+

FOFA奇技淫巧:从搜索语法到实战场景的深度挖掘

本文深入探讨了FOFA搜索语法在网络空间测绘中的高效应用,从基础语法到实战场景的深度挖掘。通过渗透测试、威胁狩猎、资产发现等实际案例,展示了如何利用FOFA精准定位目标系统、识别蜜罐、追踪威胁,并提供了合规使用指南和性能优化技巧,助力安全工作者提升效率。

weixin_32428571的博客 235

用Python搞定超效率SBM模型:从数据清洗到结果可视化全流程指南

本文详细介绍了如何使用Python实现超效率SBM模型,从数据清洗到结果可视化的全流程指南。超效率SBM模型作为传统DEA的进化版本,能有效处理非期望产出(如环境污染)并对高效单元进行精细排序。通过实战案例和代码示例,帮助读者掌握这一先进模型的Python实现技巧,提升效率评估的准确性和可视化效果。

silver的专栏 649

Java中GC垃圾回收

垃圾回收(Garbage Collection, GC)是Java自动内存管理的核心机制,负责回收不再使用的对象占用的内存。其核心目标是识别并清理“垃圾对象”(即不可达对象),避免内存泄漏。通过“GC Roots”作为起点,向下搜索引用链。如果对象与GC Roots之间没有引用链相连,则判定为可回收。

qq_40464334的博客 587

pcle接口详解&用途说明

它原来的名称为“3GIO”,由英特尔在2001年提出。pcel x16插槽 用途用于显卡、RAID阵列卡,向下兼容PCIE x1/x4/x8/x16。(PCIE x16插槽长89mm,有164根针脚,靠主板外侧端有一卡口,将16x分为前后两组,短插槽有22根针脚,主要用于供电,长插槽142根,主要用于数据传输,具有16通道所带来的高带宽)PCI-E x8插槽插槽用途:全长56mm,有98根针脚,与PCI-E x16比较,主要是数据针脚减少至76根,短的供电针脚仍然是22针脚。

qq_43289307的博客 1万+

Java中的垃圾回收(GC)

垃圾回收,英文名Garbage Collection(GC). Java进程在启动后,会创建垃圾回收线程,来对内存中无用的对象进行回收. 目录 1. 那么问题来了,什么是垃圾? 2. 什么是垃圾回收? 3. 什么时候回收垃圾? 4. 判断是否为垃圾的算法 4.1 引用计数法 4.2 可达性分析算法 5. 回收的区域 5.1 方法区的gc 5.2 堆的gc 6. 垃圾回收算法 6.1 标记清除算法(老年代的回收算法) 6.2 复制算法(新生代的回收算法) 6.3 标记整理算法.

weixin_43939602的博客 2438

mmpretrain学习笔记

(4)数据集路径 data_root=‘data/imagenet’–》data_root=‘data/Fruits Dataset/images’(7)适当的修改num_workers、epochs、batch_size、lr等。3、训练优化 :梯度下降算法、学习率参数、训练总轮次、学习率变化策略等。my_resnet18_8xb32_in1k.py 完整的配置文件。(6)split=‘train’、split='val’注释掉。2、数据:数据集划分、数据文件路径、批大小、数据增强策略等。

吃葡萄不吐葡萄皮 936

STM32 cubeMX配置串口重定向

这篇文章主要讲解什么是串口重定向,为什么要串口串口重定向。使用printf函数和上位机通信是非常的方便的。希望大家都能够掌握。

m0_49476241的博客 4572

Java 垃圾回收(GC)浅析

本文全面解析了 Java 垃圾回收(GC)机制,涵盖其定义、必要性、工作原理及常见算法,如标记-清除、复制和分代收集。详细介绍了多种 GC 收集器及其适用场景,并探讨了如何通过 GC 日志和监控工具优化性能。此外,本文还列举了内存泄漏检测与预防的方法,以及相关的知识点,如弱引用和 JIT 编译器优化,帮助读者理解并有效管理 Java 应用的内存使用,提升程序性能。

进一步有进一步的欢喜~ 1024

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java GC 垃圾回收

避免频繁创建临时对象合理使用StringBuilder及时释放大对象引用避免在循环中创建对象。

Nick_LYJ的博客 482

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java——垃圾回收(GC)详解

GC是JVM的自动内存管理机制,负责回收不再使用的对象(即垃圾)占用的内存。

m0_62669698的博客 1365

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java 垃圾回收器 GC

看过的觉得讲的比较好的文章,再总结下自己的想法

Javazzc123的专栏 642
上一篇: JAVA 7 新特性介绍(一)概述
下一篇: 错误和异常的区别(Error vs Exception)
Guibin
博客等级 码龄23年 45粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值