JVM虚拟内存结构可以分为公有和私有两部分.
公有部分内存
公有指所有线程共享的部分: Java堆,方法区,常量池
Java堆
用于Java实例对象的内存分配的区域.几乎所有的实例对象都会在这里进行内存分配(栈上分配)
Java 堆根据对象存活时间的不同,Java 堆还被分为年轻代、老年代两个区域,年轻代还被进一步划分为 Eden 区、From Survivor 0、To Survivor 1 区
当有对象需要分配时,一个对象永远优先被分配在年轻代的 Eden 区,等到 Eden 区域内存不够时,Java 虚拟机会启动垃圾回收。此时 Eden 区中没有被引用的对象的内存就会被回收,而一些存活时间较长的对象则会进入到老年代。在 JVM 中有一个名为 -XX:MaxTenuringThreshold
的参数专门用来设置晋升到老年代所需要经历的 GC 次数,即在年轻代的对象经过了指定次数的 GC 后,将在下次 GC 时进入老年代
默认的虚拟机配置,Eden:from :to = 8:1:1