热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java+垃圾回收器+的功能_JAVAJVM垃圾回收器

分代收集:新生代(复制算法),老年代(标记清除,标记整理)、jps-v可查看当前JVM使用的是那种垃圾收集器垃圾回收器又分单线程多线程&#

分代收集:新生代(复制算法),老年代(标记清除,标记整理) 、

jps -v 可查看当前JVM 使用的是那种垃圾收集器

垃圾回收器又分单线程多线程,使用。

常见的垃圾回收器如下图:垃圾回收器的连线表示搭配使用的意思,不同的颜色表示不同的算法(3种)

使用标记清除的只有CMS 一种垃圾回收器

G1是独立使用的,并且可以跨代回收。(JDK1.7之后出的)

多线程的垃圾回收器:多线程收集,也就是并行;多线程收集和多线程的应用同时进行,也就是并发;

垃圾收集器的连线是组合使用的意思,不同的字体颜色代表不同的垃圾回收算法;

25c763886e78b0501f2aefa1c22abb3e.png

单线程回收器:

Serial/Serial old: 最古老,独占式,成熟,适合单CPU服务器

多线程回收器:

ParNew:与 Serial 没什么区别,唯一的区别就是多线程收集,多cpu,停顿时间较Serial少

除了性能原因之外,在新生代除了Serial,就只有ParNew能与CMS收集器配合使用

Parallel Scavenge(Paraller GC) /Parallel Old: 关注吞吐量的垃圾收集器,高吞吐量可以高效的利用cpu时间,尽快的完成运算任务,

主要适合后台运算不太需要交换的任务。

所谓的吞吐量:吞吐量=运行代码的时间(99分钟)/(运行代码的时间(99分钟)+垃圾回收的时间(1分钟)),

99%=99(分钟)/(99分钟+1分钟),吞吐量为99%;

垃圾回收器组合:

-XX:+UseSerialGC 新生代和老年代串行收集器(Serial+Serial Old)

-XX:+UseParNewGC 新生代使用 ParNew,老年代使用 Serial Old

-XX:+UseParallelGC 新生代使用Parallel Scavenge,老年代使用 Parallel Old

简单垃圾收集器的工作原理:

374fea09404c06d4ca613d74f052ad48.png

重点关注两种垃圾收集器:CMS,G1(G First)

CMS(Concurrent Mark Sweep) :CMS是基于标记清除算法,以及并行和并发收集的回收器;

过程大概如下:初始标记(暂停所有线程)--》并发标记(时间长)--》重新标记--》并发清除(时间长)--》重置线程

初始标记:仅仅是标记GC Roots 判断对象是否可达,速度快,需要暂停所有线程(Stop the World)

并发标记:从GC Roots 开始对堆中的对象进行可达性分析,找到存活对象,整个生命周期中耗时最长,不需要停顿

重新标记:为了修正并发标记期间用户对程序产生的对象的变化的标记,需要停顿,这个时间比初始标记要长,比并发要短

并发清除:垃圾开始回收,不需要停顿

364429668917a7262e27434240388508.png

优点:由于耗时最长的并发标记和并非清理都是和用户线程一起进行的,所以总体上CMS给人的感觉就是没停顿;

缺点: CPU要求高,因为并发是占用量资源的;

标记清除算法导致的垃圾碎片,

并发标记会产生浮动垃圾, 需要等下一次垃圾回收来清理,占用内存,需要预留一部分空间来存放浮动垃圾;

G1(Garbage-First)垃圾回收器:基于复制和标记整理算法的并行,并发收集器;(Global Concurrent Marking)

一般要求cup内存空间足够大,内存过小不建议用,失败会启用FullGC(serial Old)

过程大概如下:初始标记(暂停所有线程)--》并发标记---》最终标记(暂停所有线程)--》筛选回收

初始标记:仅仅标记一下GC Roots 能直接关联到的对象,需要停顿,耗时短

并发标记:进行可达性分析,找到存活对象,耗时长,与用户线程同时进程

最终标记:为了修正用户并发标记期间对标记对象产生变化的那一部分对象记录,需要停顿

