jvm 垃圾回收器比较_jvm有哪些垃圾回收算法

jvm 垃圾回收器比较_jvm有哪些垃圾回收算法十种垃圾回收器的简介以及调优的一些经验

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

回顾


什么是GC?

找到垃圾,并且回收,让这块内存重新可用。

Java的GC算法是根搜索算法,可以作为GCRoot的对象有

  • 线程栈变量
  • 静态变量
  • 常量池
  • JNI指针

回收的算法有:

  • 标记清除
  • 标记整理
  • 复制算法
    TLAB:Thread Local Allocation Buffer

回收器简介


垃圾回收器的发展过程是随着内存越来越大的过程而演进的。
从分代算法演化到不分代算法。
十种垃圾回收器

分代算法的垃圾回收器

Young 年轻代收集器
  1. Serial
    单线程垃圾回收器,在回收时会STW(Stop-The-World:其他所有的工作线程都停止,只有垃圾回收线程在工作)
    Serial在内存小(几兆到几十兆)的时候STW时间短,但随着内存的增大,STW的时间变长。
    Serial收集器

  2. ParNew
    Parallel Scavenge的增强,区别点是ParNew能和CMS搭配

  3. Parallel Scavenge
    多个GC线程,在回收时依然会STW。
    适用于几个G的内存。
    Parallel Scavenge 垃圾回收器

Old 老年代收集器
  1. CMS
    Concurrent Mark Swap 并发标记清除,承前启后的算法,但有缺点,没有一个JDK版本默认使用CMS。

    三色标记 – 错标 – Incremental Update增量更新 – Remark + 写屏障

    CMS缺点:Mark&Swap会使空间不连续,当新的对象不能从新生代升级到老年代的时候,它会使用单线程(Serial Old)对老年代进行清理 ,大内存是不能容忍的。
    适用于几十个G的内存。
    CMS
    CMS有两次STW,但都很短暂。
    初始标记只标记GC Root,并发标记从GC Root向下搜索。

    问题

    • 并发标记为非垃圾,在标记之后工作线程又把它设为垃圾。这就会造成浮动垃圾
    • 并发标记为垃圾,但在标记之后工作线程又重新连接了它。这问题如果不解决会造成非常严重的问题。

    并发标记会有一些失误重新标记会修正这些失误。

  2. Serial Old
    老年代的Serial

  3. Parallel Old
    老年代的Parallel

常用的组合:

  • Serial 和 Serial Old,现在已经很少见了。
  • Parallel Scavenge 和 Parallel Old , 1.8版本默认的搭配,简称PS+PO或Parallel GC
  • ParNew 和 CMS

不使用分代算法的垃圾回收器

  1. G1
    Garbage First:分区(Region)回收,优先清理垃圾最多的区。逻辑上每个区可以是Old,Survior,Eden,Humongous,物理上不分代,但是逻辑上依然是分代算法。
    支持上百个G的内存。

    三色标记 + SATB + 写屏障

G1垃圾回收器

  1. ZGC
    不分代。

    Colored Pointer颜色指针 着色指针 + 读屏障

    支持4个T的内存。

  2. Shenandoah
    算法与ZGC类似,与ZGC是竞争关系。
    支持4个T的内存。

  3. Epsilon
    啥也不干的垃圾回收器,可以用来:

    • 确认一个程序根本不需要用GC,可以用Epsilon
    • 程序测试,用来观察垃圾产生的过程。

调优


基础概念:

  1. 吞吐量 :用户代码时间/(用户代码时间 + 垃圾回收时间)
  2. 响应时间 :STW时间越短,响应时间越好。

对于科学计算、数据挖掘,优先考虑吞吐量。
对于网站、GUI优先考虑响应时间。

什么是调优?

  1. 根据需求,对JVM规划和预调优
  2. 优化JVM运行环境(卡顿、慢)
  3. 解决JVM运行过程中出现的问题(OOM)

命令行参数介绍
HotSpot参数分类:

标准: – 开头
非标准: -X开头,特定版本的HotSpot支持特定的命令
不稳定: -XX开头,下个版本可能取消

命令行参数大全

java -XX:+PrintFlagsWithComments  # 只有Debug版本能用

待续…

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/197772.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • sql2008删除默认实例_sql2000默认实例名

    sql2008删除默认实例_sql2000默认实例名在网上找到下面几种方法,本人使用的是第一种,很实用。1.删除SQLServer的特定实例若要删除SQLServer的某个特定实例,请按照以下步骤操作:找到并删除%drive%:\\ProgramFiles\\MicrosoftSQLServer\\MSSQL\\Binn文件夹,其中%drive%是要删除的SQLServer实例的位置。找到以下注册表项:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MSSQLServer相应的..

  • 骑士编年史服务器没响应,骑士编年史非root刷初始方法

    骑士编年史服务器没响应,骑士编年史非root刷初始方法骑士编年史初始怎么刷?安卓机不root怎么刷初始?来看看9k9k小编rayxx带来的骑士编年史非root刷初始方法。开始第一步前请确认该文件夹的属性大小,在正常情况下该文件夹大小应该在1.3g以上。如果出现大小只有以k为单位或者100m以下的情况,此方法将不适用于你的手机系统,只能直接进行第二步,重新下载数据包,如果root了那就更简单了,百度一下你就知道。第一步,打开自带的文件管理器找到下图所示…

    2022年10月21日
  • OkGo使用缓存(苹果清理缓存)

    添加依赖:implementation’com.lzy.net:okgo:3.0.4’添加网络权限:<uses-permissionandroid:name="android.permission.INTERNET"/>准备网络数据:使用:OkGo.getInstance().init(getApplication()…

  • 龙芯架构是自己的吗_debian重装系统

    龙芯架构是自己的吗_debian重装系统龙芯灵珑一体机,型号9s2a,pmon版本LM9103-1.5.9原机硬盘250g,装有debian5和debian6双系统由于在debian6系统下不小心误删除了部分文件,导致系统不能关机,不能重启,故重装。此次安装采用usb安装方式前期准备:(在linux系统下,下载安装文件,解压文件,拷贝到u盘)1,将debian6的安装文件拷贝到u盘(一体机挑u盘,没有u盘可以采用硬盘…

    2022年10月18日
  • Kali安装教程(VMWare)「建议收藏」

    Kali安装教程(VMWare)「建议收藏」1.下载镜像及相关1.1下载镜像文件下载链接:https://www.kali.org/downloads/选择自己需要的版本下载,根据经验先下载种子文件(torrent)再用迅雷下载网速是最有

  • 回文串「建议收藏」

    回文串「建议收藏」1.1.最长回文串LeetCode:给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如"Aa"不能当做一个回文字符串。注意:假设字符串的长度不会超过1010。回文串:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。——百度百科地址:https://baike.baid…

    2022年10月22日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号