美文网首页
jvm 内存分区及回收

jvm 内存分区及回收

作者: 阿太哥 | 来源:发表于2017-10-22 20:46 被阅读21次

近期由于jvm经常出现full gc导致jvm崩溃,从日志上查看是Eden和survivor from,to相关的信息,经学习了相关文档和文章后,特总结如下。

参照并发编程网中的讲解,特有以下的记录。ref :http://ifeve.com/jvm-yong-generation/

对象生命story

对一个新的东西的理解,最好不要一上来就看各种原理,最好是有个恰当的故事strory开始,有助于我们理解之后的事情。

好了,故事开始:我是一个普通的java对象,上帝将我降生在Eden区,在这个区里有和我一起成长的兄弟,我们在Eden区玩了很长一段时间,渐渐的这个区里的人接近饱和了,某一天上帝清点了人数,我就被迫去了Survivor区中的from区,自从到了from区,我就从from区到to区来回漂泊,居无定所。直到我18岁时,上帝告知我已成人,可以到社会上去闯闯,于是我到了Tenured代(老年代),在这里人很多,并且大家年龄都挺大的,我在Tenured存在了很久,直到很多年后,上帝找到我,将我回收...

围绕这个故事,对于jvm内存,gc,及gc算法大概就发生在这个故事里。

年轻代 年老代 永久代

jvm中大概能划分为以下3个代

Yong generation ->年轻代,新生代 :所有新生成的对象首先会被放在此区,这个区的设计是回收那些生命周期短的对象。此区域分为3个区,Eden,survivor区中的from和to区

Tenured/Old generation -->年老代:经历了多次垃圾回收后还存活的对象,会被放入此区。

Perm Area 永久代,方法区 :存放静态文件,如类,方法。存储每个类的结构信息,比如运行时常量池,字段和方法数据。

各区参数

相关参数配置

-xms,-xmx 指定堆内存的初始大小和最大内存大小,为了gc回收时不压缩堆内存,一般的配置这两个值相等。

-XX:NewSize和-XX:MaxNewSize 指定年轻代的初始大小和最大,一般设置成样大,并且大小为堆内存的1/3或1/4

-XX:NewRatio 年老代与年轻代的比值,eg=2,则年老代占用2/3,年轻代占用1/3

-XX:SurvivorRatio Eden区与survivor区的比值(survivor=from+to)默认为8,即eden占用年轻代的8/10,from和to各占用1/10

-XX:PermSize,-XX:MaxPermSize 永久代初始与最大大小,建议为物理内存的1/64和1/4 该配置在jdk8之后废弃,采用MetaSpace

-XX:PrintTenuringDistribution 用于显示在每次Minor GC后,新的各区的阀值

最后,由于程序运行时,导致Eden中频繁创建对象,从开始的eden到from,to之间,再到年老代。由于计算巨大,变量生命周期长,导致full gc不能回收对象,最后抛出Heap outofmemory exception...

当eden区满时,jvm会释放eden区中不活跃的对象,如果空间仍然不够,则将部分活跃的对象移至survivor区(survivor区满不能触发gc),当年老代有足够空间,则将survivor中的对象移动到此,慢慢的如果年老代空间达到gc条件,则触发一次Major collection。

关于gc回收算法,在另一篇笔记中详解...

相关文章

  • jvm 内存分区及回收

    近期由于jvm经常出现full gc导致jvm崩溃,从日志上查看是Eden和survivor from,to相关的...

  • JVM基础知识点

    1. 内存模型以及分区,需要详细到每个区放什么(共分为5个)。 JVM内存模型及分区jvm内存模型和内存分配 程序...

  • 2020互联网Java后端面试专题解析—JVM21题

    前言 文章对 JVM 内存区域分布、JVM 内存溢出分析、JVM 垃圾回收算法/垃圾收集器、JVM 性能调优工具及...

  • Java堆外内存回收方法

    [TOC] 一、JVM内存的分配及垃圾回收 JVM垃圾回收 由于JVM会替我们执行垃圾回收,因此开发者根本不需要关...

  • 运满满-Java开发工程师技术面综合面

    技术一面 天猫商城项目购物车怎么实现的(。ò ∀ ó。),多线程,同步,jvm内存分配及回收,jvm内存命令,项目...

  • Java垃圾回收机制

    垃圾回收 垃圾回收回调方法: finalize()函数是在JVM回收内存时执行的,但JVM并不保证在回收内存时一定...

  • jvm内存分区及功能

    程序计数器:线程私有,用于记录线程运行到哪一步了。多线程的情况下即使线程间来回切换也能知道线程运行到哪一步了。如果...

  • 阿里面试题若干 2020

    JVM内存模型及分区 Java虚拟机在程序执行过程会把jvm的内存分为若干个不同的数据区域来管理,这些区域有自己的...

  • java(内存和gc)

    JVM内存和gc机制JVM内存 Java垃圾回收概况 Java GC(Garbage Collection,垃圾收...

  • 深入理解Java虚拟机(二):JVM垃圾回收算法 + 垃圾收集器

    01 前言 上次讲解了JVM内存相关知识,今天继续JVM专题。 02 JVM垃圾回收算法 2.1 什么是垃圾回收?...

网友评论

      本文标题:jvm 内存分区及回收

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