Java入门之了解JVM(23)

JVM内存模型划分规范

图片源自网络

Java入门之了解JVM

可以看出,在JVM内存模型规范中,可以将整个JVM运行时数据库划分为2种类型

线程共享数据区域:

方法区用于存放已被加载的:类信息、静态变量、即时编译产生的代码方法区其实位于堆内存中,但它却叫No-Heap(非堆),这个主要是因为方法区存储的内容和JVM其管理策略方面和其它的堆内存稍有不同(谈GC再说这问题)需要注意1:在Sun HotSpot虚拟机的实现中,方法区被称为永久代,寓意为用于存放“永久”信息的区域需要注意2:在JDK8中,永久代被MetaSpace(元空间)所取替,即JDK8后方法区的实现叫元空间;永久代被取替的主要原因是,GC本来就很少光顾永久代(只有Full GC时才清理垃圾),而永久代又有-XX:MaxPermSize上限,所以大大加大了内存溢出(OutOfMemoryError)的机率;而MetaSpace(元空间)位于物理内存,如果不限定空间上限,原则上受限于物理内存的大小,由此降低了内存溢出的可能运行时常量池运行时常量池是位于堆(JDK 1.6以后,可以通过OOM错误来观察位置)还有特别要注意的是,所谓的字符串常量池还有装箱类中的valueOf()中的缓存都位于这里堆内存存放几乎所有的Java对象(小部分经过内存逃逸分析(属于JIT优化),可以在虚拟机栈中分配到内存)线程隔离数据区域:

推荐阅读