Java

Java - JVM配置参数

2017-08-12  本文已影响109人  ThingLin

1.配置JVM

配置打印内存信息

-XX:+PrintGCDetails
image.png

运行打印出

image.png

2.各区参数

这是使用默认的垃圾回收器的参数,不同垃圾回收器回收策略不同对内存结构划分也不同,堆内存结构跟回收器有关,其中SerialGC、ParNewGC、ParallelGC、ParallelOldGC是以下结构。

Heap
 PSYoungGen      total 114688K, used 5898K [0x0000000740600000, 0x0000000748600000, 0x00000007c0000000)
  eden space 98304K, 6% used [0x0000000740600000,0x0000000740bc2a90,0x0000000746600000)
  from space 16384K, 0% used [0x0000000747600000,0x0000000747600000,0x0000000748600000)
  to   space 16384K, 0% used [0x0000000746600000,0x0000000746600000,0x0000000747600000)
 ParOldGen       total 262144K, used 0K [0x0000000641200000, 0x0000000651200000, 0x0000000740600000)
  object space 262144K, 0% used [0x0000000641200000,0x0000000641200000,0x0000000651200000)
 Metaspace       used 2658K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 286K, capacity 386K, committed 512K, reserved 1048576K

Heap 堆区:
  PSYoungGen 年轻代区
    eden 新对象区
    from from和to区是一样大小,gc清理的时候会遍历其中一个区把所有不可清理的对象拷贝到另一个区把可清理的留下然后清理,反复如此。
    to   
  ParOldGen 老年代区
    object space 老年龄对象区
  Metaspace 元数据区(方法区,永久区)
    class space 方法区

PSYoungGen区对象在被多次GC后没有清理会被移动到ParOldGen,可以指定GC次数后转移对象至老年代区。

3.参数配置

参数 说明
+ - +表示启用,-表示禁用
-XX:+PrintGCDetails 打印内存情况。
-XX:+UseSerialGC 使用串行垃圾回收器,串行垃圾回收器通过持有应用程序所有的线程进行工作。它为单线程环境设计,只使用一个单独的线程进行垃圾回收,通过冻结所有应用程序线程进行工作,所以可能不适合服务器环境。它最适合的是简单的命令行程序。
-XX:+UseParNewGC 新生代使用ParNewGC(SerialGC 的改进版也是个并行GC,线程数量使用XX:ParallelGCThreads指定线程数量),老年代使用SerialGC。
-XX:+UseParallelGC 使用并行垃圾回收器,并行垃圾回收器也叫做 throughput collector 。它是JVM的默认垃圾回收器。与串行垃圾回收器不同,它使用多线程进行垃圾回收。相似的是,当执行垃圾回收的时候它会冻结所有的应用程序线程。(-XX:MaxGCPauseMillis设置最大停顿时间;-XX:GCTimeRatio设置吞吐量大小0-100的值默认是99,这样系统花费不超过1/(1+99)的时间;-XX:+UseAdaptiveSizePolicy设置自适应模式,新生代以及其三区以及晋升老年代的GC次数都会自动调整)
-XX:+UseConcMarkSweepGC (非独占的垃圾回收器)使用并发标记扫描垃圾回收器 ,并发标记垃圾回收使用多线程扫描堆内存,标记需要清理的实例并且清理被标记过的实例。并发标记垃圾回收器只会在下面两种情况持有应用程序所有线程。当标记的引用对象在tenured区域;在进行垃圾回收的时候,堆内存的数据被并发的改变。相比并行垃圾回收器,并发标记扫描垃圾回收器使用更多的CPU来确保程序的吞吐量。如果我们可以为了更好的程序性能分配更多的CPU,那么并发标记上扫描垃圾回收器是更好的选择相比并发垃圾回收器。可以通过-XX:ParallelCMSThreads设置使用的线程数量。-XX:CMSlnitiatingOccupancyFraction设置阀值(默认68,老年代内存使用到达68%进行内存回收),到达指定阀值进行回收,如果回收过程中内存已经不足,CMS回收失败,JVM会启动ParallelOldGC进行垃圾回收。-XX:+UseCMSCompactAtFullCollection设置CMS回收完后进行一次碎片整理,-XX:CMSFullGCsBeforeCompaction设置CMS进行多少次回收之后进行一次内存压缩。
-XX:+UseG1GC 使用G1垃圾回收器,G1是jdk1.7提出的,G1垃圾回收器适用于堆内存很大的情况,他将堆内存分割成不同的区域,并且并发的对其进行垃圾回收。G1也可以在回收内存之后对剩余的堆内存空间进行压缩。并发扫描标记垃圾回收器在STW情况下压缩内存。G1垃圾回收会优先选择第一块垃圾最多的区域。-XX:MaxGCPauseMillis设置最大停顿时间,-XX:ParallelGCThreads并行回收线程数量。
-XX:+PrintGC gc一来就会打印回收情况log到控制台
-Xloggc:路径 配置gclog输出到的目录
-Xms 初始化堆内存大小,一般会设置成和-Xmx一样大
-Xmx 堆内存最大
-Xmn 新生代大小,一般设置成堆的1/3。
-XX:PermSize 初始化永久代大小
-XX:MaxPermSize 永久代最大
-XX:SurvivorRatio eden空间和from/to空间的比例(eden/from),一般2。
-XX:HeapDumpPath 值是文件全路径.dump,内存泄露会写出一个dump文件可以用工具分析,需要配置-XX:+HeapDumpOnOutOfMemoryError
-Xss 最大栈
-XX:MaxTenuringThreshold 新生代对象在被这个参数指定次数的GC后转移到老年代区(默认-XX:MaxTenuringThreshold=15)
-XX:PretenureSizeThreshold 设置对象超过多大直接放入老年代
TLAB区配置(Thread Local Allocation Buffer) jdk1.7后TLAB区有自己调整的方式,不需要自己配置。TLAB能够提升对象创建速度提高程序运行效率。
-XX:+UseTLAB 使用TLAB
-XX:+TLABSize 设置TLAB大小
-XX:TLABRefillWasteFraction 设置维护进入TLAB空间单个对象大小,比例值,默认1/64,对象大于该值会去堆创建。
-XX:+PrintTLAB 打印TLAB信息
-XX:ResizeTLAB 自调整TLABRefillWasteFraction 阀值。

出现以下问题OutOfMemoryError-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\log\JVMParam.dump配置会在配置路径写下一个dump文件可供专门工具分析内存

image.png

4.工作模式

老版本jvm区分client模式server模式,在1.6之后不需要考虑client模式,默认都是server模式。

image.png
上一篇 下一篇

猜你喜欢

热点阅读