与Java程序运行相关的JVM内存模型及垃圾收集算法有哪些?
JVM将内存划分为:
New(年轻代):年轻代用来存放JVM刚分配的java对象 Tenured(年老代):年轻代中经过垃圾回收没有回收掉的对象将被copy到年老代 Perm(永久代):永久代存放Class、Method元信息,其大小跟项目的规模、类、方法的量有关,一般设置为128M足矣,设置原则是预留30%的空间。
New又分为几个部分:
Eden:Eden用来存放JVM刚分配的对象 Survivor1 Survivor2:两个Survivor空间一样大,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间copy,当满足某个条件,比如Copy次数,就会被Copy到Tenured.显然Survivor只是增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。
垃圾回收算法 垃圾回收算法分为三类,都是基于标记-清除(复制)法:
Serial算法,单线程 并行算法 并发算法
JVM会根据机器的硬件配置对每个内存代选择适合的回收算法,比如,如果机器多于1个核,会对年轻代选择并行算法,关于选择细节请参考JVM调优文档。
稍微解释下的是,并行算法是用多线程进行垃圾回收,回收期间会暂停程序的执行,而并发算法,也是多线程回收,但期间不停止应用执行。所以,并发算法适用于交互性高的一些程序。经过观察,并发算法会减少年轻代的大小,其实就是使用了一个大的年老代,这反过来跟并行算法相比吞吐量相对较低。
垃圾回收动作何时执行?
当年轻代内存满时,会引发一次普通的GC,该GC仅回收年轻代,需要强调的是年轻代是指Eden代满,Survivor满不会引发GC 当年老代满时会引发Full GC,Full GC将会同时回收年轻代年老代。 当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载。
您好,根据java虚拟机规范,JVM将内存划分为:
New(年轻代):年轻代用来存放JVM刚分配的java对象
Tenured(年老代):年轻代中经过垃圾回收没有回收掉的对象将被copy到年老代
Perm(永久代):永久代存放Class、Method元信息,其大小跟项目的规模、类、方法的量有关,一般设置为128M足矣,设置原则是预留30%的空间。
New又分为几个部分:
Eden:Eden用来存放JVM刚分配的对象
Survivor1
Survivor2:两个Survivor空间一样大,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间copy,当满足某个条件,比如Copy次数,就会被Copy到Tenured.显然Survivor只是增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。
垃圾回收算法 垃圾回收算法分为三类,都是基于标记-清除(复制)法:
Serial算法,单线程
并行算法
并发算法
JVM会根据机器的硬件配置对每个内存代选择适合的回收算法,比如,如果机器多于1个核,会对年轻代选择并行算法,关于选择细节请参考JVM调优文档。
稍微解释下的是,并行算法是用多线程进行垃圾回收,回收期间会暂停程序的执行,而并发算法,也是多线程回收,但期间不停止应用执行。所以,并发算法适用于交互性高的一些程序。经过观察,并发算法会减少年轻代的大小,其实就是使用了一个大的年老代,这反过来跟并行算法相比吞吐量相对较低。
垃圾回收动作何时执行?
当年轻代内存满时,会引发一次普通的GC,该GC仅回收年轻代,需要强调的是年轻代是指Eden代满,Survivor满不会引发GC
当年老代满时会引发Full GC,Full GC将会同时回收年轻代年老代。
当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。