JVM调优是一门艺术。

JVM调优的重点是减少Major GC的次数,因为Major GC会暂停程序比较长的时间。如果Major GC的次数比较多,意味着应用程序的JVM内存参数需要调整。

JVM内存分配策略

1 对象优先分配在Eden区

2 大对象直接进入年老代

如何监视GC

1.概览监视gc。

jmap -heap [pid] 查看内存分布

jstat -gcutil [pid] 1000 每隔1s输出java进程的gc情况

2.详细监视gc。

在jvm启动参数,加入-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:./gc.log。

输入示例:

[GC [ParNew: 11450951K->1014116K(11673600K), 0.8698830 secs] 27569972K->17943420K(37614976K), 0.8699520 secs] [Times: user=11.28 sys=0.82, real=0.86 secs]

表示发生一次minor GC,ParNew是新生代的gc算法,11450951K表示eden区的存活对象的内存总和,1014116K表示回收后的存活对象的内存总和,11673600K是整个eden区的内存总和。0.8699520 secs表示minor gc花费的时间。

27569972K表示整个heap区的存活对象总和,17943420K表示回收后整个heap区的存活对象总和,37614976K表示整个heap区的内存总和。

[Full GC [Tenured: 27569972K->16569972K(27569972K), 180.2368177 secs] 36614976K->27569972K(37614976K), [Perm : 28671K->28635K(28672K)], 0.2371537 secs]

表示发生了一次Full GC,整个JVM都停顿了180多秒,输出说明同上。只是Tenured: 27569972K->16569972K(27569972K)表示的是old区,而上面是eden区。

-XX:NewRatio

设置Young与Old的大小比例,-server时默认为1:2,如果太小,会使大对象直接分配到old去,增大major collections的执行次数。

-XX:SurvivorRatio

设置Eden与Survivor的比例,默认为8:1,Survivio大了会浪费,如果小了的话,会使一些大对象在做minor gc时,直接从eden区到达old区,让old区的gc频繁,这个参数保持默认就好了,一般情况下,对性能影响不大。

随便写个代码oom下,就都了解了。

Java HotSpot(TM) Client VM (25.45-b02) for windows-x86 JRE (1.8.0_45-b14), built on Apr 10 2015 10:46:40 by "java_re" with MS VC++ 10.0 (VS2010)
Memory: 4k page, physical 8294668k(3869072k free), swap 9605388k(1961212k free)
CommandLine flags: -XX:InitialHeapSize=16777216 -XX:MaxHeapSize=62914560 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:-UseLargePagesIndividualAllocation
0.157: [GC (Allocation Failure) 0.157: [DefNew: 1431K->512K(4928K), 0.0023910 secs]0.159: [Tenured: 176K->687K(10944K), 0.0024891 secs] 1431K->687K(15872K), [Metaspace: 118K->118K(4480K)], 0.0051050 secs] [Times: user=0.03 sys=0.00, real=0.00 secs]
0.162: [Full GC (Allocation Failure) 0.162: [Tenured: 687K->666K(40960K), 0.0023773 secs] 687K->666K(45952K), [Metaspace: 118K->118K(4480K)], 0.0026923 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
 def new generation   total 18432K, used 765K [0x04e00000, 0x06200000, 0x06200000)
  eden space 16384K,   4% used [0x04e00000, 0x04ebf450, 0x05e00000)
  from space 2048K,   0% used [0x05e00000, 0x05e00000, 0x06000000)
  to   space 2048K,   0% used [0x06000000, 0x06000000, 0x06200000)
 tenured generation   total 40960K, used 666K [0x06200000, 0x08a00000, 0x08a00000)
   the space 40960K,   1% used [0x06200000, 0x062a68e8, 0x062a6a00, 0x08a00000)
 Metaspace   used 120K, capacity 2248K, committed 2368K, reserved 4480K

强引用,不进行垃圾回收。

软引用,在内存紧张的时候回收。

弱引用,只能生存到下次垃圾收集时候。

虚引用,垃圾收集时候会收到系统通知。

参考

http://www.cnblogs.com/ggjucheng/p/3977384.html

最新文章

  1. Mac&iOS之多线程--转自http://geeklu.com/2012/02/thread/
  2. java程序转换excel中科学记数法的数据为date类型
  3. Android showing LoadingView or EmptyView for Activity or Fragment
  4. 简述C#中关键字var和dynamic的区别
  5. oracle----sqlldr用法
  6. ssh连接慢
  7. nginx配置location [=|~|~*|^~] /uri/ { … }用法
  8. Mina airQQ聊天 服务端篇(二)
  9. 嵌套查询别名必须性示例。HAVING用法
  10. Sublime Text3 快捷键汇总及设置快捷键配置环境变量
  11. python 匿名函数与三元运算
  12. requests中自定义adapter
  13. 深度学习原理与框架-Tfrecord数据集的读取与训练(代码) 1.tf.train.batch(获取batch图片) 2.tf.image.resize_image_with_crop_or_pad(图片压缩) 3.tf.train.per_image_stand..(图片标准化) 4.tf.train.string_input_producer(字符串入队列) 5.tf.TFRecord(读
  14. 【Spark 深入学习 -09】Spark生态组件及Master节点HA
  15. 开源小程序CMS网站, JeeWx-App-CMS 1.0 首版本发布
  16. 谨慎注意WebBrowser控件的DocumentCompleted事件
  17. Couldn't find an AF_INET address for
  18. spring data 自定义接口
  19. ubuntun16.0 登陆密码忘记
  20. 【BZOJ3930】[CQOI2015] 选数(容斥)

热门文章

  1. 黄聪:phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护
  2. Warning: in_array() expects parameter 2 to be array, string given in D:\wamp\www\suiji.php on line 26
  3. js限制输入框只能输入数字
  4. struts2+spring+hibernate(SSH)框架的搭建和总结
  5. COGS461. [网络流24题] 餐巾
  6. <<< 入侵网站思路
  7. Structure Of Management Information - SNMP Tutorial
  8. java8--类加载机制与反射(java疯狂讲义3复习笔记)
  9. 大熊君{{bb}}------春节期间你跳槽了吗?
  10. poj1062 昂贵的聘礼