JVM
内存主要分为堆内存(heap
)和栈内存(stack
)两种
heap
: 保存每个对象的属性内容,需要用new
关键字开辟
stack
: 保存的是heap
的空间地址
JVM
将堆内存(heap
)分为以下三代
-
YoungGen
(新生代,使用Minor GC
回收):该区内的对象的生命周期比较短,GC
对这些对象进行回收的时候采用复制拷贝算法:
YoungGen
又可以分为eden
,survivor1
,survivor2
-
eden
是在每个对象创建的时候才分配的空间,当他不能分配的时候,则会自动触发一次MinorGC
,每次MinorGC
都会将eden
空间中存活的对象和survivor1
中的对象拷贝到survivor2
中,此时eden
和survivor1
中的内容清空.下次执行MinorGC
的时候再将eden
和survivor2
中的对象拷贝到survivor1
中,同时会清除eden
和survivor2
空间,按照此类的顺序依次执行,进过数次MinorGC
依然存活的对象复制到OldGen
-
OldGen
(年老代 使用Major GC
),当对象从新生代拷贝到年老代时,会检查年老代的空间是否足够:
A
如果不够,则直接进行一次Full GC
(对整个堆进行扫描和回收,但是Major GC
除外),这样就可以让年老代腾出更多的空间,然后执行Major GC
,将新生代拷贝到年老代
B
如果够,则会根据条件(HandlePromotionFailure
配置:是否允许担保分配失败,即整个年老代空间不足,而新生代中的eden
和survivor
对象都存活的极端情况)进行Minor GC
和Full GC
-
PermGen
(持久代):要存放的类信息,包括方法,属性,对象池等..满了之后会引起Out Of Memory
错误,MetaSpace
(元空间):持久代的替换者,直接使用主机内存进行存储
-
网友评论