深入浅析JVM中的参数分配

  介绍

深入浅析JVM中的参数分配?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

- xx: + PrintGC使用这个参数,虚拟机启动后,只要遇到GC就会打印日志

- xx: + UseSerialGC配置串行回收器

- xx: + PrintGCDetails可以查看详细信息,包括各个区的情况

xms:设置Java程序启动时初始化堆大小

- xmx:设置Java程序能获得最大的堆大小

-Xmx20m -Xms5m - xx: + PrintCommandLineFlags:可以将隐式或者显示传给虚拟机的参数输出

在实际工作中,我们可以直接将初始的堆大小与最大堆大小设置相等,这样的好处是可以减少程序运行时的垃圾回收次数,从而提高性能。

- xx: + PrintGC -Xms5m -Xmx20m - xx: + UseSerialGC - xx: + PrintGCDetails - xx: + PrintCommandLineFlags

<强>运行一下演示:

包com.ietree.basicskill.jvm;
  
  公开课Demo01 {
  公共静态void main (String [] args) {//- xx: + PrintGC -Xms5m -Xmx20m - xx: + UseSerialGC - xx: + PrintGCDetails - xx: + PrintCommandLineFlags//查看GC信息
  System.out.println (max记忆:“;+ Runtime.getRuntime () .maxMemory ());
  System.out.println(“空闲内存:“+ Runtime.getRuntime () .freeMemory ());
  System.out.println(“总内存:“+ Runtime.getRuntime () .totalMemory ());
  
  byte [] b1=new字节(1 * 1024 * 1024);
  System.out.println(“分配了1 m");
  System.out.println (max记忆:“;+ Runtime.getRuntime () .maxMemory ());
  System.out.println(“空闲内存:“+ Runtime.getRuntime () .freeMemory ());
  System.out.println(“总内存:“+ Runtime.getRuntime () .totalMemory ());
  
  byte [] b2=new字节(4 * 1024 * 1024);
  System.out.println(“分配了4 m");
  System.out.println (max记忆:“;+ Runtime.getRuntime () .maxMemory ());
  System.out.println(“空闲内存:“+ Runtime.getRuntime () .freeMemory ());
  System.out.println(“总内存:“+ Runtime.getRuntime () .totalMemory ());
  
  }
  }

程序输出:

 - xx: InitialHeapSize=5242880 - xx: MaxHeapSize=20971520 - xx: + PrintCommandLineFlags - xx: + PrintGC - xx: + PrintGCDetails - xx: + UseCompressedClassPointers - xx: + UseCompressedOops - xx: -UseLargePagesIndividualAllocation - xx: + UseSerialGC
  最大内存:20316160
  空闲内存:5286032
  总内存:6094848
  [GC(分配失败)[DefNew: 789 k→191 k (1856 k), 0.0026441秒]789 k→530 k (5952 k), 0.0027627秒][:用户=0.00 sys=0.00,真实=0.00秒)
  分配了1米
  最大内存:20316160
  空闲内存:4469352
  总内存:6094848
  [GC(分配失败)[DefNew: 1249 k→0 k (1856 k), 0.0022285秒][k终身:1554→1554 k (4096 k), 0.0031394秒]1587 k→1554 k (5952 k), [Metaspace: 2597 k→2597 k (1056768 k)], 0.0054980秒][:用户=0.00 sys=0.00,真实=0.01秒)
  分配了4米
  最大内存:20316160
  空闲内存:4538184
  总内存:10358784
  堆
  使用def新一代总1920 k, 68 k [0 x00000000fec00000 0 x00000000fee10000 0 x00000000ff2a0000)
  伊甸园空间1728 k, 3%使用[0 x00000000fec00000 0 x00000000fec113e0 0 x00000000fedb0000)
  从太空192 k, 0%使用[0 x00000000fedb0000 0 x00000000fedb0000 0 x00000000fede0000)
  空间192 k, 0%使用[0 x00000000fede0000 0 x00000000fede0000 0 x00000000fee10000)
  终身代总8196 k, 5650 k [0 x00000000ff2a0000 0 x00000000ffaa1000 0 x0000000100000000)
  空间8196 k, 68%使用[0 x00000000ff2a0000, 0 x00000000ff824888 0 x00000000ff824a00 0 x00000000ffaa1000)
  Metaspace使用2603 k,预留容量4486 k, 4864 k, 1056768 k
  类空间使用288 k,容量386 k, 512 k,保留1048576 k 

在此程序输出的结果中,可以看到堆的详细信息,比如可以看到它的新生代信息,老年代信息,永久区信息等。

<强>厦门:可以设置新生代的大小,设置一个比较大的新生代会减少老年代的大小,这个参数对系统性能以及GC行为有很大的影响,新生代大小一般会设置整个堆空间的1/3到1/4左右。

- <强> XX: SurvivorRatio: 用来设置新生代中伊甸园空间和从/到空间的比例。含义:- XX: SurvivorRatio=伊甸园/从=伊甸园/?br/>不同的堆分布情况,对系统执行会产生一定的影响,在实际工作中,应该根据系统的特点做出合理的配置,基本策略:尽可能将对象预留在新生代,减少老年代的GC次数。

除了可以设置新生代的绝对大小(厦门),还可以使用(- XX: NewRatio)设置新生代和老年代的比例:- XX: NewRatio=老年代/新生代。

-Xms20m -Xmx20m -Xmn1m - XX: SurvivorRatio=2 - XX: + PrintGCDetails

深入浅析JVM中的参数分配