JavaGC
铁锚
系统架构师,Java性能调优专家。热爱程序开发和设计; 积极应对各种情境和挑战;
喜欢钻研新技术, 闲暇时喜欢翻译和分析英文文档/技术博客。
展开
-
深入解析G1垃圾收集器与性能优化
本文详细介绍怎样配置G1垃圾收集器的参数,如何进行性能调优, 以及如何对GC性能进行分析和评估。G1的全称为 Garbage First Garbage Collector, 是一款内置在HotSpot JVM 中的服务端垃圾收集器。G1使用【分代算法】, 将GC过程拆解为多个并发和并行阶段,将暂停时间打散,从而实现了低延迟特性,并保持良好的吞吐量。只要G1认为可以进行垃圾收集,就会触发一次GC, 当然,G1优先回收存活数据较少的区域。存活数据少就表示里面的垃圾对象多,这也是名字 Garbage.原创 2020-09-08 20:50:24 · 7687 阅读 · 0 评论 -
JVM技术细节: HotSpot的内存模型
1、对象无句柄在早期的JVM版本,例如 Classic VM 实现中,使用了 间接句柄(indirect handle) 来表示对象引用。虽然使用这种方式使得垃圾收集器在重定位对象(relocating)时非常方便,但却导致了严重的性能瓶颈,因为每次访问Java对象的实例变量都需要两步操作。HotSpot 推出以后,Java 代码就不再使用任何句柄。对象引用使用 直接指针(direct p...原创 2020-02-02 21:48:58 · 3074 阅读 · 0 评论 -
OutOfMemoryError系列(5): Unable to create new native thread
更多的情况, 触发创建 native 线程时的OutOfMemoryError, 表明编程存在BUG. 比如, 程序创建了成千上万的线程, 很可能就是某些地方出大问题了 —— 没有几个程序可以 Hold 住上万个线程的。翻译 2017-09-25 19:27:27 · 27169 阅读 · 1 评论 -
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 · 22264 阅读 · 0 评论 -
OutOfMemoryError系列(6): Out of swap space?
错误信息 java.lang.OutOfMemoryError: Out of swap space? 表明, 交换空间(swap space,虚拟内存) 不足,是由于物理内存和交换空间都不足所以导致内存分配失败。翻译 2017-09-29 19:15:56 · 4591 阅读 · 0 评论 -
OutOfMemoryError系列(8): Kill process or sacrifice child
一言不合就杀进程。。。我们知道, 操作系统(operating system)构建在进程(process)的基础上. 进程由内核作业(kernel jobs)进行调度和维护, 其中有一个内核作业称为 “Out of memory killer(OOM终结者)”, 与本节所讲的 OutOfMemoryError 有关。翻译 2017-10-09 00:54:37 · 23768 阅读 · 0 评论 -
OutOfMemoryError系列(3): Permgen space
本文通过实例介绍JDK7及之前的OutOfMemoryError: Permgen spaceJVM限制了Java程序的最大内存使用量, 可以通过启动参数来配置。各内存池的最大值, 由JVM启动参数 -Xmx 和 -XX:MaxPermSize 指定. 如果没有明确指定, 则根据操作系统平台和物理内存的大小来确定。翻译 2017-09-15 17:48:45 · 11124 阅读 · 6 评论 -
OutOfMemoryError系列(1): Java heap space
本文通过实例来分析 java.lang.OutOfMemoryError: Java heap space 问题产生的原因, 以及相关的解决方案翻译 2017-07-29 19:31:14 · 112518 阅读 · 16 评论 -
OutOfMemoryError系列(2): GC overhead limit exceeded
Java运行时环境内置了 垃圾收集(GC) 模块. 上一代的很多编程语言中并没有自动内存回收机制, 需要程序员手工编写代码来进行内存分配和释放, 以重复利用堆内存。在Java程序中, 只需要关心内存分配就行。如果某块内存不再使用, 垃圾收集(Garbage Collection) 模块会自动执行清理。GC的详细原理请参考 GC性能优化 系列文章, 一般来说, JVM内置的垃圾收集算法就能够应对绝大多数的业务场景。翻译 2017-08-25 19:16:09 · 197169 阅读 · 5 评论 -
G1垃圾收集器入门
G1垃圾收集器入门说明concurrent: 并发, 多个线程协同做同一件事情(有状态)parallel: 并行, 多个线程各做各的事情(互相间无共享状态)在GC领域: concurrent算法指GC线程和业务线程能并发执行; parallel指GC线程之间的并行。参考:What’s the difference between concurrency and paralle...翻译 2014-12-12 18:04:18 · 62187 阅读 · 15 评论 -
OutOfMemoryError系列(4): Metaspace
java.lang.OutOfMemoryError: Metaspace 错误所表达的信息是: 元数据区(Metaspace) 已被用满翻译 2017-09-22 11:46:46 · 36260 阅读 · 9 评论 -
RMI垃圾收集简介
RMI的垃圾回收算法为 引用计数法(reference-counting)翻译 2017-07-14 17:50:59 · 1415 阅读 · 0 评论 -
5. GC 调优(基础篇) - GC参考手册
GC调优(Tuning Garbage Collection)和其他性能调优是同样的原理。初学者可能会被 200 多个 GC参数弄得一头雾水, 然后随便调整几个来试试结果,又或者修改几行代码来测试。其实只要参照下面的步骤,就能保证你的调优方向正确原创 2017-02-14 17:41:49 · 12341 阅读 · 3 评论 -
Dalvik 虚拟机的垃圾收集简介
首先, Dalvik虚拟机比其他Java虚拟机中的垃圾收集要简单一些, 因为没有进行内存整理(no compacting). 也就是说堆内存中的对象在创建之后其地址永远都不会发生改变, 使得虚拟机其余部分的实现变得相对简单。翻译 2017-01-26 20:51:08 · 1329 阅读 · 0 评论 -
2. Java中的垃圾收集 - GC参考手册
**标记-清除**(Mark and Sweep)是最经典的垃圾收集算法。将理论用于生产实践时, 会有很多需要优化调整的地点, 以适应具体环境。下面通过一个简单的例子, 让我们一步步记录下来, 看看如何才能保证JVM能安全持续地分配对象。翻译 2017-01-07 00:02:54 · 11266 阅读 · 2 评论 -
1. 垃圾收集简介 - GC参考手册
顾名思义,垃圾收集(Garbage Collection)的意思就是 —— 找到垃圾并进行清理。但现有的垃圾收集实现却恰恰相反: 垃圾收集器跟踪所有正在使用的对象,并把其余部分当做垃圾。记住这一点以后, 我们再深入讲解内存自动回收的原理,探究 JVM 中垃圾收集的具体实现, 。我们不抠细节, 先从基础开始, 介绍垃圾收集的一般特征、核心概念以及实现算法。翻译 2016-12-02 11:29:01 · 13259 阅读 · 4 评论 -
JNI全局引用与JFrame.dispose()方法
用 jProfiler 分析 Java swing 程序中的内存泄漏问题时, 我发现内存中 JFrame 实例的数量一直在增加。各个 frame 被打开(opened),然后被关闭(closed)。通过 jProfiler, 并查看GC Root时, 只找到一项: 'JNI Global reference'。这是什么意思? 为什么他 hang 住了所有的 frame 实例?原创 2017-01-28 18:05:43 · 5098 阅读 · 0 评论 -
4. GC 算法(实现篇) - GC参考手册
学习了GC算法的相关概念之后, 我们将介绍在JVM中这些算法的具体实现。首先要记住的是, 大多数JVM都需要使用两种不同的GC算法 —— 一种用来清理年轻代, 另一种用来清理老年代。我们可以选择JVM内置的各种算法。如果不通过参数明确指定垃圾收集算法, 则会使用宿主平台的默认实现。本章会详细介绍各种算法的实现原理。翻译 2017-02-05 23:58:36 · 17636 阅读 · 6 评论 -
7. GC 调优(实战篇) - GC参考手册
JVM上运行的程序多种多样, 启动参数也有上百个, 其中有很多会影响到 GC, 所以调优GC性能的方法也有很多种。还是那句话, 没有真正的银弹, 能满足所有的性能调优指标。 我们能做的只是介绍一些常见的/和不常见的示例, 让你在碰到类似问题时知道是怎么回事。深入理解GC的工作原理, 熟练应用各种工具, 就可以进行GC调优, 提高程序性能。翻译 2017-03-13 19:12:17 · 27696 阅读 · 6 评论 -
6. GC 调优(工具篇) - GC参考手册
进行GC性能调优时, 需要明确了解, 当前的GC行为对系统和用户有多大的影响。有多种监控GC的工具和方法, 本章将逐一介绍常用的工具, 以及如何获取原生数据。 后续的章节将对重要的派生指标(derived metrics)展开讨论, 并引入GC性能相关的话题。翻译 2017-02-23 18:56:02 · 14313 阅读 · 1 评论 -
快速解读GC日志
本文介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息。翻译 2015-10-18 21:00:27 · 58381 阅读 · 1 评论 -
3. GC 算法(基础篇) - GC参考手册
本章简要介绍GC的基本原理和相关技术, 下一章节再详细讲解GC算法的具体实现。各种垃圾收集器的实现细节虽然并不相同,但总体而言,垃圾收集器都专注于两件事情: 1. 查找所有存活对象; 2.抛弃其他的部分,即死对象,不再使用的对象。相关术语翻译说明: Mark,标记; Sweep,清除; Compact,整理; Copy,复制;翻译 2017-01-13 12:16:12 · 8150 阅读 · 2 评论