常见 JDK 的内存机制
下面以 Sun 的 JDK 为例,讲述 JDK 一般的内存机制。
Java 的内存由三个代组成,如下图所示:
Java 内存的这三个代分别为:
-
Young(年青代,也叫 new 区):
-
Tenured(保持代,也叫 old 区)
-
Perm(永久代)
Young 还可以分为 Eden 区和两个 Survivor 区(from 和 to,这两个 Survivor 区大小严格一至),新的对象实例总是首先放在 Eden 区,Survivor 区作为 Eden 区和Tenure(old)的缓冲,可以向 Tenure(old)转移活动的对象实例。
Tenure 中存放生命周期长久的实例对象,但是里面的对象也是会被回收掉。这里,Young 和 Tenured 就组成了 Java 的所谓堆内存,也就是大家经常提到的 heap内存,或 heap 区。
Perm(perm)则是非堆内存的组成部分。主要存放加载的 Class 类级对象如 class 本身,method、field 等等。
那图中标示的 Virtual 区又是干什么的呢?
其实,在 JVM 启动时,就已经保留了固定的内存空间给 Heap 内存,这部分内存并不一定都会被 JVM 使用,但是可以确定的是这部分保留的内存不会被其他进程使用,这部分内存大小由“-Xmx”参数指定。
影响这个的另一个参数是“-Xms”,如果“-Xms”指定的值比“-Xmx”的小,那么两者的差值就是 Virtual 内存值。
随着程序的运行,Eden 区、Tenured 区和 Perm 区会逐渐使用保留的 Virtual 空间。。