同事有段代码执行时间过长,需要进行优化,

        Hashmultimap<Int,Bean> map = ...;
for (400w*96)
{
// 计算过程
Bean = doCompute();
// 缓存计算结果
map.put(int,Bean);
}

刚开始以为是计算过程doCompute效率低造成的,所以想各种方法优化计算,提前计算、多线程、。。。。等等等等,最终如下

        // 多线程计算
....
// 计算结果放入队列
ConcurrentLinkedQueue queue = ...;
queue.offer(doCompute());
..... // 队列数据放入缓存
Hashmultimap<Int,Bean> map = ...;
map.put(int,queue.poll());

但还是不行,跑跑就cpu 100%,找不到什么原因,直到快下班时突然想到是不是内存引起的,然后放到服务器上一执行,-Xms20G -Xmx20G,没有任何问题。

分析了下,找到了原因(纯分析,下周打印下jvm日志验证下):

对于Hashmultimap和ConcurrentLinkedQueue来说,因为是循环单个放入缓存,所以jvm是逐渐到达最大堆栈的,而一旦jvm发现内存不够用,就启动GC过程,但GC结束发现还是不够用(因为没有实例需要回收)就又启动GC,。。。,循环往复,业务代码不能跑,CPU全被GC占满,而且也不抛内存溢出的异常。

问题定位过程曲折:先入为主容易钻死胡同、好为人师的人真nm多、要相信jvm的计算生产水平。。。。

另外,记录下一些可能用到的知识:

JVM初始分配的内存默认是物理内存的1/64,默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制,-XX:MinHeapFreeRatio=40.

JVM最大分配的内存默认是物理内存的1/4,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制,-XX:MaxHeapFreeRatio=70.

通过free查看到的空闲内存不能完全分配到jvm,能分配的比例应该和jvm厂商、os有关。

一次GC问题定位的更多相关文章

  1. golang GC(二 定位)

    前面已经介绍过golang的GC算法.要是我们的程序在运行是因为GC导致行能下降,该如何定位呢?说实话,工作中由于对go的gc问题不重视,根本没考虑过这个问题,今天特意来补补课.

  2. 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法

    垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...

  3. Memory Analyzer Tool定位Java heap space内存泄漏

    java heap space是一个很蛋疼的问题,如果开发调试时遇到还好,如果是在项目上线后运行一段时间后,才抛出该异常,那真的很悲剧(那你得找代码中到底是哪里内存泄露了),这真是一个悲伤的故事. 1 ...

  4. [No0000196]一文读懂Java 11的ZGC为何如此高效

    导读:GC是大部分现代语言内置的特性,Java 11 新加入的ZGC号称可以达到10ms 以下的 GC 停顿,本文作者对这一新功能进行了深入解析.同时还对还对这一新功能带来的其他可能性做了展望.ZGC ...

  5. JDK11 | 第七篇 : ZGC 垃圾收集器

    一.简介 Java 11包含一个全新的垃圾收集器--ZGC,它由Oracle开发,承诺在数TB的堆上具有非常低的暂停时间. 在本文中,我们将介绍开发新GC的动机,技术概述以及由ZGC开启的一些可能性. ...

  6. 一语道破Java 11的ZGC为何如此高效

    GC是大部分现代语言内置的特性,Java 11 新加入的ZGC号称可以达到10ms 以下的 GC 停顿,本文作者对这一新功能进行了深入解析.同时还对还对这一新功能带来的其他可能性做了展望.ZGC是否可 ...

  7. 编译调试 .NET Core 5.0 Preview 并分析 Span 的实现原理

    很久没有写过 .NET Core 相关的文章了,目前关店在家休息所以有些时间写一篇新的

  8. Java 11 New Features

    前言 北京时间 2018年9 月 26 日,Oracle 官方宣布 Java 11 正式发布.这是 Java 大版本周期变化后的第一个长期支持版本,非常值得关注.从官网即可下载, 最新发布的 Java ...

  9. Java11-ZGC

    Java 11包含一个全新的垃圾收集器--ZGC,它由Oracle开发,承诺在数TB的堆上具有非常低的暂停时间. 在本文中,我们将介绍开发新GC的动机,技术概述以及由ZGC开启的一些可能性. 那么为什 ...

随机推荐

  1. Office 365 Certificate Exam Resources

    70-321 Deploying Office 365 Deploying Office 365 Jump Start (01): Infrastructure Planning Deploying ...

  2. iOS开发——语法篇OC篇&高级语法精讲

    高级语法精讲 一.NSSet.NSMutableSet集合的介绍 1)NSSet.NSMutableSet集合,元素是无序的,不能有重复的值. 2)用实例方法创建一个不可变集合对象 例如: //宏定义 ...

  3. LVS 之 DR 2

    http://www.cnblogs.com/kgdxpr/archive/2013/09/09/3309776.html http://lyp0909.blog.51cto.com/508999/5 ...

  4. 把json格式对象转成可提交字符串格式,会过滤掉函数 {a: {b: 3}, b: [1], c: "d"} -> a.b=3&b[0]=1&c=d

    var json = { name: "任务名称" , scoreRule: "", score: "", // 如果规则表达式不为空,则默 ...

  5. UNIX基础知识之信号

    本篇博文内容摘自<UNIX环境高级编程>(第二版),仅作个人学习记录所用.关于本书可参考:http://www.apuebook.com/. 信号(signal)是通知进程已发生某种情况的 ...

  6. Build类

    在开发中 我们有时候会需要获取当前手机的系统版本来进行判断,或者需要获取一些当前手机的硬件信息. android.os.Build类中.包括了这样的一些信息.我们可以直接调用 而不需要添加任何的权限和 ...

  7. 防止vuejs在解析时出现闪烁

    ---## 防止vuejs在解析时出现闪烁 ## 原因: 在使用vuejs.angularjs开发时,经常会遇见在如Chrome这类能够快速解析的浏览器上出现表达式({{ express }} ),或 ...

  8. 【转载】Android使用Application总结

    Application 配置全局Context 第一步.写一个全局的单例模式的MyApplication继承自Application 覆盖onCreate ,在这个方法里面实例化Application ...

  9. python(1) -文件操作

    很多时候我们需要对文件进行一些操作,比如读取并分析日志文件,写入日志文件等等.显然python也内置了对文件进行操作的函数. 读文件: >>> f = open('a.log','r ...

  10. The _imageingft C module is not installed

    遇到的问题如图所示,使用的方法: 下载地址:http://effbot.org/downloads 并没有解决,有人用这样的方法成功了,只能说很遗憾,我并没有成功 大神给的解决办法,不要再win平台下 ...