前言

之前咱们解说了jvm的组成构造与垃圾回收算法等知识点,明天咱们来讲讲jvm最重要的堆内存是如何应用垃圾回收器进行垃圾回收,并且如何应用命令去配置应用这些垃圾回收器。

堆内存详解

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

下面这个图大家应该曾经很明确了吧。大家就能够了解成一个房子被分成了几个房间,每个房间的作用不同而已,有的是婴儿住的,有的是父母住的,有的是爷爷奶奶住的

堆内存被划分为两块,一块的年老代,另一块是老年代。

年老代又分为Eden和survivor。他俩空间大小比例默认为8:2,

幸存区又分为s0和s1。这两个空间大小是截然不同的,就是一对双胞胎,他俩是1:1的比例

堆内存垃圾回收过程

第一步

新生成的对象首先放到Eden区,当Eden区满了会触发Minor GC。

第二步

第一步GC活下来的对象,会被挪动到survivor区中的S0区,S0区满了之后会触发Minor GC,S0区存活下来的对象会被挪动到S1区,S0区闲暇。

S1满了之后在GC,存活下来的再次挪动到S0区,S1区闲暇,这样反反复复GC,每GC一次,对象的年龄就涨一岁,达到某个值后(15),就会进入老年代。

第三步

在产生一次Minor GC后(前提条件),老年代可能会呈现Major GC,这个视垃圾回收器而定。

Full GC触发条件

手动调用System.gc,会一直的执行Full GC

老年代空间有余/满了

办法区空间有余/满了

留神

们须要记住一个单词:stop-the-world。它会在任何一种GC算法中产生。stop-the-world 意味着JVM因为须要执行GC而进行应用程序的执行。

当stop-the-world 产生时,除GC所需的线程外,所有的线程都进入期待状态,直到GC工作实现。GC优化很多时候就是缩小stop-the-world 的产生。

回收哪些区域的对象

须要留神的是,JVM GC只回收堆内存和办法区内的对象。而栈内存的数据,在超出作用域后会被JVM主动开释掉,所以其不在JVM GC的治理范畴内。

堆内存常见参数配置

参数

形容

-Xms

堆内存初始大小,单位m、g

-Xmx

堆内存最大容许大小,个别不要大于物理内存的80%

-XX:PermSize

非堆内存初始大小,个别利用设置初始化200m,最大1024m就够了

-XX:MaxPermSize

非堆内存最大容许大小

-XX:NewSize(-Xns)

年老代内存初始大小

-XX:MaxNewSize(-Xmn)

年老代内存最大容许大小

-XX:SurvivorRatio=8

年老代中Eden区与Survivor区的容量比例值,默认为8,即8:1

-Xss

堆栈内存大小

-XX:NewRatio=老年代/新生代

设置老年代和新生代的大小比例

-XX:+PrintGC

jvm启动后,只有遇到GC就会打印日志

-XX:+PrintGCDetails

查看GC详细信息,包含各个区的状况

-XX:MaxDirectMemorySize

在NIO中能够间接拜访间接内存,这个就是设置它的大小,不设置默认就是最大堆空间的值-Xmx

-XX:+DisableExplicitGC

敞开System.gc()

-XX:MaxTenuringThreshold

垃圾能够进入老年代的年龄

-Xnoclassgc

禁用垃圾回收

-XX:TLABWasteTargetPercent

TLAB占eden区的百分比,默认是1%

-XX:+CollectGen0First

FullGC时是否先YGC,默认false

TLAB 内存

TLAB全称是Thread Local Allocation Buffer即线程本地调配缓存,从名字上看是一个线程专用的内存调配区域,是为了减速对象调配而生的。

每一个线程都会产生一个TLAB,该线程独享的工作区域,java虚拟机应用这种TLAB区来防止多线程抵触问题,进步了对象调配的效率。

TLAB空间个别不会太大,当大对象无奈在TLAB调配时,则会间接调配到堆上。

参数

形容

-Xx:+UseTLAB

应用TLAB

-XX:+TLABSize

设置TLAB大小

-XX:TLABRefillWasteFraction

设置保护进入TLAB空间的单个对象大小,他是一个比例值,默认为64,即如果对象大于整个空间的1/64,则在堆创立

-XX:+PrintTLAB

查看TLAB信息

-Xx:ResizeTLAB

自调整TLABRefillWasteFraction阀值。

垃圾回收器总览

新生代可配置的回收器:Serial、ParNew、Parallel Scavenge

老年代配置的回收器:CMS、Serial Old、Parallel Old

新生代和老年代区域的回收器之间进行连线,阐明他们之间能够搭配应用。

新生代垃圾回收器

Serial 垃圾回收器

Serial收集器是最根本的、倒退历史最悠久的收集器。俗称为:串行回收器,采纳复制算法进行垃圾回收

