记一次JVM调优过程!

1.jstat -gcutil pid ---jstack主要用来查看某个Java进程内的线程堆栈信息


当抛出:java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "DubboServerHandler-10.28.29.22:20187-thread-971"

查看GC情况如下:

  S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC GCC
  100.00 0.00 100.00 100.00 12.31 653 11.869 281 1200.299 1212.167 Allocation Failure Allocation Failure
  100.00 0.00 100.00 100.00 12.31 653 11.869 281 1200.299 1212.167 Allocation Failure Allocation Failure
  100.00 0.00 100.00 100.00 12.31 653 11.869 281 1200.299 1212.167 Allocation Failure Allocation Failure
  100.00 0.00 100.00 100.00 12.31 653 11.869 281 1200.299 1212.167 Allocation Failure Allocation Failure

说明:

  S0 — Heap上的 Survivor space 0 区已使用空间的百分比
  S1 — Heap上的 Survivor space 1 区已使用空间的百分比
  E — Heap上的 Eden space 区已使用空间的百分比
  O — Heap上的 Old space 区已使用空间的百分比
  P — Perm space 区已使用空间的百分比
  YGC — 从应用程序启动到采样时发生 Young GC 的次数
  YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
  FGC — 从应用程序启动到采样时发生 Full GC 的次数
  FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
  GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

2.使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况

  Attaching to process ID 20217, please wait...
  Debugger attached successfully.
  Server compiler detected.
  JVM version is 24.79-b02

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

  Heap Configuration:
  MinHeapFreeRatio = 40
  MaxHeapFreeRatio = 70
  MaxHeapSize = 2147483648 (2048.0MB)
  NewSize = 268435456 (256.0MB)
  MaxNewSize = 268435456 (256.0MB)
  OldSize = 5439488 (5.1875MB)
  NewRatio = 2
  SurvivorRatio = 8
  PermSize = 536870912 (512.0MB)
  MaxPermSize = 536870912 (512.0MB)
  G1HeapRegionSize = 0 (0.0MB)

  Heap Usage:
  New Generation (Eden + 1 Survivor Space):
  capacity = 241631232 (230.4375MB)
  used = 12904416 (12.306610107421875MB)
  free = 228726816 (218.13088989257812MB)
  5.340541408157038% used
  Eden Space:
  capacity = 214827008 (204.875MB)
  used = 11259704 (10.738090515136719MB)
  free = 203567304 (194.13690948486328MB)
  5.241288842043548% used
  From Space:
  capacity = 26804224 (25.5625MB)
  used = 1644712 (1.5685195922851562MB)
  free = 25159512 (23.993980407714844MB)
  6.136017964929707% used
  To Space:
  capacity = 26804224 (25.5625MB)
  used = 0 (0.0MB)
  free = 26804224 (25.5625MB)
  0.0% used
  concurrent mark-sweep generation:
  capacity = 1879048192 (1792.0MB)
  used = 73942656 (70.5172119140625MB)
  free = 1805105536 (1721.4827880859375MB)
  3.935112271990095% used
  Perm Generation:
  capacity = 536870912 (512.0MB)
  used = 68030896 (64.87931823730469MB)
  free = 468840016 (447.1206817626953MB)
  12.671741843223572% used

3.使用-histo:live pid |more查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象

4.使用 命令: jmap -dump:format=b,file=jconsole.dump pid 可以down出堆内存使用详情 配合 MemoryAnalyzer (侧重于查看引用) visualvm(侧重于查看内部存储的信息) 工具,进行具体的堆内存占用情况分析.

这里有个小技巧,可以使用 sz 文件名 命令下载指定文件 没有sz 的可以使用 yum install -y lrzsz 命令安装 

 

5.这里有两篇比较好的文章可以参考优化:

http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html

http://www.cnblogs.com/ListenWind/p/5230118.html

 

6.最终优化参数为:调整新生代为JVM内存的3/8 大小, 并设置老年代为并行回收策略 相关参数如下:

-Xms2g 初始堆2g
-Xmx2g 最大堆2g
-Xss256k 每个线程的堆栈大小
-Xmn768m 年轻代大小
-XX:PermSize=128m 持久代初始值
-XX:MaxPermSize=128m 持久带最大值
-XX:+UseParallelOldGC 年老代垃圾收集方式为并行收集
-XX:ParallelGCThreads=3 并行收集器的线程数 此值最好配置与处理器数目相等 同样适用于CMS
-XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:path

 

转载于:https://www.cnblogs.com/ezlife/p/7613614.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值