JVM 透彻理解JVM系列 我们正式进入Java虚拟机阶段的学习。整个系列包括两部分:基础篇和实战篇。基础篇针对JVM相关的基础知识进行介绍,核心内容是JVM内存模型、JVM垃圾回收机制,以及三种核心的垃圾回收器。实战篇则专注于JVM生产实践,主要解决JVM生产环境的参数优化,JVM GC问题和JVM OOM问题的处理。 2018-12-23 浏览(5,748) 评论(0) 阅读全文
JVM实战(33)——内存溢出之内存使用率过高 本章,我们将讲解一个已经稳定运行的系统的内存溢出问题,本章介绍的案例和之前有点区别,程序其实并没有发生OOM异常,但又确实是因为内存占用过多而被OS杀死。这个案例告诉大家,无论如何优化分析,它们背后的原理都是一套东西,掌握分析问题的思路才是最重要的。 2019-01-21 浏览(3,098) 评论(0) 阅读全文
JVM实战(34)——内存溢出之消息队列处理不当 本章,我们将分析一个因为内存队列处理不当引起的内存泄漏问题,本质是程序逻辑没写好,这也是本系列的最后一章。通过本系列的各个实战案例,相信读者也积累了不少JVM优化的经验,最重要的还是要归纳总结、举一反三,在实践中去印证自己所学的知识,然后再总结完善,最终融会贯通。 2019-01-21 浏览(2,669) 评论(1) 阅读全文
JVM实战(32)——内存溢出之堆外内存 本章,我们将讲解一个使用Jetty作为Web容器的应用的内存溢出问题,该内存溢出问题发生的区域是堆外内存,主要原因是JVM内存区域划分不合理。 2019-01-20 浏览(924) 评论(0) 阅读全文
JVM实战(31)——内存溢出之请求超时 本章,我们通过一个实际案例分析了因为请求超时引起的内存溢出问题,以及相应的排查思路。解决这类问题的思路其实都是一致的,需要一步步去分析,在实践中积累经验,举一反三。 2019-01-19 浏览(4,071) 评论(0) 阅读全文
JVM实战(30)——模拟堆内存溢出 本章,我们通过代码示例模拟了堆内存溢出的场景,Java堆内存也是最容易出现内存溢出的区域。基本的分析思路就是dump出事发现场的内存快照,然后通过MAT进行查看,分析出内存占用最多的对象,然后分析线程调用栈,找到代码位置,最后进行优化即可。 2019-01-18 浏览(3,687) 评论(0) 阅读全文
JVM实战(29)——模拟栈内存溢出 本章,我们将通过示例代码演示Java虚拟机栈区域是如何发生内存溢出的,并根据内存快照进行分析。 我们回顾下栈内存溢出的一个场景:每个线程的栈内存是固定的,如果某个线程不停的无限制调用方法,每次方法调用都会有一个栈帧入栈,此时就会导致线程的栈内存被耗尽。 2019-01-17 浏览(4,601) 评论(0) 阅读全文
JVM实战(28)——模拟Metaspace内存溢出 本章,我们将通过示例代码演示Metaspace区域是如何发生内存溢出的,并根据内存快照进行分析。 我们回顾下Metaspace区发生内存溢出的一个场景:程序不停的动态生成类,然后不停的加载类到Metaspace区域,而且这些动态生成的类必须得是不能被回收的,一旦Metaspace区满了,就会触发Full GC,而由于Metaspace区中的对象无法被回收,此时就触发了Metaspace内存溢出。 2019-01-16 浏览(4,569) 评论(0) 阅读全文
JVM实战(27)——内存溢出概述 从本章开始,我们将介绍JVM中的内存溢出异常——Out of Memory。我们运行Java程序时,本质是创建了一个JVM进程,然后在里面执行Java字节码。既然是进程,就一定有内存限制,当Java程序使用的内存空间超过限制时,就可能发生内存溢出异常。 在JVM中,一共有三种可能出现OOM的地方:方法区(元数据区)、Java栈内存、Java堆内存。本章,我们就来一一看一下各个区域内存溢出的情况。 2019-01-15 浏览(3,627) 评论(0) 阅读全文
JVM实战(26)——SystemGC 本章将介绍一个因为程序员同学不懂JVM的GC机制而导致的系统卡死的案例。针对本章案例中的问题,我们平时自己写代码时,不要自己去调用`System.gc()`方法随便触发GC,一方面可以通过在JVM参数中加入`-XX:+DisableExplicitGC`显示禁止代码中的GC操作,另一方面也要加强对开发人员的JVM相关知识的培训。 2019-01-14 浏览(5,490) 评论(0) 阅读全文