特点

串行回收器是指应用单线程进行垃圾回收的回收器。每次回收时,串行回收器只有一个工作线程。

对于并行能力较弱的单CPU计算机来说,串行回收器的专一性和独占性往往有更好的性能体现。

它存在Stop The World问题,及垃圾回收时,要进行程序的运行。

应用-XX:+UseSerialGC参数能够设置新生代应用这个串行回收器

ParNew 垃圾回收器

ParNew其实就是Serial的多线程版本,除了应用多线程之外,其余参数和Serial截然不同。俗称:并行垃圾回收器,采纳复制算法进行垃圾回收

特点

ParNew默认开启的线程数与CPU数量雷同,在CPU核数很多的机器上,能够通过参数-XX:ParallelGCThreads来设置线程数。

它是目前新生代首选的垃圾回收器,因为除了ParNew之外,它是惟一一个能与老年代CMS配合工作的。

它同样存在Stop The World问题

应用-XX:+UseParNewGC参数能够设置新生代应用这个并行回收器

ParallelGC 回收器

ParallelGC应用复制算法回收垃圾,也是多线程的。

特点

就是十分关注零碎的吞吐量,吞吐量=代码运行工夫/(代码运行工夫+垃圾收集工夫)

-XX:MaxGCPauseMillis:设置最大垃圾收集进展工夫,可用把虚拟机在GC进展的工夫管制在MaxGCPauseMillis范畴内,如果心愿缩小GC进展工夫能够将MaxGCPauseMillis设置的很小,然而会导致GC频繁,从而减少了GC的总工夫,升高了吞吐量。所以须要依据理论状况设置该值。

-Xx:GCTimeRatio:设置吞吐量大小,它是一个0到100之间的整数,默认状况下他的取值是99,那么零碎将破费不超过1/(1+n)的工夫用于垃圾回收,也就是1/(1+99)=1%的工夫。

另外还能够指定-XX:+UseAdaptiveSizePolicy关上自适应模式,在这种模式下,新生代的大小、eden、from/to的比例,以及降职老年代的对象年龄参数会被主动调整,以达到在堆大小、吞吐量和进展工夫之间的平衡点。

应用-XX:+UseParallelGC参数能够设置新生代应用这个并行回收器

老年代垃圾回收器

SerialOld 垃圾回收器

SerialOld是Serial回收器的老年代回收器版本,它同样是一个单线程回收器。

用处

一个是在JDK1.5及之前的版本中与Parallel Scavenge收集器搭配应用,

另一个就是作为CMS收集器的后备预案,如果CMS呈现Concurrent Mode Failure,则SerialOld将作为后备收集器。

应用算法:标记 – 整顿算法

ParallelOldGC 回收器

老年代ParallelOldGC回收器也是一种多线程的回收器,和新生代的ParallelGC回收器一样,也是一种关注吞吐量的回收器,他应用了标记压缩算法进行实现。

-XX:+UseParallelOldGc进行设置老年代应用该回收器

-XX:+ParallelGCThreads也能够设置垃圾收集时的线程数量。

CMS 回收器

CMS全称为:Concurrent Mark Sweep意为并发标记革除,他应用的是标记革除法。次要关注零碎进展工夫。

应用-XX:+UseConcMarkSweepGC进行设置老年代应用该回收器。

应用-XX:ConcGCThreads设置并发线程数量。

特点

CMS并不是独占的回收器,也就说CMS回收的过程中,应用程序依然在不停的工作,又会有新的垃圾一直的产生,所以在应用CMS的过程中应该确保应用程序的内存足够可用。

CMS不会等到应用程序饱和的时候才去回收垃圾,而是在某一阀值的时候开始回收,回收阀值可用指定的参数进行配置:-XX:CMSInitiatingoccupancyFraction来指定,默认为68,也就是说当老年代的空间使用率达到68%的时候,会执行CMS回收。

如果内存使用率增长的很快,在CMS执行的过程中,曾经呈现了内存不足的状况,此时CMS回收就会失败,虚拟机将启动老年代串行回收器;SerialOldGC进行垃圾回收,这会导致应用程序中断,直到垃圾回收实现后才会失常工作。

这个过程GC的进展工夫可能较长,所以-XX:CMSInitiatingoccupancyFraction的设置要依据理论的状况。

之前咱们在学习算法的时候说过,标记革除法有个毛病就是存在内存碎片的问题,那么CMS有个参数设置-XX:+UseCMSCompactAtFullCollecion能够使CMS回收实现之后进行一次碎片整顿。

-XX:CMSFullGCsBeforeCompaction参数能够设置进行多少次CMS回收之后,对内存进行一次压缩。

G1 回收器

篇幅太长,咱们下篇文章解说!!!

IT 老哥

