![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM Trouble Shoot
文章平均质量分 66
bruce128
https://github.com/bruce256?tab=repositories
展开
-
K8S容器OOM killed排查
docker耗用完内存前,堆内存并没有达到上限,于是没有触发老年代GC,内存没有降下去。如果容器OOM killed,容器里的jvm进程没有Full GC,那么肯定是MaxRAMPercentage参数太高,导致堆内存没有用到上限,无法触发堆内存(老年代)GC。当实例内存超过95%时,对比top显示的的jvm进程内存和ps stats输出的docker实例内存信息,其余进程耗用的内存忽略不计。遂将内存增加到4GB。4 由于堆内存没有的到达上限,但是整个jvm进程内存超出了容器的内存限制。原创 2023-08-30 09:20:09 · 1837 阅读 · 0 评论 -
java线程阻塞问题排查方法
我开发的worker,每隔几个月线上都会阻塞一次,一直都没查出问题。今天终于了了这个心结。把解决过程总结下和大家分享。 首先用jstack命令打出这个进程的全部线程堆栈。拿到线程dump文件之后,搜索自己的worker名字。"DefaultQuartzScheduler_Worker-10" prio=10 tid=0x00007f55cd54d800 nid=0x3e2e wait原创 2015-08-10 18:41:08 · 45089 阅读 · 9 评论 -
JVM CPU高负载的排查办法
今天线上一个tomcat进程cpu负载100%。按以下步骤查出原因。 1.执行top -c命令,找到cpu最高的进程的id 2.执行top -H -p pid,这个命令就能显示刚刚找到的进程的所有线程的资源消耗情况。找到CPU负载高的线程tid 8627, 把这个数字转换成16进制,21B3。 3.执行jstack -l pid,拿到进程的线程dump文件。这个命令会原创 2015-02-05 20:17:20 · 12437 阅读 · 2 评论 -
JDK1.8 JVM运行时数据区域划分
一、JDK1.8 JVM内存模型概览这里介绍的是JDK1.8 JVM内存模型。1.8同1.7比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。二、各区域介绍1. 程序计数器每个线程一块,指向当前线程正在执行的字节码代码的行号。如果当前线程执...原创 2018-02-26 20:53:55 · 56331 阅读 · 47 评论 -
excel文件写性能优化
一 问题背景 通过POI框架生成excel文件的时候,一般选用的是XSSFWorkbook类。用这个类生成excel文件时,文件的所有数据均会存放在内存当中,包括cell对象,cellType对象等等。如果数据少的话,内存还能撑得住,但是超过了万行级别,内存就会被打爆。POI框架开发者直到3.8版本才提供了SXSSFWorkbook类用以解决这个问题。 Since 3.8-beta3...原创 2018-02-23 10:25:46 · 5177 阅读 · 5 评论 -
用SAX优化读excel文件的内存消耗
一 问题背景 一直在跟进excel的商品批量发布功能。去年大促前的半个月时间里用户频繁上传excel文件,导致线上机器频繁fullGC。虽然没有OOM,但是一直对吃内存问题耿耿于怀。通过堆dump分析,发现主要是poi框架的类实例耗用内存太大。poi框架的开发者也意识到了这个问题,通过提供比较底层的事件模式,解决吃内存的问题。 The SS eventmodel package is...原创 2018-02-06 21:39:20 · 2539 阅读 · 2 评论 -
Java堆内存富余却疯狂FullGc问题排查
刚上线了一个新的应用集群,第二天和第三天收到了应用FullGc超过阈值的报警短信。但是观察报警Java实例的jvm监控,堆内存仅仅用了1G多一点,还富余近700M。很困惑,剩余这么多内存没被使用,那么说明老年代内存是充足的才对啊! 同事提醒我是不是申请了什么大对象,诚然,老年代只会有两种类型的对象: 1. 多次Minor Gc中存活的小对象 2. 大对象,即超过了Pre...原创 2015-05-29 16:22:40 · 5280 阅读 · 1 评论 -
java.lang.OutOfMemoryError: PermGen space 问题解决办法
线上java应用报永久代(PermGen)OOM,遇到永久代OOM那就没啥办法了,只能为永久代扩容。 要做的就是改大PermSize这个参数。那么需要知道之前永久代的容量是多少。但是这个java实例的启动参数里并没有PermSize的定义。那么这个实例一定是用的永久代的默认大小。永久代的默认大小是多少呢?百度了一下,JDK1.6的默认大小是82M。果真如此吗?在这个实例执行 jsta...原创 2015-03-09 20:36:52 · 1490 阅读 · 0 评论