JVM堆内存详解

JVM堆内存 

1、JVM堆内存划分 

java中最大的特色在于其具有良好的垃圾收集特性 
GC是整个java之中最重要的安全保证 
整个JVM中的GC的处理机制:对不须要的对象进行标记,然后进行清除 java


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

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

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

  • 新生带(年轻代):新对象和没达到必定年龄的对象都在年轻代 
  • 老年代:被长时间使用的对象,老年代的内存空间应该要比年轻代更大 
  • 元空间(JDK1.8以前叫永久代):像一些方法中的操做临时对象等,JDK1.8以前是占用JVM内存,JDK1.8以后直接使用物理内存 

2、GC流程 

基本全部数据都会保存在JVM的堆内存之中 对象

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

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

具体流程: 

  1. 当如今有一个新的对象产生,JVM须要为该对象进行内存空间的申请 
  2. 先判断Eden区是否有内存空间,若是有,直接将新对象保存在Eden区 
  3. 若是Eden区的内存空间不足,会自动执行一个Minor GC操做,将Eden区的无用内存空间进行清理 
  4. 清理Eden区以后继续判断Eden区内存空间状况,若是充足,则将新对象直接保存在Eden区
  5. 若是执行了Minor GC以后发现Eden区的内存依然不足,那就判断存活区的内存空间,并将Eden区的部分活跃对象保存在存活区 
  6. 活跃对象迁移到存活区后,继续判断Eden区内存空间状况,若是充足,则将新对象直接保存在Eden区 
  7. 若是存活区也没有空间了,则继续判断老年区,若是老年区充足,则将存活区的部分活跃对象保存在老年区 
  8. 存活区的活跃对象迁移到老年区后,则将Eden区的部分活跃对象保存在存活区 
  9. 活跃对象迁移到存活区后,继续判断Eden区内存空间状况,若是充足,则将新对象直接保存在Eden区 
  10. 若是老年区也满了,这时候产生Major GC(Full GC)进行老年区的内存清理 
  11. 若是老年区执行了Major GC以后发现没法进行对象保存,会产生OutOfMemoryError异常

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

  • 实际上每一块子内存区中都会存在有一部分的可变伸缩区 
  • 若是空间不足时,则在可变范围以内扩大内存空间 
  • 当一段时间后,内存空间有余,再将可变空间进行释放 


堆内存空间调整参数 

  • -Xms:设置初始分配大小,默认为物理内存的1/64 
  • -Xmx:最大分配内存,默认为物理内存的1/4
  • -XX:+PrintGCDetails:输出详细的GC处理日志 
  • -XX:+PrintGCTimeStamps:输出GC的时间戳信息 
  • -XX:+PrintGCDateStamps:输出GC的时间戳信息(以日期的形式)
  • -XX:+PrintHeapAtGC:在GC进行处理的先后打印堆内存信息 
  • -Xloggc:(SavePath):设置日志信息保存文件 
  • 在堆内存的调整策略中,基本上只要调整两个参数:-Xms和-Xmx 

最后

欢迎你们有兴趣的能够关注个人公众号【java小瓜哥的分享平台】,文章都会在里面更新,还有各类java的资料都是免费分享的。但愿与你们一块儿进步努力!虚拟机

相关文章
相关标签/搜索