zoukankan      html  css  js  c++  java
  • (适合入门)JVM堆内存相关的启动参数:年轻一代、岁和永久代内存分配

    假设你要观察JVM进程消耗的堆内存,通过命令工具jmap或可视化工具jvisualvm.exe。JVM这些参数的默认启动值。假设你想知道JVM内存分配策略,最开始手动设置这些参数。通过JDK统计结果,进行对照,就比較easy理解这些内存分配的理论知识。

    执行环境是win7 32位操作系统,JDK1.7.0_60版本号。

    測试代码和JVM启动參数例如以下:

    public class Test
    {
        public static void main(String[] args)
        {
            int a = 0;
            while (true)
            {
                a++;
            }
        }
    }
    -Xms=200M  -Xmx200M -XX:NewSize=100M -Xmn100M -XX:SurvivorRatio=8 
    -XX:OldSize=60M -XX:PermSize=50M -XX:MaxPermSize=50M

    执行上述代码。通过jps命令获取到进程pid。然后通过jmap -heap pid就能够查看内存分配和使用情况。

    >jmap -heap 8912
    Attaching to process ID 8912, please wait...
    Debugger attached successfully.
    Client compiler detected.
    JVM version is 24.60-b09
    
    using thread-local object allocation.
    Mark Sweep Compact GC
    
    Heap Configuration:
       MinHeapFreeRatio = 40
       MaxHeapFreeRatio = 70
       MaxHeapSize      = 209715200 (200.0MB)
       NewSize          = 104857600 (100.0MB)
       MaxNewSize       = 104857600 (100.0MB)
       OldSize          = 62914560 (60.0MB)
       NewRatio         = 3
       SurvivorRatio    = 8
       PermSize         = 52428800 (50.0MB)
       MaxPermSize      = 52428800 (50.0MB)

    这里显示的堆配置參数。都能够通过JVM启动參数来设置。

    以下来解释下几个重要參数的含义:


    -Xms 和 -Xmx (-XX:InitialHeapSize 和 -XX:MaxHeapSize):指定JVM初始占用的内存和最大堆内存。JVM也是一个软件。也必需要获取本机的物理内

    存,然后JVM会负责管理向操作系统申请到的内存资源。JVM启动的时候会向操作系统申请 -Xms 设置的内存。JVM启动后执行一段时间。假设发现内存空间

    不足,会再次向操作系统申请内存。

    JVM可以获取到的最大堆内存是-Xmx设置的值。


    -XX:NewSize 和 -Xmn(-XX:MaxNewSize):指定JVM启动时分配的新生代内存和新生代最大内存。


    -XX:SurvivorRatio:设置新生代中1个Eden区与1个Survivor区的大小比值。

    在hotspot虚拟机中。新生代 = 1个Eden + 2个Survivor。假设新生代内存是  

    10M。SurvivorRatio=8,那么Eden区占8M,2个Survivor区各占1M。


    -XX:NewRatio:指定老年代/新生代的堆内存比例。在hotspot虚拟机中,堆内存 = 新生代 + 老年代。

    假设-XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆内存的1/5。

    在设置了-XX:MaxNewSize的情况下,-XX:NewRatio的值会被忽略,老年代的内存=堆内存 - 新生代内存。老年代的最大内存 = 堆内存 - 新生代 最大内存。


    -XX:OldSize:设置JVM启动分配的老年代内存大小,类似于新生代内存的初始大小-XX:NewSize。


     -XX:PermSize 和 -XX:MaxPermSize:指定JVM中的永久代(方法区)的大小。

    能够看到:永久代不属于堆内存,堆内存仅仅包括新生代和老年代


    能够发现:堆内存、新生代内存、老年代内存、永久代内存,都有一个初始内存,另一个最大内存。

    以下以老年代的初始内存和最大内存为例,看下内存变化的效果,其它的应该类似。測试代码例如以下:

    public class TurnedTest
    {
        private static List<String> list = new ArrayList<String>();
    
        public static void main(String[] args)
        {
            int a = 0;
            while (true)
            {
                a++;
    
                list.add("demo");
            }
    
        }
    }
    显然这个程序存在内存泄露。终于会占满整个堆内存,抛出OOM。为了看清楚这个演变的过程,我们在while循环中加入一个断点,设置breakpoint properties中的"hit count"为100000,以debug模式执行上面的程序。然后使用jmap观察内存占用情况。

       tenured generation:
       capacity = 62914560 (60.0MB)
       used     = 0 (0.0MB)
       free     = 62914560 (60.0MB)
       0.0% used
    
       
       tenured generation:
       capacity = 62914560 (60.0MB)
       used     = 16409080 (15.648918151855469MB)
       free     = 46505480 (44.35108184814453MB)
       26.08153025309245% used
       
       tenured generation:
       capacity = 62914560 (60.0MB)
       used     = 53329496 (50.858970642089844MB)
       free     = 9585064 (9.141029357910156MB)
       84.76495107014973% used
       
       tenured generation:
       capacity = 104857600 (100.0MB)
       used     = 84217880 (80.3164291381836MB)
       free     = 20639720 (19.683570861816406MB)
       80.3164291381836% used
    
    能够发现老年代内存从最開始的60M,扩大到最大值100M。



    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    实际项目管理-1
    arcengine 错误
    一些视频技术类网站
    winform 组件之dotnetbar10.5.3
    winform 弹框的组件
    一个好的开源网站
    写webservice 注意点
    ww
    js
    瀑布流
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4641366.html
Copyright © 2011-2022 走看看