一个JVM实例只有一个堆内存,堆也是Java内存管理的核心区域,堆在JVM启动的时候创建,其空间大小也被创建(一般初始大小-Xms为内存的64分之一,最大-Xmx为4分之一),是JVM中最大的一块内存空间,所有线程共享Java堆,物理上不连续的逻辑上连续的内存空间。
几乎所有的实例都在这里分配内存,在方法结束后,堆中的对象不会马上删除,仅仅在垃圾收集的时候被删除,堆是GC(垃圾收集器)执行垃圾回收的重点区域。
一般堆里面又分为逻辑上有三个部分。
Java7及以前将堆空间逻辑上分成三部分:新生区+养老区+永久代
Java8及以后将堆内存逻辑上分为:新生区+养老区+元空间
那么下面就做一个实验来
首先在idea启动的VM Options中设置-Xms1m -Xmx1m -XX:+PrintGCDetails
,意思就是设置初始和最大的空间为1M,一般初始和最大要设置一样,以免内存大小一直变化导致出现问题。然后就是打印GC的信息。
接下来,写一段程序
public static void main(String[] args) throws Exception {
long maxMemory = Runtime.getRuntime().maxMemory();
long totalMemory= Runtime.getRuntime().totalMemory();
System.out.println("-Xmx" + maxMemory / (double) 1024 / 1024 + "MB");
System.out.println("-Xms" + totalMemory / (double) 1024 / 1024 + "MB");
String s= "e";
for (int i =