29.JVM堆空間大小的設置和查看

1.堆空間大小的設置

  1. 設置堆空間大小的參數
    -Xms 用來設置堆空間(年輕代+老年代)的初始內存大小。
    -Xjvm的運行參數
    msmemory start
    -Xmx 用來設置堆空間(年輕代+老年代)的最大內存大小。

  2. 默認堆空間的大小
    如果不設置堆空間的大小:那麼
    初始堆內存大小:物理電腦內存大小 1 / 64。(64分之一)
    最大堆內存大小:物理電腦內存大小 1 / 4。(4分之一)

  3. 手動設置:-Xms600m -Xmx600m
    開發中建議將初始堆內存和最大的堆內存設置成相同的值。設置成相同的值避免了頻繁的回收和重新分配堆內存。
    在這裏插入圖片描述

2.堆空間大小的查看

運行下面的Java程序:

package jvn;
public class HeapSpace {
    public static void main(String[] args) {
        //返回Java虛擬機中的堆內存總量
        long initialMemory = Runtime.getRuntime().totalMemory() / 1024 / 1024;
        //返回Java虛擬機試圖使用的最大堆內存量
        long maxMemory = Runtime.getRuntime().maxMemory() / 1024 / 1024;
        System.out.println("-Xms : " + initialMemory + "M");
        System.out.println("-Xmx : " + maxMemory + "M");
//        System.out.println("系統內存大小爲:" + initialMemory * 64.0 / 1024 + "G");
//        System.out.println("系統內存大小爲:" + maxMemory * 4.0 / 1024 + "G");
        try {
            Thread.sleep(1000000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
  1. 使用命令行的方式:jps / jstat -gc 進程id
    a) 打開命令行,輸入jps。查看當前運行的java程序的進程號。可以看到當前運行的java程序的進程號是20204
    在這裏插入圖片描述
    b) 運行jstat -gc 22024。查看堆空間內存分配情況
    可以看到:堆內存分爲了新生代(Survivor區和Eden區),老年代。圖中也標註除了元空間,但是它佔的空間不屬於堆。
    OC:表示的是老年代分配的大小,OU是老年代被使用的大小。同理,其他的xC表示的某某區是分配空間的大小,xU表示的某某區是被使用的空間大小。
    在這裏插入圖片描述
    1.總共的堆空間的大小爲S1C + EC + OC = 2048 + 11264 + 248832 = 262144kb = 256Mb
    2.值得注意的一點是:Survivor區又分爲s0區和s1區,這兩個區總有一個是空的,也就是不佔空間。
    3.自己電腦的內存爲16GB = 16384Mb。前面說過默認的初始堆的大小爲物理內存大小的1/6416384Mb 除以 64 正好等於 256Mb。也反過來驗證了默認的初始堆的大小是物理內存大小的1/64
    4.細心的同學可能注意到,上面在計算堆空間的大小的時候,只計算了新生代和老年代。沒有加上元空間的數據。也從側面證明了起始堆空間只包含新生代和老年代,是不包含元空間的。

  2. 使用JVM參數 -XX:+PrintGCDetails
    選中Java程序鼠標右擊,在EclipseRun as -> Run Configurations加入VM參數。如下圖所示。
    在這裏插入圖片描述
    點擊run,會得到如下的輸出:
    1.PSYoungGen:新生代爲76288K
    2.新生代又分爲eden65536K,和s0區(from space),s1區(to space)。
    3.ParOldGen:老年代175104K
    4.Metaspace:元空間

-Xms : 245M
-Xmx : 3630M
Heap
 PSYoungGen      total 76288K, used 3932K [0x000000076af00000, 0x0000000770400000, 0x00000007c0000000)
  eden space 65536K, 6% used [0x000000076af00000,0x000000076b2d7240,0x000000076ef00000)
  from space 10752K, 0% used [0x000000076f980000,0x000000076f980000,0x0000000770400000)
  to   space 10752K, 0% used [0x000000076ef00000,0x000000076ef00000,0x000000076f980000)
 ParOldGen       total 175104K, used 0K [0x00000006c0c00000, 0x00000006cb700000, 0x000000076af00000)
  object space 175104K, 0% used [0x00000006c0c00000,0x00000006c0c00000,0x00000006cb700000)
 Metaspace       used 2550K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 279K, capacity 386K, committed 512K, reserved 1048576K

更多JVM文章請訪問我的JVM專欄:
https://blog.csdn.net/u011069294/category_10113093.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章