[java虚拟机]04.栈与堆

[java虚拟机]04.栈与堆

java栈

[java虚拟机]04.栈与堆

java栈中存取什么?

[java虚拟机]04.栈与堆

什么叫做栈帧呢?

[java虚拟机]04.栈与堆
栈的具体结构和排列看下图:
[java虚拟机]04.栈与堆


Java堆

[java虚拟机]04.栈与堆
首先我们应该知道相比较于java的栈区存放的对象引用,java堆中存放的就是实例化后的对象。
Jdk1.7及以前java的堆按逻辑分为新生,养老和永久。
为什么说按逻辑分呢?
因为永久区实际上方法区的一种实现,不在Java堆中。
按物理角度来讲堆中只有新生和养老。
jdk1.8以后java的堆的永久区元空间取而代之。
[java虚拟机]04.栈与堆

具体划分及比例

[java虚拟机]04.栈与堆

java的堆与垃圾回收

java的堆中存放着大量的对象,有的有用,有的无用,我们为了保证空间的有效及时利用,必须采取一种机制去及时释放空间就叫做垃圾回收。
在垃圾回收的过程中设计堆中的新生代和老年代两个区域。打个比方在打仗中新兵蛋子就在我们的新生区,随时面临的死亡。而当你打了数十甚至数百仗后立了战功成了将士就进入了老年代保存。
简而言之,新生代与老年代的区别就是新生代频繁的发生垃圾回收,而老年代中没有那么频繁。

java堆中Gc垃圾回收的分类

在新生代发生我们称之为YoungGc(MinorGc)
在老年代发生的我们称之为MajorGc
除这两个之外还有一个叫做FullGc ,FullGc将清理整个堆。

简述YoungGc/MinorGc过程

YoungGc就是一个复制,清空,互换的过程。
再拿这张图进行分析
[java虚拟机]04.栈与堆
发生:
1.首先Eden区满后第一触发Gc,将活着的对象拷贝到from区
复制:
2.当eden区再次触发Gc时,此时就会扫描Eden+from区,对这两个区域进行垃圾回收,经过这次还存活过来的对象就拷贝到to区。同时对象的年龄加一,当年龄符合条件的对象就会被存储到old区。
清空,交换:
3.清空Eden和From区,From为空,TO不为空。
此时交换From与to , 那么此时变为From不为空,to为空
下一次发生从而2开始进行循环

简述MajorGc

总有一天老年代的将军也满了,自然也会进行清理门户,这时我们发生的就是MajorGc。对老年代进行垃圾回收。

简述FullGc

对于FullGc我们需要了解的就是它什么时候执行,也就是触发它的条件是什么?

触发条件
​ 1、每次晋升到老年代的对象平均大小>老年代剩余空间

​ 2、MinorGC后存活的对象超过了老年代剩余空间

​ 3、永久代空间不足

​ 避免Perm Gen占满造成Full GC现象,可采用的方法为增大Perm Gen空间或转为使用CMS GC

​ 4、System.gc()

​ 通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc

​ 5、CMS GC异常

​ promotion failed:MinorGC时,新生代空间放不下,对象只能放入老年代,而老年代也放不下造成

​ concurrent mode failure:GC时,同时有对象要放入老年代,而老年代空间不足造成

6、堆内存分配很大的对象