热门标签 | 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



推荐阅读
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 一面自我介绍对象相等的判断,equals方法实现。可以简单描述挫折,并说明自己如何克服,最终有哪些收获。职业规划表明自己决心,首先自己不准备继续求学了,必须招工作了。希望去哪 ... [详细]
  • 子类从父类继承所有的成员(字段,方法,嵌套类),构造方法不属于成员,所有子类不能继承,但是子类可以调用父类的构造方法对于private方法和属性,子类一定是继承了的,但是没有访问权 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • JavaScript简介及语言特点
    本文介绍了JavaScript的起源和发展历程,以及其在前端验证和服务器端开发中的应用。同时,还介绍了ECMAScript标准、DOM对象和BOM对象的作用及特点。最后,对JavaScript作为解释型语言和编译型语言的区别进行了说明。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 【Java面试】简单说一下你对序列化和反序列化的理解
    Hi,大家好,我是Mic一个工作4年的粉丝,投了很多简历好不容易接到一个互联网公司的面试邀约。在面试第一轮就被干掉了,原因是对主流互联网技术理解太浅了。其中就有一个这样的问题:“简 ... [详细]
  • JVM:33 如何查看JVM的Full GC日志
    1.示例代码packagecom.webcode;publicclassDemo4{publicstaticvoidmain(String[]args){byte[]arr ... [详细]
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社区 版权所有