目录

  • 1.堆空间大小的设置
  • 2.堆空间大小的查看


1.堆空间大小的设置

  1. 设置堆空间大小的参数
    -Xms 用来设置堆空间(年轻代+老年代)的初始内存大小。
    -Xjvm的运行参数
    msmemory start-Xmx 用来设置堆空间(年轻代+老年代)的最大内存大小。
  2. 默认堆空间的大小
    如果不设置堆空间的大小:那么
    初始堆内存大小:物理电脑内存大小 1 / 64。(64分之一)
    最大堆内存大小:物理电脑内存大小 1 / 4。(4分之一)
  3. 手动设置:-Xms600m -Xmx600m 开发中建议将初始堆内存和最大的堆内存设置成相同的值。设置成相同的值避免了频繁的回收和重新分配堆内存。
  4. top res 和jvm 堆 jvm堆大小_-Xmx

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
  2. top res 和jvm 堆 jvm堆大小_堆空间大小的设置_02

  3. b) 运行jstat -gc 22024。查看堆空间内存分配情况
    可以看到:堆内存分为了新生代(Survivor区和Eden区),老年代。图中也标注除了元空间,但是它占的空间不属于堆。
    OC:表示的是老年代分配的大小,OU是老年代被使用的大小。同理,其他的xC表示的某某区是分配空间的大小,xU表示的某某区是被使用的空间大小。
  4. top res 和jvm 堆 jvm堆大小_堆空间大小的查看_03

  5. 1.总共的堆空间的大小为S1C + EC + OC = 2048 + 11264 + 248832 = 262144kb = 256Mb
    2.值得注意的一点是:Survivor区又分为s0区和s1区,这两个区总有一个是空的,也就是不占空间。
    3.自己电脑的内存为16GB = 16384Mb。前面说过默认的初始堆的大小为物理内存大小的1/6416384Mb 除以 64 正好等于 256Mb。也反过来验证了默认的初始堆的大小是物理内存大小的1/64
    4.细心的同学可能注意到,上面在计算堆空间的大小的时候,只计算了新生代和老年代。没有加上元空间的数据。也从侧面证明了起始堆空间只包含新生代和老年代,是不包含元空间的。
  6. 使用JVM参数 -XX:+PrintGCDetails 选中Java程序鼠标右击,在EclipseRun as -> Run Configurations加入VM参数。如下图所示。
  7. top res 和jvm 堆 jvm堆大小_堆空间大小的设置_04

  8. 点击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