简单GC具体操作参数查看

代码:

public class HeapTest {
    private static final int _1M = 1024 * 1024;

    public static void main(String[] args) throws InterruptedException {
        System.gc();
        byte[] byte1 = new byte[2 * _1M];
        byte[] byte2 = new byte[2 * _1M];
        byte[] byte3 = new byte[2 * _1M];
        byte[] byte4 = new byte[2 * _1M];
        byte[] byte5 = new byte[2 * _1M];
        byte[] byte6 = new byte[5 * _1M];

        byte[] byte7 = new byte[2 * _1M];

        System.out.println("asdf");
    }
}

注意byte6是5M

vm参数:

-Xms20m
-Xmx20m
-Xmn10m
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintTenuringDistribution
-XX:+PrintGCTimeStamps

分别打上断点,使用

$ jmap -heap 17432

System.gc

1.049: [GC (System.gc()) 
Desired survivor size 1048576 bytes, new threshold 7 (max 15)
[PSYoungGen: 6657K->1000K(9216K)] 6657K->1337K(19456K), 0.0015197 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
1.051: [Full GC (System.gc()) [PSYoungGen: 1000K->0K(9216K)] [ParOldGen: 337K->1290K(10240K)] 1337K->1290K(19456K), [Metaspace: 3777K->3777K(1056768K)], 0.0063289 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 

查看堆信息:

$ jps  -l
11120 com.qhong.gc.HeapTest
11652 sun.tools.jps.Jps
18708 com.shitou.Application
11352
18200 org.jetbrains.jps.cmdline.Launcher
13644 org.jetbrains.jps.cmdline.Launcher

jmap:

$ jmap -heap 11120
Attaching to process ID 11120, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.201-b09

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0                
   MaxHeapFreeRatio         = 100         #GC后如果发现空闲堆内存占到整个预估堆内存的N%(百分比)  
   MaxHeapSize              = 20971520 (20.0MB)    # 堆最大空闲    jvm参数 -Xms20m
   NewSize                  = 10485760 (10.0MB)    # 年轻代空间    jvm参数 -Xmn10m
   MaxNewSize               = 10485760 (10.0MB)    # 年轻代最大空间
   OldSize                  = 10485760 (10.0MB)    # 老年代空间 =(等于)堆内存大小 -(减去)年轻代大小
   NewRatio                 = 2   
   SurvivorRatio            = 8   # 年轻代内存又被分成三部分 Eden 空间 80% 而From Survivor 空间 和 To Survivor空间 分别占用10%
   MetaspaceSize            = 21807104 (20.796875MB) # 设置元空间的最大值 jvm参数 -XX:MaxMetaspaceSize
   CompressedClassSpaceSize = 1073741824 (1024.0MB)  # 类指针压缩空间大小, 默认为1G
   MaxMetaspaceSize         = 17592186044415 MB    # 是分配给类元数据空间的最大值
   G1HeapRegionSize         = 0 (0.0MB) # G1区块的大小, 取值为1M至32M. 其取值是要根据最小Heap大小划分出2048个区块

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 8388608 (8.0MB)
   used     = 167792 (0.1600189208984375MB)
   free     = 8220816 (7.8399810791015625MB)
   2.0002365112304688% used
From Space:
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
To Space:
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
PS Old Generation
   capacity = 10485760 (10.0MB)
   used     = 1321344 (1.2601318359375MB)
   free     = 9164416 (8.7398681640625MB)
   12.601318359375% used

2072 interned Strings occupying 186064 bytes.

byte1执行后

Eden Space:
   capacity = 8388608 (8.0MB)
   used     = 2428440 (2.3159408569335938MB)
   free     = 5960168 (5.684059143066406MB)
   28.949260711669922% used
From Space:
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
To Space:
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
PS Old Generation
   capacity = 10485760 (10.0MB)
   used     = 1321480 (1.2602615356445312MB)
   free     = 9164280 (8.739738464355469MB)
   12.602615356445312% used

byte2执行后

Eden Space:
   capacity = 8388608 (8.0MB)
   used     = 4525528 (4.315879821777344MB)
   free     = 3863080 (3.6841201782226562MB)
   53.9484977722168% used
From Space:
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
To Space:
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
PS Old Generation
   capacity = 10485760 (10.0MB)
   used     = 1321344 (1.2601318359375MB)
   free     = 9164416 (8.7398681640625MB)
   12.601318359375% used

byte3执行后

Eden Space:
   capacity = 8388608 (8.0MB)
   used     = 6622696 (6.315895080566406MB)
   free     = 1765912 (1.6841049194335938MB)
   78.94868850708008% used
From Space:
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
To Space:
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
PS Old Generation
   capacity = 10485760 (10.0MB)
   used     = 1321344 (1.2601318359375MB)
   free     = 9164416 (8.7398681640625MB)
   12.601318359375% used

byte4执行后

gc:

247.099: [GC (Allocation Failure) 
Desired survivor size 1048576 bytes, new threshold 7 (max 15)
[PSYoungGen: 6467K->0K(9216K)] 7757K->7434K(19456K), 0.0041433 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
247.104: [Full GC (Ergonomics) [PSYoungGen: 0K->0K(9216K)] [ParOldGen: 7434K->7109K(10240K)] 7434K->7109K(19456K), [Metaspace: 3769K->3769K(1056768K)], 0.0083147 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 

heap:

Eden Space:
   capacity = 8388608 (8.0MB)
   used     = 2181072 (2.0800323486328125MB)
   free     = 6207536 (5.9199676513671875MB)
   26.000404357910156% used
From Space:
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
To Space:
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
PS Old Generation
   capacity = 10485760 (10.0MB)
   used     = 7280080 (6.9428253173828125MB)
   free     = 3205680 (3.0571746826171875MB)
   69.42825317382812% used

byte5执行后

Eden Space:
   capacity = 8388608 (8.0MB)
   used     = 4421640 (4.216804504394531MB)
   free     = 3966968 (3.7831954956054688MB)
   52.71005630493164% used
From Space:
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
To Space:
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
PS Old Generation
   capacity = 10485760 (10.0MB)
   used     = 7280080 (6.9428253173828125MB)
   free     = 3205680 (3.0571746826171875MB)
   69.42825317382812% used

byte6执行后

GC:

337.887: [Full GC (Ergonomics) [PSYoungGen: 4318K->2048K(9216K)] [ParOldGen: 7109K->9157K(10240K)] 11427K->11205K(19456K), [Metaspace: 3769K->3769K(1056768K)], 0.0064432 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 

Heap:

Eden Space:
   capacity = 8388608 (8.0MB)
   used     = 7340064 (7.000030517578125MB)
   free     = 1048544 (0.999969482421875MB)
   87.50038146972656% used
From Space:
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
To Space:
   capacity = 1048576 (1.0MB)
   used     = 0 (0.0MB)
   free     = 1048576 (1.0MB)
   0.0% used
PS Old Generation
   capacity = 10485760 (10.0MB)
   used     = 9377000 (8.942604064941406MB)
   free     = 1108760 (1.0573959350585938MB)
   89.42604064941406% used

byte7执行后

370.908: [Full GC (Ergonomics) [PSYoungGen: 7168K->7168K(9216K)] [ParOldGen: 9157K->9157K(10240K)] 16325K->16325K(19456K), [Metaspace: 3769K->3769K(1056768K)], 0.0045883 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 
370.913: [Full GC (Allocation Failure) [PSYoungGen: 7168K->7168K(9216K)] [ParOldGen: 9157K->9157K(10240K)] 16325K->16325K(19456K), [Metaspace: 3769K->3769K(1056768K)], 0.0028624 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at com.qhong.gc.HeapTest.main(HeapTest.java:18)
Heap
 PSYoungGen      total 9216K, used 7368K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
  eden space 8192K, 89% used [0x00000000ff600000,0x00000000ffd32238,0x00000000ffe00000)
  from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
  to   space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)
 ParOldGen       total 10240K, used 9157K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
  object space 10240K, 89% used [0x00000000fec00000,0x00000000ff4f14e8,0x00000000ff600000)
 Metaspace       used 3799K, capacity 4596K, committed 4864K, reserved 1056768K
  class space    used 414K, capacity 432K, committed 512K, reserved 1048576K
Disconnected from the target VM, address: '127.0.0.1:6560', transport: 'socket'

发现一开始eden区就不是空的

如果一开始不执行System.gc(),那么除了eden区,其他区都是空的,包括老年代也是空的

参考:

《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读

转载于:https://www.cnblogs.com/hongdada/p/10452094.html

### Python 中垃圾回收(GC)的触发条件 Python 的垃圾回收机制主要依赖于 **引用计数** 和 **循环检测器** 来实现。当对象的引用计数降为零时,该对象会被立即销毁并释放内存资源[^1]。然而,在某些情况下,可能会存在无法通过简单引用计数解决的循环引用问题。为此,Python 提供了一个额外的循环检测器来处理这种情况。 #### 自动触发垃圾回收的情况 1. 当未被引用的对象数量达到特定阈值时,Python 的垃圾回收器会启动一次清理操作。这个阈值可以通过 `gc` 模块进行配置,默认值由解释器决定[^2]。 2. 如果程序中出现了大量的不可达对象(即没有任何活动引用指向它们),即使这些对象仍然相互持有引用形成闭环,也会被周期性的扫描和清除。这种行为通常发生在长时间运行的应用程序中,尤其是在复杂的对象图结构中[^3]。 #### 手动触发垃圾回收 开发人员也可以显式调用 `gc.collect()` 方法强制执行一次完整的垃圾收集过程。这有助于在特殊场景下减少内存泄漏的风险或者优化性能表现。 --- ### Java 中垃圾回收(GC)的触发条件 相比之下,Java 使用的是基于分代假设的垃圾回收模型,主要包括 Young Generation (年轻代), Old Generation (老年代),以及 Permanent Generation/ Metaspace(永久代 / 元空间)[^4]。具体来说: - **Minor GC**: 发生在Young generation区域内的垃圾回收事件。每当Eden区满载时便会触发改类型的GC动作;此时只会暂停部分线程(STW, Stop The World)以便快速完成清扫工作而不至于严重影响整体应用性能。 - **Major GC 或 Full GC**: 这些术语有时互换使用,表示整个堆内存范围内的全面整理行动。一般而言,只有当Old generation接近饱和状态或者其他特殊情况发生时才可能引发此类大规模干预措施。例如过多的大尺寸短生命周期实例分配失败等情况均可能导致Full GC的发生频率增加。 值得注意的是,“Stop-The-World”现象不可避免地伴随着每次GC进程,尽管现代JVM已经提供了许多改进技术试图最小化这一负面影响,但在极端条件下依然会对实时响应敏感型业务造成干扰。 --- ### 总结对比两者的差异点如下表所示: | 特性 | Python | Java | |-------------------|----------------------------------|--------------------------------| | 主要机制 | 引用计数 + 循环引用检测 | 分代收集 | | 默认触发方式 | 达到设定阈值 | Eden区满、老年代不足 | | 用户可控程度 | 可通过 gc.set_threshold() 调整 | JVM参数调节(-Xms,-Xmx等选项) | 以上便是关于两种编程语言环境下各自特有的GC触发逻辑概述说明。 ```python import gc # 设置垃圾回收阈值 gc.set_threshold(700, 10, 5) # 显示当前已知的不可到达对象数目 print(gc.garbage) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值