1.堆空間大小的設置
-
設置堆空間大小的參數
-Xms
用來設置堆空間(年輕代+老年代)的初始內存大小。-X
是jvm
的運行參數ms
是memory start
-Xmx
用來設置堆空間(年輕代+老年代)的最大內存大小。 -
默認堆空間的大小
如果不設置堆空間的大小:那么
初始堆內存大小:物理電腦內存大小1 / 64
。(64分之一)
最大堆內存大小:物理電腦內存大小1 / 4
。(4分之一) -
手動設置:-
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(); } } }
-
使用命令行的方式:
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/64
。16384Mb
除以 64 正好等於256Mb
。也反過來驗證了默認的初始堆的大小是物理內存大小的1/64
。
4.細心的同學可能注意到,上面在計算堆空間的大小的時候,只計算了新生代和老年代。沒有加上元空間的數據。也從側面證明了起始堆空間只包含新生代和老年代,是不包含元空間的。 -
使用JVM參數
-XX:+PrintGCDetails
選中Java
程序鼠標右擊,在Eclipse
的Run as -> Run Configurations
加入VM參數。如下圖所示。
點擊run
,會得到如下的輸出:
1.PSYoungGen
:新生代為76288K
2.新生代又分為eden
區65536K
,和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