29.JVM堆空间大小的设置(-Xms和-Xmx)和查看
目录1.堆空间大小的设置2.堆空间大小的查看1.堆空间大小的设置设置堆空间大小的参数-Xms 用来设置堆空间(年轻代+老年代)的初始内存大小。-X 是jvm的运行参数ms 是memory start-Xmx 用来设置堆空间(年轻代+老年代)的最大内存大小。默认堆空间的大小如果不设置堆空间的大小:那么初始堆内存大小:物理电脑内存大小 1 / 64。(64分之一)最大堆内存大小:物理电脑内存大小 1
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
更多JVM文章请访问我的JVM专栏:
https://blog.csdn.net/u011069294/category_10113093.html
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)