JVM之对分配参数详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
运行一下Demo:
package com.ietree.basicskill.jvm; public class Demo01 { public static void main(String[] args) { // -XX:+PrintGC -Xms5m -Xmx20m -XX:+UseSerialGC -XX:+PrintGCDetails -XX:+PrintCommandLineFlags //查看GC信息 System.out.println("max memory:" + Runtime.getRuntime().maxMemory()); System.out.println("free memory:" + Runtime.getRuntime().freeMemory()); System.out.println("total memory:" + Runtime.getRuntime().totalMemory()); byte[] b1 = new byte[1*1024*1024]; System.out.println("分配了1M"); System.out.println("max memory:" + Runtime.getRuntime().maxMemory()); System.out.println("free memory:" + Runtime.getRuntime().freeMemory()); System.out.println("total memory:" + Runtime.getRuntime().totalMemory()); byte[] b2 = new byte[4*1024*1024]; System.out.println("分配了4M"); System.out.println("max memory:" + Runtime.getRuntime().maxMemory()); System.out.println("free memory:" + Runtime.getRuntime().freeMemory()); System.out.println("total memory:" + Runtime.getRuntime().totalMemory()); } }
程序输出:
-XX:InitialHeapSize=5242880 -XX:MaxHeapSize=20971520 -XX:+PrintCommandLineFlags -XX:+PrintGC -XX:+PrintGCDetails -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseSerialGC max memory:20316160 free memory:5286032 total memory:6094848 [GC (Allocation Failure) [DefNew: 789K->191K(1856K), 0.0026441 secs] 789K->530K(5952K), 0.0027627 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 分配了1M max memory:20316160 free memory:4469352 total memory:6094848 [GC (Allocation Failure) [DefNew: 1249K->0K(1856K), 0.0022285 secs][Tenured: 1554K->1554K(4096K), 0.0031394 secs] 1587K->1554K(5952K), [Metaspace: 2597K->2597K(1056768K)], 0.0054980 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 分配了4M max memory:20316160 free memory:4538184 total memory:10358784 Heap def new generation total 1920K, used 68K [0x00000000fec00000, 0x00000000fee10000, 0x00000000ff2a0000) eden space 1728K, 3% used [0x00000000fec00000, 0x00000000fec113e0, 0x00000000fedb0000) from space 192K, 0% used [0x00000000fedb0000, 0x00000000fedb0000, 0x00000000fede0000) to space 192K, 0% used [0x00000000fede0000, 0x00000000fede0000, 0x00000000fee10000) tenured generation total 8196K, used 5650K [0x00000000ff2a0000, 0x00000000ffaa1000, 0x0000000100000000) the space 8196K, 68% used [0x00000000ff2a0000, 0x00000000ff824888, 0x00000000ff824a00, 0x00000000ffaa1000) Metaspace used 2603K, capacity 4486K, committed 4864K, reserved 1056768K class space used 288K, capacity 386K, committed 512K, reserved 1048576K
在此程序输出的结果中,可以看到堆的详细信息,比如可以看到它的新生代信息、老年代信息、永久区信息等。
二、新生代参数配置
-Xmn:可以设置新生代的大小,设置一个比较大的新生代会减少老年代的大小,这个参数对系统性能以及GC行为有很大的影响,新生代大小一般会设置整个堆空间的1/3到1/4左右。
-XX:SurvivorRatio:用来设置新生代中eden空间和from/to空间的比例。含义:-XX:SurvivorRatio=eden/from=eden/to。
不同的堆分布情况,对系统执行会产生一定的影响,在实际工作中,应该根据系统的特点做出合理的配置,基本策略:尽可能将对象预留在新生代,减少老年代的GC次数。
除了可以设置新生代的绝对大小(-Xmn),还可以使用(-XX:NewRatio)设置新生代和老年代的比例:-XX:NewRatio=老年代/新生代。
以上是关于JVM之对分配参数详解的主要内容,如果未能解决你的问题,请参考以下文章