性能测试

1️⃣新对象—>eden 区域——> eden full—>触发Minor GC->回收eden 中无用的对象

2️⃣新对象—>eden 区域——> eden full—>触发Minor GC-🌺几轮GC后存活 & Survivor 足够空间,复制到Survivor 区

3️⃣新对象—>eden 区域——> eden full—>触发Minor GC-🌺几轮GC后存活 & Survivor 足够空间,复制到Survivor 区—✅多轮minor GC后存活,从Survivor 移动到Old generation

Eden Size 与 GC 的关系

Eden Size 太小:可能导致 Minor GC 过于频繁,因新对象无法在 Eden 中留存足够时间,频繁被复制到 Survivor 区和老年代,这增加了 GC 的开销。

Eden Size 太大:可能导致 Minor GC 的时间更长,但可以减少 GC 的频率。在较大的应用程序中,较大的 Eden 区可以减少新对象过早晋升到老年代。

优化 Eden Size 的建议

如果应用程序创建了大量短生命周期对象,可以适当增加 Eden Size,以减少 Minor GC 的频率。

通过观察 GC 日志和内存使用情况,动态调整 Eden 大小,找到适合的比例,避免频繁 GC 造成性能损耗。

-----------------------------------------

GC(Garbage Collection,垃圾回收)是一种自动管理内存的技术,用于回收程序中不再使用的对象或资源,以防止内存泄漏。不同的编程语言和运行环境中,GC 的工作机制有所不同。以下是 GC 的几个核心概念:

1.GC的作用

GC 的主要功能是释放不再使用的对象占用的内存,避免手动管理内存的复杂性。它自动追踪哪些对象是“活”的(被程序引用),哪些对象是“死”的(没有被引用),并清除死对象。

2.主要的GC算法

标记-清除(Mark-and-Sweep):GC算法首先会标记所有活跃的对象,接着清除没有被标记的对象。

复制算法(Copying Collection):将活的对象从一个内存区复制到另一个空闲内存区,然后清除整个旧内存区。

标记-压缩(Mark-and-Compact):类似于标记-清除,但在清除死对象后,会将存活对象压缩到一块连续的内存区域。

分代GC:将对象分为不同代(年轻代、老年代等),不同代的对象使用不同的回收算法。年轻代的对象生命周期短,频繁GC;老年代对象生命周期长,不常进行GC。

3.GC 触发

GC 通常会在以下几种情况触发:

内存使用率达到一定阈值时;手动调用(例如System.gc()或Runtime.getRuntime().gc());运行环境中的其他事件,如应用程序空闲时。

4.Major GC 和 Minor GC

Minor GC:针对年轻代内存区域进行的垃圾回收,通常速度较快。

Major GC(也称为Full GC):涉及老年代和整个堆内存的垃圾回收,回收时间较长,且通常伴随着应用程序的暂停(Stop the World)。

5.Java中的GC

在 Java 中,GC 是 JVM 的一部分。Java 有多种 GC 垃圾回收器,如 Serial、Parallel、G1、ZGC 等,它们适用于不同的场景和需求


JVM堆内存占用高好还是占用低更好

堆内存是否越大越好

1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作,但是现在垃圾回收器也支持了与用户线程同时进行,但是总体来说,如果内存很大的情况下,gc效率还是降低的,在gc时对服务器的性能影响很大

2.Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。

硬件环境

硬件环境也影响GC的效率,例如机器的种类,内存,swap空间,和CPU的数量。

如果你的程序需要频繁创建很多对象,会导致JVM频繁GC。这种情况你可以增加机器的内存,来减少Swap空间的使用。

堆内存占用率是高好还是低更好

这个问题也还是要从GC的角度考虑

首先分析占用率低的情况

首先jvm只有在gc的时候才会清理堆内存中的对象,如果堆内存的占用总是很小的话

jvm几乎没有创建新的对象

jvm频繁的发生gc,也就是堆内存经常满,然后gc,但是gc的效率很有效。总能将堆内存的清理到内存占用低的情况。

分析占用率高的情况

几乎没有发生full gc,很多对象仍然在老年代。这种情况是比较理想的情况,也就是大部门的对象是朝生夕死的,在年轻代就将大部分gc掉了。效率较高

也有可能是很多对象根本gc不掉,这样会导致占用率飙升,甚至oom

总结 堆内存占用高或者低,这个问题并不能直接得到答案,还需要借助jvm的架空工具,比如jstat命令,查看gc次数,gc时间等。

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。


原文链接:https://blog.csdn.net/qq_37436172/article/details/128865418


-------------

**JVM Heap Usage**(JVM 堆内存使用情况) 是指 Java 虚拟机在运行时分配给应用程序对象的内存区域。JVM 将堆内存划分为多个区域,主要包括年轻代(Young Generation)、老年代(Old Generation)和永久代(PermGen,在 Java 8 之后被元数据区 Metaspace 取代)。以下是对 JVM Heap Usage 的详细说明:

### 1. **JVM Heap Structure**

  - **Young Generation(年轻代)**:

    年轻代主要存储新创建的对象,生命周期较短。年轻代进一步划分为三部分:

    - **Eden Space**:大部分新对象分配在 Eden 区,几乎每次 Minor GC 都会清理 Eden 区的内存。

    - **Survivor Space (S0 和 S1)**:两个 Survivor 区域(S0 和 S1)用于在 Minor GC 后存放从 Eden 幸存的对象。随着对象在 Survivor 区不断存活,最终会被移到老年代。


  - **Old Generation(老年代)**:

    老年代存放生命周期较长的对象。对象从年轻代晋升到老年代是因为它们经过多次 GC 后依然存活。老年代的垃圾回收称为 Major GC,通常比 Minor GC 更耗时。


  - **Metaspace (Java 8 及以上版本)**:

    Java 8 之前的 PermGen 区域存放类的元数据(类定义、方法信息等)。在 Java 8 之后,PermGen 被移除,元数据存放在 Metaspace 区,并不在堆中。

