java--jvm堆

…衆ロ難τιáo~ 提交于 2019-12-25 20:42:34

前言

堆的分代分配

虚拟机垃圾回收机制

判断对象是否已经死亡的算法:引用计数算法,可达性分析算法;

四个垃圾收集算法:标记清除算法,复制算法,标记整理算法,分代收集算法;

复制算法、标记清除、标记整理、分代算法

七个垃圾收集器:Serial,SerialOld,ParNew,Parallel Scavenge,Parallel Old,CMS,G1.

OOM异常

JVM调优:-Xms 初始大小 -Xmx 堆内存最大

一:堆的分代分配

  • 堆从逻辑上分为年轻代、老年代、永久代/原空间,年轻代又分为Eden区,Survivor from,Survivor to

  • 年轻代内存分配:Eden 8,Survivor from 1,Survivor to 1

  • 老年代内存分配:young 1/3,old 2/3

二:gc原理

2.1:minor gc

当Eden区满了时,会触发minor gc,Eden区存活下来的对象年龄+1并复制到Survivor from区清空Eden区,当第二次Eden区空间满了时,minor gc会扫描回收Eden区和Survivor from区存活下来的对象年龄+1并复制到Survivor to区清空Eden区和Survivor from区,注意此时Survivor from区被清空了,from 区就变成了to区,from区和to区相互转换谁空谁就是to区。

2.2:full gc

当年轻代中的实例对象年龄等于15岁,在经历一轮minor gc后就会搬进老年代,开始愉快的‘养老’生活。当老年代空间不足时,此时会触发full gc,因为老年代空间大所以full gc耗时比较长,jvm调优中的重点就是有效的防止full gc的触发。

三:判断对象是否已经死亡的算法

3.1:引用计数算法

实例对象被引用1次,引用数量加1,引用数量为0时回收就可以被回收。

缺点:无法解决对象循环引用的问题

3.2:可达性分析算法(todo)

四:四个垃圾收集算法

4.1:复制算法

ArrayList扩容使用的就是复制算法

将内存A中的数据复制到内存B中,然后清空内存A。

优点:效率高,不会产生内存碎片

缺点:需要2倍的内存空间

4.2:标记清除

遍历内存空间A,将垃圾标记,然后遍历内存空间,清除被标记的垃圾

优点:节省空间

缺点:会产生内存碎片,需要遍历两遍内存效率略低

4.3:标记整理

在标记清除的基础上,压缩内存,解决内存碎片的问题

优点:节省空间,不产生内存碎片

缺点:效率低

4.4:分代收集算法

年轻代、老年代根据各自的特点使用不同的算法,年轻代内存小,gc频繁,使用复制算法,老年代内存大,gc少,使用标记清除/标记整理算法

五:七个垃圾收集器

5.1:Serial

  • 年轻代串行收集器

  • 是一个单线程的收集器,他在工作时,必须暂停其他所有的工作线程(Stop-The-World),直到他收集结束。这是难以忍受的,但是他的效率较高。

5.2:SerialOld

  • Serial收集器的老年代版本,他同样是一个单线程收集器,使用标记-整理算法。

5.3:ParNew

  • 年轻代并行收集器
  • 是Serial收集器的多线程版本。

5.4:Parallel Scavenge

  • 是一个新生代收集器,他也是使用复制算法。他的目标规则是达到一个可控制的吞吐量。
    吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那么吞吐量就是99%。

5.5:Parallel Old

  • Parallel Scavenge收集器的老年代版本,使用多线程和标记-整理算法。

5.6:CMS

  • 以获取最短回收停顿时间为目标的收集器,基于并发“标记清理”实现

5.7:G1

六:OOM

  • oom即OutOfMemoryException生产环境如果看到这个异常说明你们公司的业务还是很火爆的呢,等等,不算那种导出不做限制,无限循环取消订单等’骚’操作。

[GC (Allocation Failure) [PSYoungGen: 1024K->0K(1536K)] 4046K->3022K(5632K), 0.0005292 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

  • PSYoungGen:minor gc
  • 1024K->0K(1536K) 年轻代gc前->gc后(1536k因为设置的年轻代太小,jvm设置了一个新的值)
  • 0.0005292 secs gc耗时

6.1:常见配置汇总

    1. 堆设置
      • -Xms:初始堆大小
      • -Xmx:最大堆大小
      • -XX:NewSize=n:设置年轻代大小
      • **-XX:NewRatio=n:**设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
      • -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
      • -XX:MaxPermSize=n:设置持久代大小
    2. 收集器设置
      • -XX:+UseSerialGC:设置串行收集器
      • -XX:+UseParallelGC:设置并行收集器
      • -XX:+UseParalledlOldGC:设置并行年老代收集器
      • -XX:+UseConcMarkSweepGC:设置并发收集器
    3. 垃圾回收统计信息
      • -XX:+PrintGC
      • -XX:+PrintGCDetails
      • -XX:+PrintGCTimeStamps
      • -Xloggc:filename
    4. 并行收集器设置
      • -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
      • -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
      • -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
    5. 并发收集器设置
      • -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
      • -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!