JVM垃圾回收器和调优
回顾
什么是GC?
找到垃圾,并且回收,让这块内存重新可用。
Java的GC算法是根搜索算法,可以作为GCRoot的对象有
- 线程栈变量
- 静态变量
- 常量池
- JNI指针
回收的算法有:
- 标记清除
- 标记整理
- 复制算法
TLAB:Thread Local Allocation Buffer
回收器简介
垃圾回收器的发展过程是随着内存越来越大的过程而演进的。
从分代算法演化到不分代算法。
分代算法的垃圾回收器
Young 年轻代收集器
Serial
单线程垃圾回收器,在回收时会STW(Stop-The-World:其他所有的工作线程都停止,只有垃圾回收线程在工作)
Serial在内存小(几兆到几十兆)的时候STW时间短,但随着内存的增大,STW的时间变长。
ParNew
Parallel Scavenge的增强,区别点是ParNew能和CMS搭配。Parallel Scavenge
多个GC线程,在回收时依然会STW。
适用于几个G的内存。
Old 老年代收集器
CMS
Concurrent Mark Swap 并发标记清除,承前启后的算法,但有缺点,没有一个JDK版本默认使用CMS。三色标记 - 错标 - Incremental Update增量更新 - Remark + 写屏障
CMS缺点:Mark&Swap会使空间不连续,当新的对象不能从新生代升级到老年代的时候,它会使用单线程(Serial Old)对老年代进行清理 ,大内存是不能容忍的。
适用于几十个G的内存。
CMS有两次STW,但都很短暂。
初始标记只标记GC Root,并发标记从GC Root向下搜索。问题:
- 并发标记为非垃圾,在标记之后工作线程又把它设为垃圾。这就会造成浮动垃圾。
- 并发标记为垃圾,但在标记之后工作线程又重新连接了它。这问题如果不解决会造成非常严重的问题。
并发标记会有一些失误,重新标记会修正这些失误。
Serial Old
老年代的SerialParallel Old
老年代的Parallel
常用的组合:
- Serial 和 Serial Old,现在已经很少见了。
- Parallel Scavenge 和 Parallel Old , 1.8版本默认的搭配,简称PS+PO或Parallel GC
- ParNew 和 CMS
不使用分代算法的垃圾回收器
- G1
Garbage First:分区(Region)回收,优先清理垃圾最多的区。逻辑上每个区可以是Old,Survior,Eden,Humongous,物理上不分代,但是逻辑上依然是分代算法。
支持上百个G的内存。三色标记 + SATB + 写屏障
ZGC
不分代。Colored Pointer颜色指针 着色指针 + 读屏障
支持4个T的内存。
Shenandoah
算法与ZGC类似,与ZGC是竞争关系。
支持4个T的内存。Epsilon
啥也不干的垃圾回收器,可以用来:- 确认一个程序根本不需要用GC,可以用Epsilon
- 程序测试,用来观察垃圾产生的过程。
调优
基础概念:
- 吞吐量 :用户代码时间/(用户代码时间 + 垃圾回收时间)
- 响应时间 :STW时间越短,响应时间越好。
对于科学计算、数据挖掘,优先考虑吞吐量。
对于网站、GUI优先考虑响应时间。
什么是调优?
- 根据需求,对JVM规划和预调优
- 优化JVM运行环境(卡顿、慢)
- 解决JVM运行过程中出现的问题(OOM)
命令行参数介绍:
HotSpot参数分类:
标准: - 开头
非标准: -X开头,特定版本的HotSpot支持特定的命令
不稳定: -XX开头,下个版本可能取消
命令行参数大全
java -XX:+PrintFlagsWithComments # 只有Debug版本能用
待续…
JVM垃圾回收器和调优相关推荐
- 转载一条G1垃圾回收器的调优经验
感觉写的不错,G1在未来两三年肯定慢慢占据主流,多学习学习: 开源搜索引擎Solr是一款非常优秀的搜素引擎,只要一些简单的配置就能进行使用,大大减少了开发时间. 在我工作的环境中,整站的商品搜索业务都 ...
- JVM内存模型、原理、垃圾回收、调优
JVM内存模型.原理.垃圾回收.调优,这Java语言的基础,作为Java从业人员是必须要掌握的,另外这也是面试经常会问到的知识. ----------------------------------- ...
- JVM 垃圾回收器工作原理及使用实例介绍
2019独角兽企业重金招聘Python工程师标准>>> 垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况.自 ...
- jvm原理及性能调优系列(jvm调优)
jvm原理及性能调优系列(jvm调优) JVM设置: 1.设置合适的最大堆内存(新生代和老生代的最大和值)和最小堆内存(jvm启动时占用的操作系统内存大小),及设置好堆的比例分配. 2.设置合适的新生 ...
- JVM垃圾回收器工作原理及使用实例介绍
垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况.自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增加了软件系统的负担. 拥 ...
- JVM基础知识和调优
JVM基础知识和调优 什么是垃圾 当一个对象有人引用它时,那么就不是垃圾,不然就不是垃圾 如何辨别一个对象是不是垃圾 计数(最基础的),有一个对象引用就记一个数(i++)问题,循环引用 GC root ...
- JVM常用参数以及调优实践
JVM常用参数选项 jvm 可配置的参数选项可以参考 Oracle 官方网站给出的相关信息:http://www.oracle.com/technetwork/java/javase/tech/vmo ...
- 深入理解JVM虚拟机10:JVM常用参数以及调优实践
本文转自[JVM常用参数以及调优实践](https://blog.csdn.net/a724888/article/details/78367780) JVM常用参数选项 jvm 可配置的参数选项可以 ...
- JVM 垃圾回收器工作原理及使用实例介绍(原文已发表于IBM开发者论坛)
打个广告,本人的<大话Java性能优化>一书已经在亚马逊.当当.京东.天猫出售,感谢大家对致力于技术推广梦想者的支持. 垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理, ...
最新文章
- 给未来元素添加事件 jquery 1.10.2 版本
- 滴滴高管今年集体不拿年终奖 员工奖励力度缩减一半
- python内置模块re_常用内置模块(11):正则表达式、re模块
- [BZOJ1130] [POI2008]POD Subdivision of Kingdom
- python decorator ssh_Python库现后门 可窃取用户SSH信息
- RHEL6 64bit下更改YUM配置。yum this system is not registered with rhn的解决办法
- ThhinkPHP5隐藏入口文件index.php
- 信息学奥赛一本通(1281:最长上升子序列)
- Elasticsearch进阶
- Android自定义控件学习(一)-----属性
- Redis基础(二)——通用命令和配置
- java怎么对用户做自定义模版打印_Printing tools 自定义模板打印的实现
- mac安装linux 键盘不能用了,Parallels Desktop 9在Mac虚拟机安装Linux Ubuntu系统
- YDOOK:Maxwell 电磁场仿真 最新版的 Maxwell 软件 使用什么软件进行电磁场仿真
- ss命令在linux上的安装
- ERD-ONLINE 2.0.3 免费在线数据库建模工具 正式发布
- 如何掌握UI设计精髓 Logo设计有哪些基本要素
- ListView分页下载
- Spring Security + SpringBoot + Mybatis-plus实现前后端分离的权限管理系统
- Python程序员搞副业兼职,一月赚7800元小意思,每天只花了两小时