
GC性能优化
文章平均质量分 87
详解Java之中的GC调优、工具、以及案例。
铁锚
系统架构师,Java性能调优专家。热爱程序开发和设计; 积极应对各种情境和挑战;
喜欢钻研新技术, 闲暇时喜欢翻译和分析英文文档/技术博客。
展开
-
深入解析G1垃圾收集器与性能优化
本文详细介绍怎样配置G1垃圾收集器的参数,如何进行性能调优, 以及如何对GC性能进行分析和评估。G1的全称为 Garbage First Garbage Collector, 是一款内置在HotSpot JVM 中的服务端垃圾收集器。G1使用【分代算法】, 将GC过程拆解为多个并发和并行阶段,将暂停时间打散,从而实现了低延迟特性,并保持良好的吞吐量。只要G1认为可以进行垃圾收集,就会触发一次GC, 当然,G1优先回收存活数据较少的区域。存活数据少就表示里面的垃圾对象多,这也是名字 Garbage.原创 2020-09-08 20:50:24 · 7930 阅读 · 0 评论 -
G1垃圾收集器入门
G1垃圾收集器入门说明concurrent: 并发, 多个线程协同做同一件事情(有状态)parallel: 并行, 多个线程各做各的事情(互相间无共享状态)在GC领域: concurrent算法指GC线程和业务线程能并发执行; parallel指GC线程之间的并行。参考:What’s the difference between concurrency and paralle...翻译 2014-12-12 18:04:18 · 62475 阅读 · 15 评论 -
深入JVM - JIT分层编译技术与日志详解
本文简要介绍了 JVM 中的分层编译技术。 包括两种类型的JIT编译器, 以及分层编译技术如何组合使用他们, 以达成最佳效果。还详细介绍了5种不同的编译级别, 以及相关的JVM调优参数。最后是一个具体的案例, 通过打印和分析编译日志, 深入学习了Java方法编译和优化的整个生命周期。原创 2023-08-09 16:16:37 · 2236 阅读 · 0 评论 -
不需要再手工指定JVM启动参数-XX:+UseCompressedOops
技术团队通过 GCeasy 工具分析完几千次用户上传的GC日志后, 发现一个现象: 仍然有很多Java程序传入了JVM启动参数 -XX:+UseCompressedOops。实际上,如果JVM的版本在 Java SE 6 update 23 及以上, 则不需要再设置 -XX:+UseCompressedOops 参数, 因为默认会开启。“OOP” 表示普通对象指针(Ordinary Object Pointer), 这种指针是对某个对象的托管指针(managed pointer)。 OOP占用的空间原创 2022-01-01 12:50:05 · 2973 阅读 · 0 评论 -
深入JVM - Code Cache内存池
深入JVM - Code Cache内存池1. 本文内容本文简要介绍JVM的 Code Cache(本地代码缓存池)。2. Code Cache 简要介绍简单来说,JVM会将字节码编译为本地机器码,并使用 Code Cache 来保存。每一个可执行的本地代码块,称为一个 nmethod。nmethod 可能对应一个完整的Java方法,或者是内联后的方法。即时编译器(just-in-time,JIT)是代码缓存区的最大消费者,所以此区域又被开发者称为 JIT code cache。3. 对 C原创 2021-03-24 10:50:27 · 12845 阅读 · 5 评论 -
获取Java线程转储的常用方法
1. 线程转储简介线程转储(Thread Dump)就是JVM中所有线程状态信息的一次快照。线程转储一般使用文本格式, 可以将其保存到文本文件中, 然后人工查看和分析, 或者使用工具/API自动分析。Java中的线程模型, 直接使用了操作系统的线程调度模型, 只进行简单的封装。线程调用栈, 也称为方法调用栈。 比如在程序执行过程中, 有一连串的方法调用链: ......原创 2021-01-07 21:26:48 · 24545 阅读 · 9 评论 -
获取JVM堆内存转储的常用方法
文章目录1. 堆内存转储简介2. 使用JDK内置工具2.1 `jmap` 工具2.2 `jcmd` 工具2.3 JVisualVM 工具3. 自动执行堆内存转储4. JMX方式4.1. JMX客户端工具4.2. 编程方式调用5. 小结1. 堆内存转储简介堆内存转储(Heap Dump),是指JVM堆内存在某一个时刻的快照,一般使用 hprof 格式的二进制文件来保存。 可用于分析内存泄漏问题,以及Java程序的内存使用优化。常见的内存转储分析工具包括: jhat, JVisualVM, 以及基于Ecl原创 2020-09-24 23:24:09 · 9470 阅读 · 1 评论 -
OutOfMemoryError系列(8): Kill process or sacrifice child
一言不合就杀进程。。。我们知道, 操作系统(operating system)构建在进程(process)的基础上. 进程由内核作业(kernel jobs)进行调度和维护, 其中有一个内核作业称为 “Out of memory killer(OOM终结者)”, 与本节所讲的 OutOfMemoryError 有关。翻译 2017-10-09 00:54:37 · 24015 阅读 · 0 评论 -
OutOfMemoryError系列(7): Requested array size exceeds VM limit
Java平台限制了数组的最大长度。各个版本的具体限制可能稍有不同, 但范围都在 `1 ~ 21亿` 之间。如果程序抛出 `java.lang.OutOfMemoryError: Requested array size exceeds VM limit` 错误, 就说明想要创建的数组长度超过限制。翻译 2017-10-07 16:23:03 · 22580 阅读 · 0 评论 -
OutOfMemoryError系列(6): Out of swap space?
错误信息 java.lang.OutOfMemoryError: Out of swap space? 表明, 交换空间(swap space,虚拟内存) 不足,是由于物理内存和交换空间都不足所以导致内存分配失败。翻译 2017-09-29 19:15:56 · 4647 阅读 · 0 评论 -
OutOfMemoryError系列(5): Unable to create new native thread
更多的情况, 触发创建 native 线程时的OutOfMemoryError, 表明编程存在BUG. 比如, 程序创建了成千上万的线程, 很可能就是某些地方出大问题了 —— 没有几个程序可以 Hold 住上万个线程的。翻译 2017-09-25 19:27:27 · 27455 阅读 · 1 评论 -
OutOfMemoryError系列(4): Metaspace
java.lang.OutOfMemoryError: Metaspace 错误所表达的信息是: 元数据区(Metaspace) 已被用满翻译 2017-09-22 11:46:46 · 36407 阅读 · 9 评论 -
OutOfMemoryError系列(3): Permgen space
本文通过实例介绍JDK7及之前的OutOfMemoryError: Permgen spaceJVM限制了Java程序的最大内存使用量, 可以通过启动参数来配置。各内存池的最大值, 由JVM启动参数 -Xmx 和 -XX:MaxPermSize 指定. 如果没有明确指定, 则根据操作系统平台和物理内存的大小来确定。翻译 2017-09-15 17:48:45 · 11261 阅读 · 6 评论 -
OutOfMemoryError系列(2): GC overhead limit exceeded
Java运行时环境内置了 垃圾收集(GC) 模块. 上一代的很多编程语言中并没有自动内存回收机制, 需要程序员手工编写代码来进行内存分配和释放, 以重复利用堆内存。在Java程序中, 只需要关心内存分配就行。如果某块内存不再使用, 垃圾收集(Garbage Collection) 模块会自动执行清理。GC的详细原理请参考 GC性能优化 系列文章, 一般来说, JVM内置的垃圾收集算法就能够应对绝大多数的业务场景。翻译 2017-08-25 19:16:09 · 198581 阅读 · 5 评论 -
OutOfMemoryError系列(1): Java heap space
本文通过实例来分析 java.lang.OutOfMemoryError: Java heap space 问题产生的原因, 以及相关的解决方案翻译 2017-07-29 19:31:14 · 114069 阅读 · 16 评论 -
OOM终结者参数调优
内存溢出(Out of Memory,OOM), 是指计算机的所有可用内存(包括交换空间, swap space), 都被使用满了。 这种情况下, 默认配置会导致系统报警, 并停止正常运行. 当然, 将 /proc/sys/vm/panic_on_oom 参数设置为 0, 则告诉系统内核, 如果系统发生内存溢出, 就可以调用 oom_killer(OOM终结者)功能, 来杀掉最胖的那头进程(rog...原创 2018-05-27 11:56:54 · 7749 阅读 · 1 评论 -
快速解读GC日志
本文介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息。翻译 2015-10-18 21:00:27 · 58461 阅读 · 1 评论 -
7. GC 调优(实战篇) - GC参考手册
JVM上运行的程序多种多样, 启动参数也有上百个, 其中有很多会影响到 GC, 所以调优GC性能的方法也有很多种。还是那句话, 没有真正的银弹, 能满足所有的性能调优指标。 我们能做的只是介绍一些常见的/和不常见的示例, 让你在碰到类似问题时知道是怎么回事。深入理解GC的工作原理, 熟练应用各种工具, 就可以进行GC调优, 提高程序性能。翻译 2017-03-13 19:12:17 · 27791 阅读 · 6 评论 -
6. GC 调优(工具篇) - GC参考手册
进行GC性能调优时, 需要明确了解, 当前的GC行为对系统和用户有多大的影响。有多种监控GC的工具和方法, 本章将逐一介绍常用的工具, 以及如何获取原生数据。 后续的章节将对重要的派生指标(derived metrics)展开讨论, 并引入GC性能相关的话题。翻译 2017-02-23 18:56:02 · 16677 阅读 · 1 评论 -
5. GC 调优(基础篇) - GC参考手册
GC调优(Tuning Garbage Collection)和其他性能调优是同样的原理。初学者可能会被 200 多个 GC参数弄得一头雾水, 然后随便调整几个来试试结果,又或者修改几行代码来测试。其实只要参照下面的步骤,就能保证你的调优方向正确原创 2017-02-14 17:41:49 · 14334 阅读 · 3 评论 -
4. GC 算法(实现篇) - GC参考手册
学习了GC算法的相关概念之后, 我们将介绍在JVM中这些算法的具体实现。首先要记住的是, 大多数JVM都需要使用两种不同的GC算法 —— 一种用来清理年轻代, 另一种用来清理老年代。我们可以选择JVM内置的各种算法。如果不通过参数明确指定垃圾收集算法, 则会使用宿主平台的默认实现。本章会详细介绍各种算法的实现原理。翻译 2017-02-05 23:58:36 · 17756 阅读 · 6 评论 -
3. GC 算法(基础篇) - GC参考手册
本章简要介绍GC的基本原理和相关技术, 下一章节再详细讲解GC算法的具体实现。各种垃圾收集器的实现细节虽然并不相同,但总体而言,垃圾收集器都专注于两件事情: 1. 查找所有存活对象; 2.抛弃其他的部分,即死对象,不再使用的对象。相关术语翻译说明: Mark,标记; Sweep,清除; Compact,整理; Copy,复制;翻译 2017-01-13 12:16:12 · 8193 阅读 · 2 评论 -
2. Java中的垃圾收集 - GC参考手册
**标记-清除**(Mark and Sweep)是最经典的垃圾收集算法。将理论用于生产实践时, 会有很多需要优化调整的地点, 以适应具体环境。下面通过一个简单的例子, 让我们一步步记录下来, 看看如何才能保证JVM能安全持续地分配对象。翻译 2017-01-07 00:02:54 · 11342 阅读 · 2 评论 -
1. 垃圾收集简介 - GC参考手册
顾名思义,垃圾收集(Garbage Collection)的意思就是 —— 找到垃圾并进行清理。但现有的垃圾收集实现却恰恰相反: 垃圾收集器跟踪所有正在使用的对象,并把其余部分当做垃圾。记住这一点以后, 我们再深入讲解内存自动回收的原理,探究 JVM 中垃圾收集的具体实现, 。我们不抠细节, 先从基础开始, 介绍垃圾收集的一般特征、核心概念以及实现算法。翻译 2016-12-02 11:29:01 · 13300 阅读 · 4 评论