`

【Java 8 GC 调优】确定 “代” 的大小

    博客分类:
  • Java
 
阅读更多

很多参数会影响 “代” 的大小。下图说明了堆中“已提交空间”和“虚拟空间”之间的区别。JVM 初始化时会为堆预留整个空间。可以通过 -Xmx 选项指定这个预留空间的大小。如果参数 -Xms 的值比 -Xmx 小,那么不会把所有的预留空间都提交给 JVM。这些未提交的空间在图中被标为 “virtual”(虚拟空间)。堆的不同部分(新生代和老年代)可根据需要增长到虚拟空间的极限。
 

某些参数是堆中 一部分与另一部分 的比率。如,NewRatio 表示老年代与新生代的相对大小。
 


 

 

堆的总容量

以下关于 堆的增长和收缩 及 默认堆大小 不适用于并行GC。(可查看《并行GC》了解 并行GC 堆大小调整 与 默认堆大小 的信息。)但是控制 “堆的总大小” 和 “‘代’的大小” 的参数适用于 并行GC。
 

影响 GC 性能的最重要因素是 总可用内存。因为 GC 操作发生在“代”满时,吞吐量 与 可用内存量 成反比。
 

默认情况下,JVM 会增大或缩小“代”,以尝试将 可用空间的比例 保持在特定范围内。这个“范围”是个百分比,可以通过参数 -XX:MinHeapFreeRatio= 和 -XX:MaxHeapFreeRatio= 指定。
-Xms 设定了堆的最小容量,-Xmx 设定了堆的最大容量。
下表展示了这些参数在 64位 Solaris(SPARC平台版)上的默认值。

参数 默认值
MinHeapFreeRatio 40
MaxHeapFreeRatio 70
-Xms 6656K
-Xmx 通过计算得到

 

根据这些参数,如果某个“代”中的可用空间低于40%,则 JVM 会扩大该“代”的容量以保持40%的可用空间,直到达到该“代”的容量上限。
类似的,如果可用空间超过70%,那么“代”会被缩小,使得其只有70%的可用空间,当然也取决于它的容量下限。
 

正如上表所示,堆大小的默认最大值是 JVM 计算得到的。该计算方法之前被用在 并行GC 上,现在所有 GC 都在用。其中关于堆大小最大值的上限计算在 32位平台 和 64位平台 中是不同的(《堆容量 的 默认值》)。对客户端 JVM 也有类似的计算,这导致它的最大堆大小 小于 服务端 JVM。
 

一般准则

以下是关于 服务器应用 堆大小 的一般准则:

  • 除非暂停时间太长,否则尝试分配尽可能多的内存。默认值通常都太小了。
  • 将 -Xms 和 -Xmx 设置为相同值,可以移除大小调整策略,从而提高可预测性。但是如果你选择不当,JVM 无法补偿。
  • 通常,如果增加了CPU核数,就可以增大内存,因为内存分配是可以并行的。(以此提高内存分配效率)

 

新生代

在总可用内存之后,影响 GC 性能的最重要因素是 新生代的份额
新生代越大,Minor GC 的频率就越小。但是,对于有限的堆容量,更大的新生代意味着更小的老年代,这会增大 Major GC 的频率。
最佳选择取决于应用程序所分配对象的寿命分布。
 

默认情况下,新生代的容量由参数 NewRatio 控制。如,-XX:NewRatio=3 表示新生代与老年代的比例为 1:3 。也就是说,新生代(Eden 和 2个 Survivor)占总堆的 1/4 。
 

参数 NewSizeMaxNewSize 确定了新生代容量的 下限和上限。将这两个参数设置为相同的值 可以 固定新生代的大小。就如同 -Xms 和 -Xmx 相同时会固定堆的总容量。对于 NewRatio 的整数倍调整来说,这种更细粒度的新生代调整是很有用的。
 

Survivor

你可以使用参数 SurvivorRatio 来调整 Survivor 的容量,但这通常对性能并不重要
例,-XX:SurvivorRatio=6 表示将 Eden 和 一个Survivor 的比例设置为 1:6 。也就是说,每个 Survivor 都是 Eden 的 1/6 ,也就是新生代的 1/8 (不是 1/7,因为有 2个Survivor)。
 

  • 如果 Survivor 太小,GC 复制对象时会直接溢出到老年代。
  • 如果 Survivor 太大,它们也是毫无用处地空着。

每次 GC 时,JVM 都会选择一个阈值,来表示对象被转到 老年代 前可以复制的次数。这个阈值的选择是为了让 Survivor 保持半满(有2个Survivor)。命令行选项 -XX:+PrintTenuringDistribution 可用于显示此阈值 及新生代中对象的“年龄”(被复制的次数)。(注意:此选项并不是所有 GC 都适用。)这对于观察对象寿命分布是很用的。

 

下表展示了这些参数在 64位 Solaris 上的默认值。

参数 Server JVM 中的默认值
NewRatio 2
NewSize 1310M
MaxNewSize 无限制
SurvivorRatio 8

 

新生代的最大容量 是根据 堆的总容量 和 NewRatio 参数 计算得到的。MaxNewSize 的默认值 “无限制” 表示 “除非通过命令行设置了 MaxNewSize,否则不受限制”。
 

一般准则

以下是针对服务器应用的一般准则:

  • 先确定可以提供给 JVM 的 堆容量 最大值。然后根据新生代的规模来规划性能指标,找到最佳设置。
    注意:堆容量 的最大值应小于机器上的内存数量,以免过多的内存换页与抖动(短时间内大量换页操作就是抖动)。
  • 如果堆的总容量是固定的,那么增大新生代就需要减小老年代。
    保持老年代足够大,让它在任何时刻都能存放应用程序的所有存活数据,外加一些空闲空间(10%~20% 或 更多)
  • 给新生代充足的内存
  • 如果增加了CPU核数,就可以增大内存,因为内存分配是可以并行的

 

  • 大小: 9.9 KB
分享到:
评论

相关推荐

    Java_GC垃圾回收调优指南

    ### Java GC垃圾回收调优指南 #### 概述 在Java开发过程中,垃圾回收(Garbage Collection, GC)是管理内存资源的关键技术之一。...通过上述指南,希望能帮助开发者更好地掌握GC调优技巧,提高应用程序的整体性能。

    JavaGC调优基础.pdf

    总之,Java GC调优是一个复杂而细致的过程,需要综合考虑多个因素,包括但不限于堆大小、操作系统资源、JVM版本、GC策略和应用特性。通过合理的调优,可以有效地提升Java应用的性能,降低系统资源的消耗。

    【Java 8 GC 调优】Garbage-First(G1)

    它试图在实现高吞吐量的同时,高概率地满足 GC暂停时间 目标。整个堆操作,如 全局标记,与业务线程同时运行。这可以防止 中断的发生概率 与 堆或存活数据大小 成比例。 G1 通过几种技术实现了 高性能 和 暂停时间 ...

    JAVA性能测试与调优案例

    Java堆的垃圾收集(GC)是Java性能调优的关键部分。GC负责回收不再使用的对象,释放内存空间。通过调整JVM启动参数可以对Java堆进行优化,比如设置合适的-Xmx和-Xms参数来调整Java堆的最大和初始内存大小。此外,还...

    HP-UX中的Java应用性能调优概述.doc

    #### 4.1 GC调优 根据-Xverbosegc输出的GC日志,调整堆大小、选择合适的GC算法(如CMS或G1),可以显著减少GC暂停时间,提升响应速度。 #### 4.2 内存管理 通过分析堆内存使用情况,合理设置-Xms和-Xmx参数,避免...

    java性能调优的基本知识.pdf

    选择合适的垃圾收集器(如串行、并行、CMS或G1)并调整相关参数(如新生代和老年代大小),可以帮助优化Java堆的使用,减少GC暂停时间,从而提高应用程序的响应速度。 总之,Java性能调优是一个复杂且细致的过程,...

    Tomcat中Java垃圾收集调优宣贯.pdf

    - `-Xmn`:设定年轻代的大小,推荐值为整个堆的3/8到4/8,这会影响Minor GC的频率和效率。 - `-XX:NewSize` 和 `-XX:MaxNewSize`:用于更精确地控制年轻代的初始和最大值。 - `-XX:CMSInitiatingOccupancyFraction`...

    阿里巴巴Java性能调优实战(2021华山版).rar

    《阿里巴巴Java性能调优实战(2021华山版)》是一本专注于Java应用程序性能优化的专业书籍,由阿里巴巴的技术专家团队倾力打造。这本书基于阿里巴巴的实际业务场景,结合丰富的实践经验,为Java开发者提供了深入、...

    JVM GC原理, heapsize调优

    堆内存被分为几个部分,包括年轻代(Young Generation)、老年代(Old Generation)和永久代(PermGen,或者Java 8之后的元空间Metaspace),不同的对象根据其生命周期的长短被分配到不同的区域中。 3. 垃圾回收...

    JVM性能调优

    - **线程池大小**:根据CPU核心数确定合适的线程池大小。 - **线程优先级**:适当调整线程优先级可以改善整体性能。 - **JIT编译器调优**: - **编译阈值**:控制方法何时被编译为本地代码。 - **内联与去内联**...

    Java的GC机制探微.pdf

    然而,由于Java规范对GC的具体实现没有严格规定,不同JVM实现可能采取不同的垃圾收集策略,这给开发者带来了不确定性。 常见的垃圾收集策略包括: 1. 引用计数:每个对象都有一个引用计数器,当引用数为0时,对象...

    Java的垃圾回收机制详解和调优大全

    垃圾回收的调优涉及到多个方面,包括选择合适的GC策略、调整堆大小、控制新生代和老年代的比例、设置GC日志以便分析等。调优的目标是在保持应用响应时间和稳定性的同时,最大化系统资源利用率。这需要开发者深入理解...

    Java GC 专题

    本专题将深入探讨Java GC的基础知识,包括其工作原理、类型、调优策略以及相关工具的使用。 在Java中,内存分为堆内存(Heap)和栈内存(Stack)。堆内存主要用于存储对象实例,而栈内存则存储方法的局部变量。当一...

    JDK8GC-cheatsheet.pdf

    内存大小的调整是GC调优的关键部分。`-Xmn`、`-XX:NewSize` 和 `-XX:MaxNewSize` 控制年轻代的大小,`-Xms` 和 `-Xmx` 设置堆的初始和最大大小,`-Xss` 设定线程栈的大小,`-XX:MaxDirectMemorySize` 确定NIO直接...

    java虚拟机的相关参数设置与调优.pdf

    ### Java虚拟机的相关参数设置与调优 #### Java虚拟机简介 Java虚拟机(Java Virtual Machine,简称JVM)是一种抽象计算机模型,在物理计算机上通过软件实现。它有自己的硬件架构,例如处理器、堆栈、寄存器等,并...

    JVM系列之性能调优参考手册(实践篇).pdf

    标题《JVM系列之性能调优参考手册(实践篇)》涉及的知识点主要集中在Java虚拟机(JVM)性能调优的实践操作。JVM作为Java程序运行的基础环境,对程序性能有着决定性影响。本手册的目的是指导开发者如何对JVM进行性能...

    JVM调优文档,自己总结汇总关于GC和性能的文章

    ### JVM调优文档:垃圾收集(GC)与性能优化 #### 概述 Java虚拟机(JVM)作为运行Java程序的核心组件,其性能直接影响着应用程序的运行效率和稳定性。在JVM中,垃圾收集(GC)是自动管理内存的重要机制之一。本文...

    java_jvm_参数_-Xms_-Xmx_-Xmn_-Xss_调优总结.pdf

    ### Java JVM 参数 `-Xms`、`-Xmx`、`-Xmn`、`-Xss` 调优总结 #### 一、概述 本文档主要介绍Java虚拟机(JVM)中四个重要的参数:`-Xms`、`-Xmx`、`-Xmn` 和 `-Xss` 的含义、作用以及如何通过这些参数来优化JVM的性能...

Global site tag (gtag.js) - Google Analytics