### 2. **JVM Heap Memory Usage Types**

  - **Initial Heap Size**:JVM 启动时分配的堆大小,可以通过 `-Xms` 参数指定。

  - **Maximum Heap Size**:JVM 可使用的最大堆大小,可以通过 `-Xmx` 参数指定。

  - **Current Heap Size**:当前 JVM 堆内存的使用量,可以通过 Java 的 `Runtime.getRuntime().totalMemory()` 和 `Runtime.getRuntime().freeMemory()` 方法获取。

### 3. **JVM Heap Memory Parameters**

  - `-Xms`: 用于设置 JVM 启动时的初始堆大小。例如,`-Xms512m` 表示启动时堆大小为 512MB。

  - `-Xmx`: 用于设置 JVM 运行过程中允许的最大堆大小。例如,`-Xmx1024m` 表示堆的最大值为 1024MB。

  - `-XX:NewRatio`: 设置年轻代与老年代的内存比率。例如,`-XX:NewRatio=3` 表示年轻代与老年代的比为 1:3。

  - `-XX:SurvivorRatio`: 设置 Eden 区与 Survivor 区的内存比率。

  - `-XX:+UseG1GC`: 使用 G1 垃圾回收器(JVM 9+ 的默认垃圾回收器)。


### 4. **Monitoring Heap Usage**

  - **JConsole**: Java 提供的监控工具,可以实时查看 JVM 内存使用情况。

  - **VisualVM**: 用于分析 Java 应用程序的性能和内存使用的工具。

  - **Garbage Collection Logs**: 通过启用 GC 日志(`-XX:+PrintGCDetails`)可以查看 GC 活动和堆使用情况。

  - **JVM Memory Management APIs**: Java 提供了 `java.lang.management.ManagementFactory` 类,可以获取堆内存使用情况。

### 5. **Tuning Heap Usage**

  - 调整 `-Xms` 和 `-Xmx` 来设置堆的初始和最大值。

  - 使用适当的垃圾回收器(如 G1、Parallel、ZGC)来优化内存管理和垃圾回收性能。

  - 定期监控并分析应用程序的内存使用,确保没有内存泄漏或对象频繁创建和销毁导致的高 GC 频率。

### 6. **GC and Heap Usage Relationship**

  - **Minor GC** 主要发生在年轻代,回收周期较短,频率较高,回收新分配的对象。

  - **Major GC** 主要针对老年代,回收长时间未释放的对象,通常伴随应用程序暂停。

  - 堆内存不足或 GC 频繁,可能导致 **OutOfMemoryError** 错误。

通过适当的堆配置和垃圾回收优化,可以显著提升 JVM 应用程序的性能和内存管理效率。

---------

Eden Size是 JVM 堆内存中的一部分,属于Young Generation(年轻代),专门用于分配新对象。Eden 区与 Survivor 区一起构成了年轻代。对象首先会分配在 Eden 区,只有在对象经过几轮垃圾回收(GC)仍未被回收时,才会被移入 Survivor 区,最终可能晋升到老年代。

1.Eden Size 在 GC 中的作用

Eden 区是垃圾回收的频繁目标区域。新对象创建后,通常会存放在 Eden 区,当 Eden 区被填满时,触发Minor GC,回收 Eden 区中的无用对象。

如果 Eden 中的对象在 Minor GC 中存活下来,并且 Survivor 区中有足够的空间,它们会被复制到 Survivor 区。

经历多次 Minor GC 仍未被回收的对象,最终会从 Survivor 区移到Old Generation(老年代)

2.如何设置 Eden Size

Eden 区的大小可以通过调整以下 JVM 参数进行配置:

-XX-XX:控制年轻代的初始大小和最大大小,Eden 区的大小是年轻代内存的主要组成部分。

-XX:定义 Eden 区与 Survivor 区的大小比率。默认值通常为8:1:1,这意味着年轻代中 80% 是 Eden 区,10% 是每个 Survivor 区。

例如:

bash

Copy code

-XX:NewSize=512m -XX:MaxNewSize=512m -XX:SurvivorRatio=8

在这个配置中,Eden 区占年轻代的 80%。

3.Eden Size 与 GC 的关系

Eden Size 太小:可能导致 Minor GC 过于频繁,因新对象无法在 Eden 中留存足够时间,频繁被复制到 Survivor 区和老年代,这增加了 GC 的开销。

Eden Size 太大:可能导致 Minor GC 的时间更长,但可以减少 GC 的频率。在较大的应用程序中,较大的 Eden 区可以减少新对象过早晋升到老年代。

4.监控 Eden Size 和使用情况

可以通过JConsoleVisualVM等监控工具查看 Eden 区的大小及其使用情况。还可以通过启用GC 日志来分析 Eden 区的内存回收情况:

bash

Copy code

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log

日志输出示例:

mathematica

Copy code

[GC[PSYoungGen:92160K->5120K(153344K)]183552K->98112K(505856K),0.0089313secs]

其中,PSYoungGen表示 Eden 区的使用情况。

5.优化 Eden Size 的建议

如果应用程序创建了大量短生命周期对象,可以适当增加 Eden Size,以减少 Minor GC 的频率。

通过观察 GC 日志和内存使用情况,动态调整 Eden 大小,找到适合的比例,避免频繁 GC 造成性能损耗。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容