JVM自动内存管理机制——Java内存区域(下)

一、虚拟机参数配置在上一篇《Java自动内存管理机制——Java内存区域(上)》中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置。1、Java堆参数设置a)下面是一些简单的使用参数其中最后一个是一个运行时参数设置的简单实例。一般-XX是系统级别的配置(日志信息,或者是配置使用什么样的垃圾回收器等等),后面跟上 表示启用。不是-XX基本上是对于应用层面的配置信息下面是一个简...

JVM自动内存管理机制——Java内存区域(下)

一、虚拟机参数配置

  在上一篇《Java自动内存管理机制——Java内存区域(上)》中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置。

  1、Java堆参数设置

  a)下面是一些简单的使用参数

  其中最后一个是一个运行时参数设置的简单实例。一般-XX是系统级别的配置(日志信息,或者是配置使用什么样的垃圾回收器等等),后面跟上 表示启用。不是-XX基本上是对于应用层面的配置信息

  

  下面是一个简单的实例:表示设置初始堆大小为5M,最大堆大小为20M,并将虚拟机的参数设置打印出来,后面会用示例程序来说明

  

  b)如下所示程序:

 1 package cn.jvm.test; 2  3 public class Test01 { 4  //-XX: PrintGC -Xms5m -Xmx20m -XX: UseSerialGC  -XX: PrintGCDetails -XX: PrintCommandLineFlags 5  6  public static void main(String[] args) { 7  8//查看GC信息 9System.out.println("没有分配时候");10System.out.println("最大堆内存==="   Runtime.getRuntime().maxMemory());11System.out.println("空闲内存==="   Runtime.getRuntime().freeMemory());12System.out.println("总内存==="   Runtime.getRuntime().totalMemory());13 14byte[] testByte1 = new byte[1024 * 1024];15System.out.println("分配了1M");16System.out.println("最大堆内存==="   Runtime.getRuntime().maxMemory());17System.out.println("空闲内存==="   Runtime.getRuntime().freeMemory());18System.out.println("总内存==="   Runtime.getRuntime().totalMemory());19 20byte[] testByte2 = new byte[4 * 1024 * 1024];21System.out.println("分配了4M");22System.out.println("最大堆内存==="   Runtime.getRuntime().maxMemory());23System.out.println("空闲内存==="   Runtime.getRuntime().freeMemory());24System.out.println("总内存==="   Runtime.getRuntime().totalMemory());25 26  }27 }

  然后配置上 -Xms5m -Xmx20m -XX: UseSerialGC -XX: PrintGCDetails -XX: PrintCommandLineFlags参数来运行查看结果信息,在IDEA中进入,然后在VM Options中设置上面配置的参数

  c)分析结果

"E:\Program Files\Java\jdk1.8.0_141\bin\java.exe" -Xms5m -Xmx20m -XX: UseSerialGC -XX: PrintGCDetails -XX: PrintCommandLineFlags "-javaagent:E:\Program Files\IntelliJ IDEA 2018.3.3\lib\idea_rt.jar=49362:E:\Program Files\IntelliJ IDEA 2018.3.3\bin" -Dfile.encoding=UTF-8 -classpath "E:\Program Files\Java\jdk1.8.0_141\jre\lib\charsets.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\deploy.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\access-bridge-64.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\cldrdata.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\dnsns.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\jaccess.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\jfxrt.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\localedata.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\nashorn.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\sunec.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\sunjce_provider.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\sunmscapi.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\sunpkcs11.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\zipfs.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\javaws.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\jce.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\jfr.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\jfxswt.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\jsse.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\management-agent.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\plugin.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\resources.jar;E:\Program Files\Java\jdk1.8.0_141\jre\lib\rt.jar;E:\IDEAProject\JVM\out\production\JVM" cn.jvm.test.Test01-XX:InitialHeapSize=5242880 -XX:MaxHeapSize=20971520 -XX: PrintCommandLineFlags -XX: PrintGCDetails -XX: UseCompressedClassPointers -XX: UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX: UseSerialGC [GC (Allocation Failure) [DefNew: 1664K->192K(1856K), 0.0018176 secs] 1664K->605K(5952K), 0.0028416 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 没有分配时候最大堆内存===20316160空闲内存===5202432总内存===6094848分配了1M最大堆内存===20316160空闲内存===4149872总内存===6094848[GC (Allocation Failure) [DefNew: 1485K->31K(1856K), 0.0025246 secs][Tenured: 1626K->1658K(4096K), 0.0031723 secs] 1899K->1658K(5952K), [Metaspace: 3432K->3432K(1056768K)], 0.0061214 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 分配了4M最大堆内存===20316160空闲内存===4406496总内存===103587842112Heap def new generationtotal 1920K, used 76K [0x00000000fec00000, 0x00000000fee10000, 0x00000000ff2a0000)  eden space 1728K,4% used [0x00000000fec00000, 0x00000000fec13018, 0x00000000fedb0000)  from space 192K,0% used [0x00000000fedb0000, 0x00000000fedb0000, 0x00000000fede0000)  tospace 192K,0% used [0x00000000fede0000, 0x00000000fede0000, 0x00000000fee10000) tenured generationtotal 8196K, used 5754K [0x00000000ff2a0000, 0x00000000ffaa1000, 0x0000000100000000)the space 8196K,  70% used [0x00000000ff2a0000, 0x00000000ff83e998, 0x00000000ff83ea00, 0x00000000ffaa1000) Metaspace used 3469K, capacity 4496K, committed 4864K, reserved 1056768K  class space used 380K, capacity 388K, committed 512K, reserved 1048576KProcess finished with exit code 0
输出的整个结果

  我们通过查看输出结果和打印的日志信息,结合刚刚设置的参数来简单分析一下Java堆参数和程序运行的关系

  1)我们在参数设置中配置了–XX: PrintCommandLineFlags就会在结果中打印下面的信息

-XX:InitialHeapSize=5242880 -XX:MaxHeapSize=20971520 -XX: PrintCommandLineFlags -XX: PrintGCDetails -XX: UseCompressedClassPointers -XX: UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX: UseSerialGC 

  然后将这些信息做一简单的解释:

1 -XX:InitialHeapSize=5242880  //设置初始堆大小(我们在参数设置中设置为5M)2 -XX:MaxHeapSize=20971520  //设置最大堆大小(参数设置中设置为10M)3
源文地址:https://www.guoxiongfei.cn/cntech/9878.html