一个在大厂做高级Java开发的程序猿,一路自学走到明天,关注 老哥,咱们一起来自学技术

java 几种垃圾回收器,关于java:7种jvm垃圾回收器这次全部搞懂相关推荐

  1. JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系

    文章目录 Pre 示例demo 总体关系 代码示例论证 反汇编 Pre JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器 中我们探讨了线程栈中的内部结构 ,大家 ...

  2. c++ 多线程 垃圾回收器_7种jvm垃圾回收器,这次全部搞懂

    前言 之前我们讲解了jvm的组成结构与垃圾回收算法等知识点,今天我们来讲讲jvm最重要的堆内存是如何使用垃圾回收器进行垃圾回收,并且如何使用命令去配置使用这些垃圾回收器. 堆内存详解 上面这个图大家应 ...

  3. java dofinalize_应用与系统稳定性第六篇---JVM垃圾回收之finalize执行时引起timed out 闪退分析...

    一.背景 java.util.concurrent.TimeoutException: android.content.res.AssetManager$AssetInputStream.finali ...

  4. JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器

    文章目录 Pre 运行时数据区总览 线程栈 概要 栈内部主要组成部分 局部变量 操作数栈 动态链接 方法出口 小结 程序计数器 本地方法栈 附 测试demo javap JVM字节码指令集手册 Pre ...

  5. Java实现阿里云短信发送功能(保姆级!!!搞懂短信功能,这一篇就够了!)

    目录 一.准备工作 1)功能如何切入? 2)为什么要用阿里云来实现? 二.阿里云部分 三.代码部分 OK,分享结束!收! 一.准备工作 1)功能如何切入? 第一步:分析业务需求,想要实现短信通知功能那 ...

  6. MySQL的7种JOIN表连接结果集,你了解几个?搞懂仅需1张图

    目录 实践 第一种 第二种 第三种 第四种 第五种 第六种 第七种 大家好呀!我是爷爷的茶七里香,周末啦~开森~,今天突然想起曾经面试遇到的MySQL题目,记录下来方便查阅!!!  MySQL的7种表 ...

  7. java培训学费_零基础Java培训大概多少钱

    Java培训多少钱,这个问题是我们准备学习Java的小伙伴比较关注的,特别是从零基础开始来学习Java的小伙伴,对这个行业不太了解,为了防止上当受骗,了解清楚还是比较好的,那么零基础Java培训大概多 ...

  8. java 自旋锁_搞懂Java中的自旋锁

    轻松搞懂Java中的自旋锁 前言 在之前的文章<一文彻底搞懂面试中常问的各种"锁">中介绍了Java中的各种"锁",可能对于不是很了解这些概念的同学 ...

  9. JVM垃圾回收算法 总结及汇总

    先看一眼JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:jvm如何知道那些对象需要回 ...

最新文章

  1. stm32实际运用中遇到的问题
  2. 【正一专栏】读《怎样做社会研究》——社会研究的意义
  3. 全明星基金季卫东: 重仓新经济冠军,投资“幸福生活“
  4. CodeForces 382B 数学推导
  5. Swift 设置字体
  6. 打印机乱码不停打印_关于东芝复合机连接打印,图文教你如何轻松连接至电脑...
  7. 深拷贝与浅拷贝深入理解
  8. Scrum联盟的新任全球营销副总裁访谈
  9. windows 搭建kms服务器激活_自建KMS激活服务器的技巧
  10. java获取微信用户信息(UnionID)
  11. 贵州安顺:红色基因激活初心密码 为民服务谱写秀丽篇章
  12. HTML的背景颜色和背景图片
  13. icloud有linux客户端吗,Windows 版 iCloud 客户端如何下载?iCloud Drive 如何在 PC 使用?...
  14. 【Vue2注册登录界面】Vue2+elementUI编写一个登录页面,路由式开发,后台管理系统登录界面
  15. java实现字符串反转
  16. PAT 乙级 1002 写出这个数
  17. 【自然语言处理(NLP)】基于预训练模型的机器阅读理解
  18. 仙剑5手游服务器维护,《仙剑奇侠传》手游维护内容官方解答
  19. 天虹数科Java笔试题B
  20. linux主机无线连接显示器,如何用Linux外接显示器或投影机

热门文章

  1. ORA-280000:账户 已被锁定
  2. 【观察】驱动金融科技再创新,迎接金融服务新时代
  3. 【免费分享】王者荣耀改名微信小程序源码/可改空白名、重复名、符号名
  4. word邮件合并功能的用法
  5. Open Source Talk 01期 |邵赛赛《我的开源之旅》
  6. 函数局部有界性定理_函数有界性的定理如何证明
  7. Unity编辑器工具制作(一)
  8. android图片位于文字上方
  9. 为什么你不看好家教O2O
  10. scrapy爬虫案例-----赶集网