JVM调优总结二

简介: JVM调优总结二

JVM启动参数:java -server -Xms1G -Xmx1G -Xmn256m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+HeapDumpOnOutOfMemoryError

-Xloggc:island_gc_3_201304161720.log -jar /data/game.jar 3

VM_235_195:~ # jmap -heap 8180
Attaching to process ID 8180, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.8-b03


using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC


Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 1073741824 (1024.0MB)
   NewSize          = 268435456 (256.0MB)
   MaxNewSize       = 268435456 (256.0MB)
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 67108864 (64.0MB)
   MaxPermSize      = 134217728 (128.0MB)


Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 241631232 (230.4375MB)
   used     = 191160600 (182.3049545288086MB)
   free     = 50470632 (48.132545471191406MB)
   79.11253790238507% used
Eden Space:
   capacity = 214827008 (204.875MB)
   used     = 166785816 (159.0593490600586MB)
   free     = 48041192 (45.815650939941406MB)
   77.6372661672037% used
From Space:
   capacity = 26804224 (25.5625MB)
   used     = 24374784 (23.24560546875MB)
   free     = 2429440 (2.31689453125MB)
   90.93635391198045% used
To Space:
   capacity = 26804224 (25.5625MB)
   used     = 0 (0.0MB)
   free     = 26804224 (25.5625MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 805306368 (768.0MB)
   used     = 34816824 (33.20391082763672MB)
   free     = 770489544 (734.7960891723633MB)
   4.323425889015198% used
Perm Generation:
   capacity = 75055104 (71.578125MB)
   used     = 44924728 (42.84355926513672MB)
   free     = 30130376 (28.73456573486328MB)
   59.85566018268391% used


VM_235_195:~ # jmap -histo:live 8180


num     #instances         #bytes  class name
----------------------------------------------

Total       1107232       78045936

2013-04-18 18:42:00,476 WARN :(Memory Monitor) com.ztgame.common.MemoryManager - 服务器占用内存183M

VM_235_195:~ # jstat -gcutil -h5 8180 5s
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT  
  0.00  95.35  90.25  10.24  59.89    371    4.785     5    1.378    6.163
  0.00  95.35  95.12  10.24  59.89    371    4.785     5    1.378    6.163
  0.00  95.35  99.14  10.24  59.89    371    4.785     5    1.378    6.163
60.76   0.00   3.74  10.45  59.89    372    4.799     5    1.378    6.177
60.76   0.00   6.08  10.45  59.89    372    4.799     5    1.378    6.177
60.76   0.00   9.81  10.45  59.89    372    4.799     5    1.378    6.177
-XX:NewRatio 是指

Old Generation/Young Generation 的比值,比如上图中显示为2就代表 2:1,但是如果设置了Xmn的情况下,该参数起不了作用!

-XX:SurvivorRatio 是指Eden/survivor的比值,比如上图中显示为8就代表8:1

上图中触发了一次 Young GC

young GC后,Eden中活对象copy到to survivor(S0)中,大对象直接进老生代Old。
From survivor(S1)中相对老的活对象进入老生代,相对年轻的对象进入to survivor(S0)中。

如果to survivor(S0)放不下活对象,则这些活对象直接进入old。

经历过young GC,Eden和from survivor都变成空的内存区域,to survivor(S0)存储有活的对象。
To survivor和from survivor角色互换,也就是这次GC后,S0 变成From survivor,S1变成了to survivor

新生代(Young Generation)

大部分的对象的内存分配和回收在这里完成。

Eden

新建的对象分配在此,新生代GC后被清空。

Survivor

存储至少经过一次GC存活下来的对象,以增大该对象在提升至老生代前被回收的机会。

From Space

在新生代GC后被清空,GC后存活的对象放入To space或老生代。

To Space

Eden中在新生代GC后存活的对象部分放在此。From Space中在新生代GC后存活的对象部分放在此。

老生代(Old Generation)

永生代(Permanent Generation)

java堆由Perm区和Heap区组成,Heap区则由Old区和New区组成,而New区又分为Eden区,From区,To区,Heap={Old+NEW={Eden,From,To}},old 现在就是concurrent mark-sweep generation。

JVM采用一种分代回收(generational collection)的策略,用较高的频率对年轻的对象(young generation)进行扫描和回收,这种叫做minor collection,而对老对象(old generation)的检查回收频率要低很多,称为major collection。这样就不需要每次GC都将内存中所有对象都检查一遍。
GC不会在主程序运行期对PermGen Space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen Space错误。


根据如上观察数据: New Generation (Eden + 1 Survivor Space),也就是

New Generation used=Eden Space used +To Space used

Xmn的256m= New Generation capacity + To Space capacity =Eden Space capacity+ From Space capacity+ To Space capacity (From Space capacity和To Space capacity 分别占Xmn的1/10)

Xmx 1G= New Generation capacity + To Space capacity+concurrent mark-sweep generation capacity

Runtime.getRuntime().totalMemory()-Runtime.getRuntime(). freememory()= New Generation used+concurrent mark-sweep generation used

看来JAVA本身语言输出的是不包含持久代的

PID USER      PR  NI   VIRT            RES    SHR S %CPU %MEM    TIME+  COMMAND                                                  8180 root      15    0     1412m        607m  10m S    0           8.7   1:40.44       java   

那么,为什么top 出来的RES值不等于堆内存(sum(eden+servivor+old))+ Perm 内存的大小呢?

The total virtual memory used is the sum of the maximum heap + thread stacks + direct memory + perm gen + share libraries. This never shrinks.

意思是说,真实的JAVA应用内存占用=最大堆内存+线程的栈占用+直接内存+持久代+共享库

JVM 中还有栈内存,JNI等,每个线程还得占据一定的内存

JVM除了堆内存外,还有栈内存和直接内存,栈空间每个线程是固定的,而占用大小基本固定而且可以忽略,而直接内存并不是虚拟机运行时数据区的一部分,不受JVM的GC管理,以native的方式分配内存。具体请参考 http://blog.csdn.net/jiangguilong2000/article/details/8821420


目录
相关文章
|
3月前
|
存储 监控 算法
jvm-性能调优(二)
jvm-性能调优(二)
|
16天前
|
监控 架构师 Java
Java虚拟机调优的艺术:从入门到精通####
本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####
|
5月前
|
Arthas 监控 Java
(十一)JVM成神路之性能调优篇:GC调优、Arthas工具详解及各场景下线上最佳配置推荐
“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。
509 3
|
23天前
|
监控 Java 编译器
Java虚拟机调优指南####
本文深入探讨了Java虚拟机(JVM)调优的精髓,从内存管理、垃圾回收到性能监控等多个维度出发,为开发者提供了一系列实用的调优策略。通过优化配置与参数调整,旨在帮助读者提升Java应用的运行效率和稳定性,确保其在高并发、大数据量场景下依然能够保持高效运作。 ####
27 1
|
25天前
|
存储 算法 Java
JVM进阶调优系列(10)敢向stop the world喊卡的G1垃圾回收器 | 有必要讲透
本文详细介绍了G1垃圾回收器的背景、核心原理及其回收过程。G1,即Garbage First,旨在通过将堆内存划分为多个Region来实现低延时的垃圾回收,每个Region可以根据其垃圾回收的价值被优先回收。文章还探讨了G1的Young GC、Mixed GC以及Full GC的具体流程,并列出了G1回收器的核心参数配置,帮助读者更好地理解和优化G1的使用。
|
26天前
|
监控 Java 测试技术
Elasticsearch集群JVM调优垃圾回收器的选择
Elasticsearch集群JVM调优垃圾回收器的选择
46 1
|
1月前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
1月前
|
监控 Java 编译器
Java虚拟机调优实战指南####
本文深入探讨了Java虚拟机(JVM)的调优策略,旨在帮助开发者和系统管理员通过具体、实用的技巧提升Java应用的性能与稳定性。不同于传统摘要的概括性描述,本文摘要将直接列出五大核心调优要点,为读者提供快速预览: 1. **初始堆内存设置**:合理配置-Xms和-Xmx参数,避免频繁的内存分配与回收。 2. **垃圾收集器选择**:根据应用特性选择合适的GC策略,如G1 GC、ZGC等。 3. **线程优化**:调整线程栈大小及并发线程数,平衡资源利用率与响应速度。 4. **JIT编译器优化**:利用-XX:CompileThreshold等参数优化即时编译性能。 5. **监控与诊断工
|
1月前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
2月前
|
Arthas 监控 数据可视化
JVM进阶调优系列(7)JVM调优监控必备命令、工具集合|实用干货
本文介绍了JVM调优监控命令及其应用,包括JDK自带工具如jps、jinfo、jstat、jstack、jmap、jhat等,以及第三方工具如Arthas、GCeasy、MAT、GCViewer等。通过这些工具,可以有效监控和优化JVM性能,解决内存泄漏、线程死锁等问题,提高系统稳定性。文章还提供了详细的命令示例和应用场景,帮助读者更好地理解和使用这些工具。