JVM堆内存详解

JVM堆内存

一、JVM堆内存划分

java中最大的特点在于其具备良好的垃圾收集特性

GC是整个java之中最重要的安全保证

整个JVM中的GC的处理机制:对不需要的对象进行标记,而后进行清除


在JDK1.8之后,将最初的永久带内存空间取消了,该图为JDK1.8之前的内存空间组成

取消永久代目的是为了将HotSpot于JRockit两个虚拟机标准联合为一个

在整个JVM堆内存之中实际上将内存分为了三部分

新生带(年轻代):新对象和没达到一定年龄的对象都在年轻代

老年代:被长时间使用的对象,老年代的内存空间应该要比年轻代更大

元空间(JDK1.8之前叫永久代):像一些方法中的操作临时对象等,JDK1.8之前是占用JVM内存,JDK1.8之后直接使用物理内存

二、GC流程

基本所有数据都会保存在JVM的堆内存之中

对于整个的GC流程里面,最需要处理的事年轻代与老年代的内存清理操作

元空间(永久代)都不在GC范围内

具体流程:

当现在有一个新的对象产生,JVM需要为该对象进行内存空间的申请

先判断Eden区是否有内存空间,如果有,直接将新对象保存在Eden区

如果Eden区的内存空间不足,会自动执行一个Minor GC操作,将Eden区的无用内存空间进行清理

清理Eden区之后继续判断Eden区内存空间情况,如果充足,则将新对象直接保存在Eden区

如果执行了Minor GC之后发现Eden区的内存依然不足,那就判断存活区的内存空间,并将Eden区的部分活跃对象保存在存活区

活跃对象迁移到存活区后,继续判断Eden区内存空间情况,如果充足,则将新对象直接保存在Eden区

如果存活区也没有空间了,则继续判断老年区,如果老年区充足,则将存活区的部分活跃对象保存在老年区

存活区的活跃对象迁移到老年区后,则将Eden区的部分活跃对象保存在存活区

活跃对象迁移到存活区后,继续判断Eden区内存空间情况,如果充足,则将新对象直接保存在Eden区

如果老年区也满了,这时候产生Major GC(Full GC)进行老年区的内存清理

如果老年区执行了Major GC之后发现无法进行对象保存,会产生OutOfMemoryError异常

三、堆内存参数调整(调优关键)

实际上每一块子内存区中都会存在有一部分的可变伸缩区

如果空间不足时,则在可变范围之内扩大内存空间

当一段时间后,内存空间有余,再将可变空间进行释放

堆内存空间调整参数

-Xms:设置初始分配大小,默认为物理内存的1/64

-Xmx:最大分配内存,默认为物理内存的1/4

-XX:+PrintGCDetails:输出详细的GC处理日志

-XX:+PrintGCTimeStamps:输出GC的时间戳信息

-XX:+PrintGCDateStamps:输出GC的时间戳信息(以日期的形式)

-XX:+PrintHeapAtGC:在GC进行处理的前后打印堆内存信息

-Xloggc:(SavePath):设置日志信息保存文件

在堆内存的调整策略中,基本上只要调整两个参数:-Xms和-Xmx

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • JVM架构 当一个程序启动之前,它的class会被类装载器装入方法区(Permanent区),执行引擎读取方法区的...
    cocohaifang阅读 5,697评论 0 7
  • 内存溢出和内存泄漏的区别 内存溢出:out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,...
    Aimerwhy阅读 4,090评论 0 1
  • 一、内存结构 1. 方法区: 存放类的信息(名称、修饰符等)、类中的静态变量、类中final型常量、类中的Fiel...
    田真的架构人生阅读 3,885评论 0 0
  • 滨州的初冬相比烟台来的总是早一点。早上六七点钟五六度的温度在还没有供暖的房间里总想蜷缩在被窝睡到天荒地老。特别是对...
    121_e1f7阅读 3,604评论 1 1
  • 渚行 说起父亲,心中就不知道有很多的话要说,却不知道从何说起。一直以来,想写点什么,向父亲表示敬意和爱意,总是因为...
    渚行阅读 3,047评论 0 0

友情链接更多精彩内容