`

JVM 四

 
阅读更多

 

转自:http://blog.csdn.net/cutesource/article/details/5907418

JVM学习笔记(四)------内存调优

首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况, 因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。

对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数,过多的GC和Full GC是会占用很多的系统资源(主要是CPU),影响系统的吞吐量。特别要关注Full GC,因为它会对整个堆进行整理,导致Full GC一般由于以下几种情况:

  • 旧生代空间不足
    调优时尽量让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象 
  • Pemanet Generation空间不足
    增大Perm Gen空间,避免太多静态对象 
  • 统计得到的GC后晋升到旧生代的平均大小大于旧生代剩余空间
    控制好新生代和旧生代的比例 
  • System.gc()被显示调用
    垃圾回收不要手动触发,尽量依靠JVM自身的机制 

调优手段主要是通过控制堆内存的各个部分的比例和GC策略来实现,下面来看看各部分比例不良设置会导致什么后果

1)新生代设置过小

一是新生代GC次数非常频繁,增大系统消耗;二是导致大对象直接进入旧生代,占据了旧生代剩余空间,诱发Full GC

2)新生代设置过大

一是新生代设置过大会导致旧生代过小(堆总量一定),从而诱发Full GC;二是新生代GC耗时大幅度增加

一般说来新生代占整个堆1/3比较合适

3)Survivor设置过小

导致对象从eden直接到达旧生代,降低了在新生代的存活时间

4)Survivor设置过大

导致eden过小,增加了GC频率

另外,通过-XX:MaxTenuringThreshold=n来控制新生代存活时间,尽量让对象在新生代被回收

由上一篇博文JVM学习笔记(三)------内存管理和垃圾回收 可知新生代和旧生代都有多种GC策略和组合搭配,选择这些策略对于我们这些开发人员是个难题,JVM提供两种较为简单的GC策略的设置方式

1)吞吐量优先

JVM以吞吐量为指标,自行选择相应的GC策略及控制新生代与旧生代的大小比例,来达到吞吐量指标。这个值可由-XX:GCTimeRatio=n来设置

2)暂停时间优先

JVM以暂停时间为指标,自行选择相应的GC策略及控制新生代与旧生代的大小比例,尽量保证每次GC造成的应用停止时间都在指定的数值范围内完成。这个值可由-XX:MaxGCPauseRatio=n来设置

 

最后汇总一下JVM常见配置

  1. 堆设置
    • -Xms:初始堆大小
    • -Xmx:最大堆大小
    • -XX:NewSize=n:设置年轻代大小
    • -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
    • -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
    • -XX:MaxPermSize=n:设置持久代大小
  2. 收集器设置
    • -XX:+UseSerialGC:设置串行收集器
    • -XX:+UseParallelGC:设置并行收集器
    • -XX:+UseParalledlOldGC:设置并行年老代收集器
    • -XX:+UseConcMarkSweepGC:设置并发收集器
  3. 垃圾回收统计信息
    • -XX:+PrintGC
    • -XX:+PrintGCDetails
    • -XX:+PrintGCTimeStamps
    • -Xloggc:filename
  4. 并行收集器设置
    • -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
    • -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
    • -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
  5. 并发收集器设置
    • -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
    • -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

附:

本系列学习资料主要来自博文http://rednaxelafx.javaeye.com/blog/656951 里提到的PPT和《分布式Java应用》里有关JVM的章节,推荐大家继续深入学习

分享到:
评论

相关推荐

    JVM 完整深入解析.pdf

    Java虚拟机(JVM)是运行Java程序的关键平台,其内部结构和内存管理机制非常复杂且精细。它将内存分为若干个不同的数据区域,以便管理Java程序的运行时数据。下面将详细介绍JVM中的运行时数据区,以及Java内存模型...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    4. JAVA并发:Java并发编程涉及到多个线程同时运行以提高程序性能,但同时也需要妥善处理线程间同步和互斥问题。Java提供了多种并发工具和机制,如synchronized关键字、volatile关键字、各种锁机制、以及java.util....

    jdk,jvm源码

    4. 执行引擎:解释器负责逐条解释执行字节码,而即时编译器(JIT)会将热点代码编译成本地机器码,以提高运行效率。 5. 内存管理:JVM的垃圾回收机制自动管理内存,包括对象的分配和回收。常见的垃圾收集算法有标记...

    Java进阶教程解密JVM视频教程

    第四章:类加载与字节码技术 1. 类文件结构 2. 字节码指令 3. 编译期处理 4. 类加载阶段 5. 类加载器 6. 运行期优化 第五章:内存模型 1. Java 内存模型 2. 可见性 3. 有序性 4. CAS 与原子类 5. synchronized 优化

    JVM面试资料:JVM结构、JVM调优、四大垃圾回收算法、七大垃圾回收器

    JVM面试资料。 JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel...

    jvm 启动过程 JVM 原理

    4. **解析**:此时,JVM将常量池中的符号引用转换为直接引用。这个阶段不是必需的,可以在类或接口被首次使用时动态解析。 5. **初始化**:最后,JVM执行类的初始化方法(),这包括静态变量的初始化和静态代码块的...

    JVM图解-JVM指令-JVM原型图.rar

    4. **类加载机制**: - 双亲委派模型:当一个类加载器需要加载类时,它会先委托父加载器去尝试加载,只有当父加载器无法加载时,子加载器才会尝试加载。 - 类加载的三个阶段:加载、验证、准备、解析和初始化。 5...

    SAP JVM 8.1 64 bits

    4. **包含的文件**: - `COPYRIGHT`:包含了软件的版权信息,详细列出了所有相关的知识产权声明。 - `THIRDPARTYLICENSEREADME.txt`:列出了所有第三方库的许可协议,这对于遵循开源软件许可非常重要。 - `...

    JVM中文指令手册.pdf

    4. null值处理:aconst_null指令(0x01)用于将null值推送到操作数栈上,表明一个引用类型的空值。 5. 操作数栈:JVM使用一个先进后出(FILO)的数据结构来存储局部变量和中间计算结果,这个结构就是操作数栈。所有...

    jvm视频及笔记

    4. **垃圾收集**:JVM如何自动管理内存,理解不同垃圾收集器如Serial、Parallel、CMS、G1等的工作机制,以及新生代和老年代的概念。 5. **类加载器**:系统类加载器、扩展类加载器和应用程序类加载器之间的双亲委派...

    jvm-mon基于控制台的JVM监视

    4. **类加载统计**:显示已加载的类数量,帮助分析类加载是否正常,是否存在过多的类加载导致内存消耗增加。 5. **CPU使用率**:监控JVM的CPU使用情况,过高可能意味着存在性能瓶颈或无用计算。 6. **系统资源监控...

    JVM 输出 GC 日志导致 JVM 卡住

    4. JVM 卡住的问题和解决方法 5. async_profiler 工具的使用 6. JFR(Java Flight Recording)技术 知识扩展: 1. Java 17 中的新特性和改进 2. EFS(Elastic File System)服务的应用 3. Spring Cloud Gateway 的...

    狂神说JVM探究.rar

    4. **垃圾收集(GC)**: - 垃圾收集的目的是自动回收不再使用的对象所占用的内存。 - 分代收集理论:将堆分为新生代(Eden、Survivor)、老年代,不同年代采用不同的GC算法。 - 常见的GC算法有:标记-清除、复制...

    JVM必知必会

    #### 4. 类加载器的种类和职责 JVM的类加载通过ClassLoader及其子类完成,包括以下几种: - **Bootstrap ClassLoader**:JVM级别的类加载器,负责加载`$JAVA_HOME/jre/lib`下的所有类库,不由Java实现,开发者无法...

    JVM基础.doc

    #### 四、内存模型、锁与同步 **Java内存模型** 主要涉及以下方面: - **主内存**:存储共享变量。 - **工作内存**:每个线程的私有数据区域,存储线程局部变量等。 **锁与同步机制** 包括: - **volatile关键字**...

    JVM原理讲解和调优,详细讲解JVM底层

    JVM的内存管理主要分为堆(Heap)、栈(Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)四个部分。堆用于存放对象实例,是垃圾回收的主要区域。栈负责存储局部变量和方法调用的状态,每个线程...

    浅谈jvm原理

    类加载器子系统包括启动类加载器、扩展类加载器、系统类加载器和用户自定义加载器四个部分。它们分别负责加载 JRE 的核心类库、JRE 扩展目录中的 JAR 包、ClassPath 路径下的类包和用户自定义路径下的类包。 运行时...

    JVM

    4. **本地方法接口(Native Method Interface)**:允许JVM调用本机库函数。 5. **本机库(Native Library)**:包含操作系统和硬件相关的功能。 ### 类加载过程 类加载分为加载、验证、准备、解析和初始化五个阶段...

    JVM课件(云析学院JVM课程课件)

    魔数(magic)是Class文件的前4个字节,它的值是固定的0xCAFEBABE,用于识别这个文件是否为一个合法的Class文件。接着是版本号,包括次版本号(minor_version)和主版本号(major_version),它们分别占用2个字节。...

Global site tag (gtag.js) - Google Analytics