筛选回收:首先对各个Region中的回收价值和成本进行排序(后台维护了优先序列表),

根据用户所期望的停顿时间来制定回收计划

此阶段是可以跟用户线程并发进行的,因为只回收一部分Region ,所以时间可控

而且停顿用户线程将大幅度提高效率

d7209f8559aa04fc7c6b541cc9506635.png

特点:   内存布局发生了改变

空间整合,不会产生内存碎片

化整为零,分而治之,可预测的停顿(默认200ms),可根据用户设定的回收时间来提供回收方案

比如:100g 内存,分成10份,每份就是10g(G First 的意思就是急需回收的意思)

158e110e58f740009f085dc8eb4b408c.png

模式:

Young GC:主要对Eden区Survivor区(Form,To)进行回收

Mixed GC:Survivor区与Old区,Humongous (大对象)

G1主要参数配置:

-XX:+UseG1GC,使用G1垃圾回收器

-XX:G1HeapRegionSize = n ,设置每个Region 的大小,并非最终

-XX:MaxGCPauseMillis    ,设置G1收集过程目标时间,默认是200ms,不是硬性条件

-XX:G1NewSizePercent,    新生代最小值,默认是5%

-XX:G1MaxNewSizePercent, 新生代最大值,默认是60%

-XX:ParallelGCThreads  ,STW 期间,并行GC的线程数

-XX:ConcGCThreads = n, 并发标记阶段,并行执行的线程数

-XX:InitiatingHeapOccupancyPercent 设置触发标记周期的Java堆占用阈值。默认值是45%,

这里的java堆占比值得是non_young_capacity_bytes,包括old+humongous

垃圾回收器的重要参数(使用-XX:):

cc2e9a08c76b92fefb2ac2c48ea8b4ba.png



推荐阅读
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 深入探讨:Actor模型如何解决并发与分布式计算难题
    在现代软件开发中,高并发和分布式系统的设计面临着诸多挑战。本文基于Akka最新文档,详细探讨了Actor模型如何有效地解决这些挑战,并提供了对并发和分布式计算的新视角。 ... [详细]
  • JUC并发编程——线程的基本方法使用
    目录一、线程名称设置和获取二、线程的sleep()三、线程的interrupt四、join()五、yield()六、wait(),notify(),notifyAll( ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • pypy 真的能让 Python 比 C 还快么?
    作者:肖恩顿来源:游戏不存在最近“pypy为什么能让python比c还快”刷屏了,原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。正式开始之前,多唠叨两句 ... [详细]
  • 关于进程的复习:#管道#数据的共享Managerdictlist#进程池#cpu个数1#retmap(func,iterable)#异步自带close和join#所有 ... [详细]
  • 大华股份2013届校园招聘软件算法类试题D卷
    一、填空题(共17题,每题3分,总共51分)1.设有inta5,*b,**c,执行语句c&b,b&a后,**c的值为________答:5 ... [详细]
  • 在iOS开发中,多线程技术的应用非常广泛,能够高效地执行多个调度任务。本文将重点介绍GCD(Grand Central Dispatch)在多线程开发中的应用,包括其函数和队列的实现细节。 ... [详细]
  • 在运行于MS SQL Server 2005的.NET 2.0 Web应用中,我偶尔会遇到令人头疼的SQL死锁问题。过去,我们主要通过调整查询来解决这些问题,但这既耗时又不可靠。我希望能找到一种确定性的查询模式,确保从设计上彻底避免SQL死锁。 ... [详细]
  • 协程作为一种并发设计模式,能有效简化Android平台上的异步代码处理。自Kotlin 1.3版本引入协程以来,这一特性基于其他语言的成熟理念,为开发者提供了新的工具,以增强应用的响应性和效率。 ... [详细]
  • 本文详细介绍了JVM内存分配的相关知识,包括内存规整、内存分配方式以及并发指针碰撞问题的解决方案。 ... [详细]
  • Java作为全球最流行的编程语言之一,应用广泛。本文将详细介绍Java开发的相关岗位及其具体职责,帮助读者更好地了解这一领域的职业发展路径。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
author-avatar
WINNIE双双围脖_370
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有