jvm参数
JVM 类型以及编译器模式
- 类型:-server and -client
- 版本信息:-version and -showversion
- 编译器模式:-Xint(解释模式 执行所有【慢】), -Xcomp(JIT 编译器少部分功能), 和 - Xmixed(混合模式)
- 参数分类和即时(JIT)编译器诊断
- 标准参数
- X参数
- XX参数
- -XX:+PrintCompilation 输出一些关于从字节码转化成本地代码的编译过程
- -XX:+CITime JVM 关闭时得到各种编译的统计信息
- -XX:+PrintFlagsFinal and -XX:+PrintFlagsInitial 打印所有 XX 参数及值
- -XX:+PrintCommandLineFlags打印出那些已经被用户或者 JVM 设置过的详细的 XX 参数的名称和值
- -XX:+HeapDumpOnOutOfMemoryError and -XX:HeapDumpPath 堆内存快照
- -XX:OnOutOfMemoryError 当内存溢发生时,我们甚至可以可以执行一些指令
- -XX:PermSize and -XX:MaxPermSize 永久代堆内存
- -XX:InitialCodeCacheSize and -XX:ReservedCodeCacheSize代码缓存
- -XX:+UseCodeCacheFlushing当代码缓存被填满时让 JVM 放弃一些编译代码
内存调优
所有已制定的 HotSpot 内存管理和垃圾回收算法都基于一个相同的堆内存划分:新生代(young generation)里存储着新分配的和较年轻的对象,老年代(old generation)里存储着长寿的对象。在此之外,永久代(permanent generation)存储着那些需要伴随整个 JVM 生命周期的对象,比如,已加载的对象的类定义或者 String 对象内部 Cache。接下来,我们将假设堆内存是按照新生代、老年代和永久代这一经典策略划分的。然而,其他的一些堆内存划分策略也是可行的,一个突出的例子就是新的 G1 垃圾回收器,它模糊了新生代和老年代之间的区别。此外,目前的开发进程似乎表明在未来的 HotSpot JVM 版本中,将不会区分老年代和永久代。
- -Xms and -Xmx (or: -XX:InitialHeapSize and -XX:MaxHeapSize)指定 JVM 的初始和最大堆内存大小新生代垃圾回收
- -XX:NewSize and -XX:MaxNewSize新生代只是整个堆的一部分,新生代设置的越大,老年代区域就会减少
- -XX:NewRatio动态分配新生代与老生代比例
- -XX:SurvivorRatio 动态分配新生代的伊甸园区与幸存区(伊甸园区大于幸存区【俩个幸存区大小相同】)
- -XX:+PrintTenuringDistribution
- -XX:InitialTenuringThreshold, -XX:MaxTenuringThreshold and -XX:TargetSurvivorRatio
- -XX:+NeverTenure and -XX:+AlwaysTenure
GC 日志(垃圾收集)
作用:记录了每一次的 GC 的执行时间和执行结果,通过分析 GC 日志可以优化堆设置和 GC 设置,或者改进应用程序的对象分配模式
-XX:+PrintGC(- verbose:gc) 简单日志模式
1
2
3每一次新生代(young generation)的 GC 和每一次的 Full GC 打印一行信息。
[GC 246656K->243120K(376320K), 0.0929090 secs]
gc类型 gc使用的前的堆空间 gc使用后的堆大小 当前堆容量 gc持续时间XX:PrintGCDetails 详细 GC 日志模式
1
2
3
4
5
6[GC[PSYoungGen: 142816K->10752K(142848K)] 246648K->243136K(375296K), 0.0935090 secs]
[Times: user=0.55 sys=0.10, real=0.09 secs]
这是一次在 young generation 中的 GC,它将已使用的堆空间从 246648K 减少到了 243136K,用时 0.0935090 秒。此外我们还可以得到更多的信息:所使用的垃圾收集器(即 PSYoungGen)、young generation 的大小和使用情况(在这个例子中 “PSYoungGen” 垃圾收集器将 young generation 所使用的堆空间从 142816K 减少到 10752K)。
CPU 时间信息 =用户空间+系统空间
real gc运行真实时间-XX:+PrintGCTimeStamps 和 - XX:+PrintGCDateStamps【绝对时间】将时间和日期也加到 GC 日志中
- -Xloggc(- XX:+PrintGC - XX:+PrintGCTimeStamps)输出到指定的文件