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

JVM 1.6 GC的更多相关文章

  1. JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)

    引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法,而且几乎是一定会有,因为LZ相信高人们的能力. 那么分代搜集算法是怎么处理GC的呢? 对象分 ...

  2. JVM内存管理------GC简介

    为何要了解GC策略与原理? 原因在上一章其实已经有所触及,就是因为在平时的工作和研究当中,不可避免的会遇到内存溢出与内存泄露的问题.如果对GC策略与原理不了解的情况下碰到了前面所说的问题,很多时候会让 ...

  3. JVM系列二:GC策略&内存申请、对象衰老

    JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generatio ...

  4. JVM学习之GC常用算法

    出处:博客园左潇龙的技术博客--http://www.cnblogs.com/zuoxiaolong,多谢分享 GC策略解决了哪些问题? 既然是要进行自动GC,那必然会有相应的策略,而这些策略解决了哪 ...

  5. jvm系列:Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...

  6. JVM基础系列第14讲:JVM参数之GC日志配置

    说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...

  7. 【转载】JVM系列二:GC策略&内存申请、对象衰老

    JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generatio ...

  8. 触发JVM进行Full GC的情况及应对策略

    堆内存划分为 Eden.Survivor 和 Tenured/Old 空间,如下图所示: 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为M ...

  9. JVM架构和GC垃圾回收机制

    深入理解系列之JDK8下JVM虚拟机(1)——JVM内存组成 https://blog.csdn.net/u011552404/article/details/80306316 JVM架构和GC垃圾回 ...

  10. java面试题之----JVM架构和GC垃圾回收机制详解

    JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...

随机推荐

  1. 如何解决wow.js与fullpage的兼容性

    项目需要做到全屏显示的同时还需要做到实时执行动画.但是发现在使用fullpage之后,wow.js(不知道这个是啥的点击这里)不起作用. 找了诸多资料,解决方法如下: $('#fullpage').f ...

  2. import第三方库的头文件找不到的错误

    问题描述:使用cocoapods导入了第三方库,import该第三方库的某个头文件,然后编译报错找不到这个头文件内所import的头文件. 产生原因:我们需要配置头文件的搜索路径,告诉系统头文件的路径 ...

  3. Android Studio各种快捷功能及好用的插件

    转载:http://www.jianshu.com/p/c439605a4364 概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的, ...

  4. linux下压缩,解压缩的方法

    linux zip命令 zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip - ...

  5. Android热修复AndFix

    热修复主要用来修复代码.修复bug.添加独立的功能,他的原理主要是操作PathClassLoader.DexClassLoader. PathClassLoader是类加载器,DexClassLoad ...

  6. String类的功能

    String类              标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ...

  7. Linux终端最常用快捷键

    新建终端窗口: crtl+shift+N 终端的漂移/切换:shift+左右箭头 挂 起:crtl+s 解除挂起:crtl+q 清 屏:crtl+l 命令行光标移动: crtl+a 移动到命令行首 c ...

  8. "Emgu.CV.CvInvoke”的类型初始值设定项引发异常 解决办法

    系统win7 32位,只在这一台电脑上出现这种问题,已知VS编译是X86,在数台电脑上测试都正常. 后来把opencv的dll路径例如 E:\...\x86  加入到系统环境变量中就正常了. emgu ...

  9. mui jquery 同时使用

    (function ($, doc, $$) { $.init(); $.ready(function () { var cityPicker = new $.PopPicker({ layer: } ...

  10. FlexPaper+SWFTool+操作类=在线预览PDF

    引言 由于客户有在线预览PDF格式的需求,在网上找了一下解决方案,觉得FlexPaper用起来还是挺方便的,flexpaper是将pdf转换为swf格式的文件预览的,所以flexpaper一般和swf ...