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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