《Java内存区域介绍》

《Java内存区域介绍》

Java内存区域有如下几部分构成

1、程序计数器:指示的是当前正在执行的机器指令的地址。

2、本地方法栈:通过JNI调用本地方法时根据语言的类型建立相应的栈。

3、Java栈

Java栈是每个线程私有的,每个线程都有一个Java栈,栈中存放着一系列的栈帧(Stack Frame),JVM只能压入(push)和弹出(pop)栈帧这两种操作。每当调用一个方法时,JVM就往栈中压入一个栈帧,方法结束返回时弹出栈帧。如果方法执行时出现异常,可以调用printStackTrace等方法来查看栈的情况。

栈帧由局部变量数组、操作数栈和常量池的引用构成。

局部变量数组中,从0开始按顺序存放方法所属对象的引用、传递给方法的参数、局部变量。

操作数栈:方法执行时的临时空间,其实,操作数栈是方法真正工作的地方,执行方法时,局部变量数组与操作数栈根据方法定义进行数据交换。

常量池的引用:当JVM执行到需要常量池的数据时,就是通过这个引用来访问常量池的。

4、Java堆

堆中存放的是程序创建的对象。这个区域对JVM的性能影响很大。垃圾回收机制处理的正是这一块内存区域。

5、方法区

方法区域时一个JVM实例中的所有线程共享的。它用于存放运行常量池、域和方法的信息、静态变量、类和方法的字节码等。

6、运行常量池

运行常量池:这个区域存放类和接口的常量,除此之外,它还存放方法和域的所有引用。当一个方法或者域被引用的时候,JVM就是通过运行常量池中的这些引用来查找方法和域中内存中的实际地址。

垃圾回收

我们都知道,所有通过new创建的对象的内存都在堆中分配,堆被划分为新生代和老年代,新生代又被进一步划分为Eden和Survivor区,而Survivor由FromSpace和ToSpace组成。

新生代:新创建的对象都是用新生代分配内存,Eden空间不足时,触发Minor GC,这时会把存活的对象转移进Survivor区。

老年代:老年代用于存放经过多次Minor GC之后依然存活的对象。

JVM分别对新生代和老年代采用不同的垃圾回收机制。

GC触发条件:Eden区满了触发Minor GC,这时会把Eden区存活的对象复制到Survivor区,当对象在Survivor区熬过一定次数的Minor GC之后,就会晋升到老年代(当然并不是所有的对象都是这样晋升的到老年代的),当老年代满了,就会报OutofMemory异常。

1、新生代的GC(Minor GC)

新生代通常存活时间较短基于Copying算法进行回收,所谓Copying算法就是扫描出存活的对象,并复制到一块新的完全未使用的空间中,对应于新生代,就是在Eden和FromSpace或ToSpace之间copy。新生代采用空闲指针的方式来控制GC触发,指针保持最后一个分配的对象在新生代区间的位置,当有新的对象要分配内存时,用于检查空间是否足够,不够就触发GC。当连续分配对象时,对象会逐渐从Eden到Survivor,最后到老年代。
在执行机制上JVM提供了串行GC(SerialGC)、并行回收GC(ParallelScavenge)和并行GC(ParNew).

2、老年代的GC(Major GC/Full GC)

老年代与新生代不同,老年代对象存活的时间比较长、比较稳定,因此采用标记(Mark)算法来进行回收,所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象,回收后对用空出的空间要么进行合并、要么标记出来便于下次进行分配,总之目的就是要减少内存碎片带来的效率损耗。
在执行机制上JVM提供了串行GC(Serial MSC)、并行GC(Parallel MSC)和并发GC(CMS)。

老年代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:
java.lang.OutOfMemoryError: Java heap space

因此,Full GC的触发条件如下

1、System.gc() 此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇性停顿的次数。强烈影响系建议能不使用此方法就别使用,让虚拟机自己去管理它的内存

2、新生代要转入的对象空间大于老年代的剩余空间。

3、要开辟大的对象、大的数组。

参考资料

1、http://blog.csdn.net/cutesource/article/details/5906705

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值