美文网首页
JavaMemoryModel

JavaMemoryModel

作者: join_a922 | 来源:发表于2018-12-06 21:18 被阅读3次

    Java内存模型(JavaMemoryModel)

    JVM中用heap堆来存储运行时数据,所有类实例和数组由堆分配内存,JVM启动时创建堆(heapmemory),在堆以外的内存叫非堆(non-heapmemory).

    Details

    1.堆(HeapSpace)

    所有new出来的对象内存都分配在堆中,堆被分成年轻代(YongGeneration)和老年代(OldGeneration),新生代又分成Eden和两个Survivor区。

    MinorGC

    年轻代是所有新对象产生的地方。当年轻代内存空间被用完时,就会触发垃圾回收。这个垃圾回收叫做MinorGC。年轻代被分为3个部分——Enden区和两个Survivor区。

    新对象在年轻代产生,当年轻代空间占满后,会触发MinorGC开始垃圾回收,大多数新建对象位于Eden区,Eden区满后触发一次MinorGC,存活下来的对象转到survivor0区,survivor0区满后触发执行MinorGC,survivor0区存活对象全部转入survivor1区,这样保证一段时间内总有一个survivor区为空。经过多次MinorGC仍然存活的对象会转入老年代,这是由设定的年龄阈值来决定的。

    MajorGC

    老年代空间存储长期存活的对象,老年代占满时会触发MajorGC,花费时间较长,由于垃圾回收会导致“stoptheworld”事件,即所有线程都会停下来等待垃圾回收执行完成,所以对响应要求高的应用应尽量减少发生MajorGC,如微博后台程序发生MajorGC就会导致前台页面刷新超时,若是股票等实时交易应用发生MajorGC导致响应超时,可能会给客户带来损失,这都是系统调优要考虑到的问题。

    在分代收集算法中,由于年轻代中对象的存活率低,通常使用复制算法进行垃圾回收,老年代一般使用”标记-清理”或”标记-整理”算法回收存活率较高的对象。

    2.永久代

    永久代(PermanentGeneration),用来保存程序运行时长期存活的对象,如类的元数据。

    但是Java8中已经用metaspace完全替代了永久代。jvm参数-XX:PermSize和-XX:MaxPermSize选项会被忽略。

    3.NativeArea

    PC程序计数器

    程序计数器用来为线程独立拥有,线互补互补影响,保证线程切换后能准确恢复到执行位置,线程执行指令的跳转、循环、分支都要依赖计数器来完成。

    本地方法栈

    Java栈也是线程独立的,每个线程建立一个Java栈存储数据,所以不需要关心其数据一致性,也不会存在同步锁的问题。每个Java栈存在多个栈帧(stackframe),栈帧与方法一一对应,在HotSpot虚拟机中,使用-Xss参数来设置栈的大小,栈的大小直接决定了函数调用的可达深度。

    相关文章

      网友评论

          本文标题:JavaMemoryModel

          本文链接:https://www.haomeiwen.com/subject/zeyacqtx.html