转:
继上次的内存调优分析后(参考[url] http://dmouse.iteye.com/blog/1264118[/url]),gc导致服务器不稳定的情况依然存在,以下记录了后续的调优和分析过程
目前线上有较多的 "Unloading class sun.reflect.GeneratedSerializationConstructorAccessor"、“promotion failed”、“concurrent mode failure”的错误、
关于这三个错误产生的原因,可以参考如下文章
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
http://blogs.oracle.com/jonthecollector/entry/when_the_sum_of_the
http://blogs.oracle.com/jonthecollector/entry/what_the_heck_s_a
综上所述,原因大概概括如下:
1、tenured的预留空间太小
2、young的一次回收的内存空间太大,以致于tenured无法一次分配连续的内存空间来满足需求
3、tenured的空闲内存空间不连续,碎片较多
目前线上系统虽然采用了较多的tenured的空间预留、采用了tenured的内存空间压缩,但仍然不定期的会出现较多的上述三种error,怀疑和设置空间压缩的参数有关
-XX:CMSFullGCsBeforeCompaction=0
这个参数,指定进行多少次fullGC之后,进行tenured的内存空间压缩,对 0 的理解认为是每次都会,建议设置为1进行管产
-XX:CMSFullGCsBeforeCompaction=1
目前每台服务器的上述三种error记录数如下
"Unloading class" "promotion failed" "concurrent mode failure"
50----------------------- 2233------------------------8-----------------------------------40
51 -----------------------2544------------------------15----------------------------------62
61_CPS----------------2698------------------------21---------------------------------31
61_CPS2---------------2573-----------------------17---------------------------------40
62_CPS----------------4815------------------------33---------------------------------47
62_CPS2--------------3608------------------------29---------------------------------183
分析内存回收日志,调整了-XX:CMSFullGCsBeforeCompaction=1参数后,回收稳定,无新增的 "Unloading class sun.reflect.GeneratedSerializationConstructorAccessor"、“promotion failed”、“concurrent mode failure”的错误
在JDK 6的HotSpot VM中,Oracle/Sun有官方支持的GC只有CMS比较特殊:其它几种GC的每个周期都是完全stop-the-world的;而CMS的每个并发GC周期则有两个stop-the-world阶段——initial mark与final re-mark,其它阶段是与应用程序一起并发执行的。
所以可以通过监控"initial-mark" 和 ‘remark’ 的时间,来反映因为gc导致的程序中断问题
- -Xms3g -Xmx3g -Xmn1g -XX:PermSize=128M -XX:+PrintGCDetails -XX:+UseParNewGC -XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=30 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=1
按照目前配置,线上环境jvm垃圾回收效率提升,线程中断情况和中断时间明显减少
-Xms3g -Xmx3g -Xmn1g (堆最大内存 堆最小内存 新生代最大内存)
1、建议按照系统环境尽量设置合理的值
2、建议最大内存和最小内存尽量保持一致;jvm会动态分配内存,为了减少内存临时吃紧造成的重新分配开销,提高内存分配的稳定性;-Xms和-Xmx 默认为物理内存的1/64
3、建议尽量将新生代内存设置为较符合系统的值,避免过小的设置;新生代内存 = eden+ 2 survivor space;Sun官方推荐配置为整个堆的3/8
-XX:PermSize=128M (永久带内存大小)
1、存放编译后class对象的地方,默认物理内存的1/64,建议按照系统实际情况设置
-XX:+PrintGCDetails (打印gc详细信息)
形式诸如
[GC [ParNew: 839977K->1563K(943744K), 0.0048690 secs] 994555K->156183K(3040896K), 0.0052340 secs] [Times: user=0.02 sys=0.01, real=0.01 secs]
[GC [1 CMS-initial-mark: 629255K(2097152K)] 631951K(3040896K), 0.0066920 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[CMS-concurrent-mark: 1.385/1.385 secs] [Times: user=4.80 sys=0.29, real=1.38 secs]
[CMS-concurrent-preclean: 0.008/0.008 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
[GC [ParNew: 840863K->2737K(943744K), 0.0079350 secs] 1470119K->632187K(3040896K), 0.0084240 secs] [Times: user=0.03 sys=0.01, real=
0.01 secs]
[CMS-concurrent-abortable-preclean: 0.646/1.471 secs] [Times: user=2.48 sys=0.27, real=1.47 secs]
[GC[YG occupancy: 424421 K (943744 K)][Rescan (parallel) , 0.0519000 secs][weak refs processing, 0.0017730 secs] [1 CMS-remark: 6294
50K(2097152K)] 1053871K(3040896K), 0.0538830 secs] [Times: user=0.32 sys=0.01, real=0.05 secs]
[CMS-concurrent-sweep: 0.971/0.971 secs] [Times: user=2.06 sys=0.19, real=0.97 secs]
[CMS-concurrent-reset: 0.012/0.012 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
具体内容解释详见 http://blogs.oracle.com/poonam/entry/understanding_cms_gc_logs
-XX:+UseParNewGC -XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC (年轻代并行回收 收集器并行8个线程 年老代并发回收)
1、建议年轻代使用并行回收,同时按照操作系统processer的个数设置并行线程数,理论上<=操作系统processer个数
2、建议年老代使用并发回收,并发回收以降低中断次数,减少中断时间为目标,适用于对系统响应时间有较高要求的服务
-XX:CMSInitiatingOccupancyFraction=30 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=1
对年老代并发回收的参数优化
1、 -XX:CMSInitiatingOccupancyFraction=30
预留足够的空间给young gc,防止从young gc 过来一个较大的内存块,而年老代无足够预留空间,无法提供内存快用于回收后的分配,引起强制的full gc,造成较长时间的线程中断
2、-XX:+UseCMSCompactAtFullCollection
设置在FULL GC的时候, 对年老代的压缩;CMS是不会移动内存的, 因此, 这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。可能会影响性能,但是可以消除碎片
3、 -XX:CMSFullGCsBeforeCompaction=1
设置多少次full gc后进行内存压缩,由于并发收集器不对内存空间进行压缩,整理,所以运行一段时间以后会产生"碎片",使得运行效率降低.此值设置运行多少次GC以后对内存空间进行压缩,整理
相关推荐
标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...
在 JVM 调优过程中,需要使用一些 Linux 命令来观察和分析 JVM 的运行情况。例如: 1. top 命令:可以用来观察 JVM 进程的 CPU 占用率和内存占用率。 2. top –Hp pid 命令:可以用来观察 JVM 进程中的线程情况,...
Java虚拟机(JVM)是Java程序...在实际调优过程中,还需要考虑CPU、内存、磁盘I/O等因素,以及应用本身的特性,如并发量、数据处理量等。通过对JVM参数的精细调整,结合监控工具,可以确保Java应用程序高效稳定地运行。
在现代的软件开发与运行环境中,Java虚拟机(JVM)的性能调优是非常重要的一环,特别是在处理大型应用程序或者服务时,合适的JVM调优能够显著提升系统性能和稳定性。本篇文档详细介绍了JVM调优工具的命令使用及其...
### 马士兵JVM调优笔记知识点梳理 #### 一、Java内存结构 Java程序运行时,其内存被划分为几个不同的区域,包括堆内存(Heap)、方法区(Method Area)、栈(Stack)、程序计数器(Program Counter Register)以及...
在JVM调优过程中,常见的参数包括 `-Xms` 和 `-Xmx`,它们分别设定堆内存的初始大小和最大大小。例如,`-Xms256m -Xmx1024m` 意味着堆内存起始为256MB,最大可达1024MB。合适的设置可以避免频繁的垃圾收集(Garbage ...
在调优过程中,我们需要了解 JVM 的内部结构和工作机制,以便更好地进行优化。 1. 概述 JVM 是 Java 程序的运行环境,它负责将 Java 字节码转换为机器码并执行。JVM 的主要组件包括类加载器、字节码验证器、执行...
在调优过程中,我们面临的挑战之一是如何选择合适的垃圾收集算法,以适应不同的应用场景。选择算法时需要考虑应用的特点,例如对象的生命周期分布、内存使用模式以及停顿时间的要求等。 垃圾回收的瓶颈主要体现在两...
JVM调优是一个复杂的过程,它涉及到对Java虚拟机内部工作原理的深刻理解。本文档总结了JVM调优的基础知识和一些核心概念,旨在帮助开发者更好地掌握Java程序的性能优化。 首先,文档提到了Java中的数据类型分为基本...
JVM调优实战 本文档旨在介绍JVM调优实战的各个方面,包括JVM内存、垃圾回收、性能优化等。通过对JVM内存结构、垃圾回收机制和性能优化策略的详细讲解,帮助读者深入理解JVM的工作原理和优化方法。 1. JVM内存结构 ...
JVM调优是一个复杂而细致的过程,涉及对内存管理、垃圾回收等多个方面的综合考量。理解不同的垃圾回收算法及其适用场景是提高Java应用程序性能的关键。通过合理选择和配置垃圾回收器,可以显著提升系统的响应速度和...
JVM调优是指通过调整JVM的配置参数来优化程序性能的过程。本文将围绕JVM调优展开讨论,重点分析数据类型、堆与栈的关系及其对程序性能的影响,并探讨Java中的参数传递机制。 #### 二、数据类型 在Java虚拟机中,...
调优过程中会观察JVM监控图,分析性能瓶颈,并根据测试结果进行参数调整。文中还提供了一个性能问题的案例分析,展示了从症状到原因分析,再到JVM配置优化的完整过程。 性能问题的分析通常涉及监控结果的解读,例如...
JVM类加载机制详解 JVM类加载机制是Java虚拟机中的一种机制,它负责加载Java类文件到内存中,以便执行Java程序。类加载机制分为五个阶段:加载、验证、准备、解析和初始化。 加载 加载是类加载过程中的一个阶段,...
在JVM调优过程中,我们还需要关注类加载机制,尤其是类加载器的层次结构和双亲委派模型,理解如何避免类冲突和资源浪费。另外,线程池的配置也至关重要,合理的线程数量和队列长度可以有效减少上下文切换开销,提高...
【JVM调优实战经验】 在Java开发中,JVM(Java Virtual Machine)的调优是提高应用程序性能的关键环节。JVM调优涉及到对内存管理、垃圾回收机制以及相关参数的调整,以优化应用程序的运行效率和稳定性。本文将深入...
### JVM调优攻略 #### 一、概述 《JVM调优攻略》是一份详尽的文档,旨在帮助开发者理解并掌握Java虚拟机(JVM)的优化技巧。本指南不仅适用于初学者,对于有一定基础的开发人员来说也同样具有很高的参考价值。文档中...
系统和JVM调优是Java开发人员在面试中经常遇到的话题,这关乎程序性能优化、内存管理和稳定性。本文将深入探讨这两个关键领域的核心概念,并提供一些实战策略。 首先,我们来了解一下系统调优。系统调优主要包括...
在JVM调优过程中,了解这些基础知识至关重要,它可以帮助开发者理解内存分配、垃圾回收、对象生命周期等关键概念,从而有效地调整JVM配置,提高应用程序的性能。例如,通过调整堆大小、设置新生代和老年代的比例、...