目录
二、线程共享内存
1、Java堆内存(Heap Memory)
堆内存是程序运行时,可申请内存空间的区域,用于存储对象和数组(基本数据类型和对象的引用存在虚拟机栈中)。堆内存的大小可以固定,也可以随运行的状态调整。
堆内存分为两大块:新生代和老年代
1.1 新生代
新生代主要用于存放新创建的对象。又被分为Eden区,两个Survivor区(ServivorFrom,ServivorTo)。
Eden区:存放Java新对象。如果新创建的对象占用内存很大,则直接分配到老年代。当Eden区内存不够的时候就会触发GC,对新生代区进行一次垃圾回收。
ServivorFrom区:上一次GC存活下来的对象;
ServivorTo区:再次GC时,将ServivorFrom中和Eden区存活的对象一起移动到这个区,并清空上面两个区,这个区作为下次GC的ServivorFrom区,以此循环操作。
对象每次GC后存活,会计数一次,计数累计超过16后,移入至老年代。
1.2老年代
老年代存放垃圾回收存活下来的对象。当老年代没有足够空间分配内存时,会进行一次GC,如果GC后仍然装不下,会抛出OOM。
2、方法区
用于存放类描述、元数据、编译后的缓存、每个类结构(如运行时常数池、字段和方法数据)等信息。在Hotspot JVM实现中,GC 分代收集扩展至方法区,会进行垃圾回收。