写在前面

java内存申请和释放均是由jvm在控制。而释放往往会出现各种各样的问题,经常一个引用没处理好就引起内存泄漏,最后引发OOM。如果发生在重要业务系统还可能出现严重的生产事故。 因此内存使用一定要谨慎,特别是引用要及时断链。虽然jvm有GC(垃圾回收引擎),但只能清理没有引用的对象,因此对象在不使用时及时置null。当然,笔者对此是很小心的,但万万没想到还是遇到了fullGC(old GC)。

定义

jvm的GC

通常遇到的是堆区内存问题,也就是堆GC。jvm的GC发展到现在也经历很多发展了,现在主要还是分代回收的思路。

eden space

伊甸园,新生对象放置的地方。

survivor space

在jvm中的被回收过对象仍存活的地方。

old Generation

幸存区被清理后仍活着的对象就步入老年了。 大多数GC问题都在老年代中被发现,笔者遇到的问题也是在这里。

eden 和survivor都属于新生代,与old gen有明显差别,也就是这样决定了java程序不用主动回收也能在较好的状态运行。 eden和survivor空间相对old generation小很多,这也意味着存放的内存也少很多。jvm一般将长期引用(jvm会将对象分析其引用计数)的对象(多次GC仍存活的)放在Old generation中。

jvm堆区不同区域使用的是不同算法,eden和survivor的GC属于miniGC,也就是局部GC,特点是速度快,低延迟(1.标记复制算法与空间小的优势,2.GC时需要将所有线程挂起Stop The World)。而old generation发生GC则为FullGC,且old generation用的是标记整理算法,线程扶起时间会很长。频繁的fullGC可能是程序设计不合理或内存参数不合理。

言归正传

这两天笔者遇到一个问题导致了fullGC发生。将进程进行dump分析 jmap命令配合工具 MAT(eclipse提供)发现是部分局部变量占用太多空间未及时释放造成并且占用了55%以上的内存空间。 为什么局部变量还会未及时释放?查阅源代码发现所有引用处均未发现被全局对象、静态对象引用。ArrayList和LinkedList占用内存过高,但也未被全局对象和静态对象引用。

感觉程序被幽灵附身了!!! 不存在的,直觉告诉我这种问题肯定在自己的程序上。继续分析果然发现了问题所在:发现对象内的值关联性非常强,继续分析最终找到数据库查询参数。会不会是数据造成?面对这个疑问diff了最近数据的情况。

芦山真面目

最近数据量暴增! 数量增加了6倍+,空间增加了3倍+。

由于数据结构和业务逻辑的特殊性将同条件的数据全部查出来处理了,由于数据全是相互存在引用,eden空间无法分配进行了miniGC。miniGC后空间仍然不足,就这样新生对象直接进入old generation。才生出来就进入老年 >_

解决方案

知道了原因就立即分析得到了解决方案。尽量不要构建局部的大对象!!!因此将DB中查询出的量控制住,增加中间对象的数量,用完即置null。使得eden中及时GC,old generation增长稳定。 修改程序代码再将压一下,发现old generation增长缓下来了,问题解决。

如果遇到类似问题还可以用jconsole和jvisual两款工具实时监控jvm状态、对象实例指标等。

不好的消息:jdk9已将jvisual去除,要使用jvisual请使用jdk8。jdk10中jconsole也没了。。 jmap分析吧。。。

Java内存配太大导致fullgc_记一次因为短命大对象导致fullGC的问题相关推荐

  1. java并行流 阻塞主线程_记一次使用Java8并行流导致的服务瓶颈问题排查

    一.业务背景# 二.服务架构# 服务使用线程池对请求进行业务处理,corePoolSize=32,maximumPoolSize=128. 三.问题描述# 服务部署到测试环境,将线上流量通过tcp-c ...

  2. java内存泄漏总结

    内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收 ...

  3. 什么是内存泄露?该怎么排查?Java内存泄漏策略

    什么是内存泄漏 内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着. 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的, ...

  4. Java内存泄漏分析和解决

    1. 什么是内存泄漏? 内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着. 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是 ...

  5. java 内存分配参数_浅谈JAVA内存分配与参数传递

    java中方法的参数传递方式只有一种:值传递. java内存分配: 1.栈:存放 基本类型的数据.对象的引用(类似于c语言中的指针) 2.堆:存放用new产生的数据 3.静态域:存放在对象中用stat ...

  6. linux内存不足宕机,记一次linux机器内存占用太多导致的服务宕机

    背景 最近我们测试环境部署的一个项目总是不停的宕机,之前也有过,但是最近特别频繁 猜测 可能是因为cup或者内存占用太大导致的服务宕机 执行 1.登录linux服务器 2.top命令 下面是对每一行信 ...

  7. java线程的优先级是数字越大优先级越高_《深入理解Java虚拟机》5分钟速成:12章(Java内存模型与线程)...

    第12章 Java内存模型与线程 前言: 1.物理机如何处理并发问题? 2.什么是Java内存模型? 3.原子性.可见性.有序性的具体含义和应用实现? 4.volatile 关键字特性? 5.基于vo ...

  8. 内存很空却频繁gc_记一次不太成功的频繁 full gc 排查过程

    上周自己负责的一个应用出现频繁full gc的问题,不得不尝试优化一下.第一次做这种事只能先看看网上的文章,然后亲自尝试怎么去完成减少full gc的频率,降低young gc的频率这一目标.虽然最终 ...

  9. 运维:你们 JAVA 服务内存占用太高,还只增不减!告警了,快来接锅

    先点赞再看,养成好习惯 某天,运维老哥突然找我:"你们的某 JAVA 服务内存占用太高,告警了!GC 后也没释放,内存只增不减,是不是内存泄漏了!" 然后我赶紧看了下监控,一切正常 ...

最新文章

  1. 详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解 大牛讲解的
  2. ECSHOP 助手使用
  3. laravel批量插入报错:1292: Incorrect datetime value: '0000-00-00 00:00:00' for column 'TERM_DATE'
  4. 学习,是前进的必由之路
  5. 把 分数化为循环小数 和 把循环小数化为分数 的方法
  6. Linux shell去除字符串中所有空格
  7. tensorflow中的正则化函数在_tensorflow中的正则化及数据增强
  8. image1载入大图片时如果stretch=true,image1会显示出大图片的缩图,那么如何将这个缩图镜像复制一份赋值给另一个image2的picture呢?...
  9. 用remastersys备份LINUX,注意备份盘的空间占用
  10. 正则表达式基础---转自 Python正则表达式指南 前边
  11. Delphi XE10百集视频教程计划
  12. 电脑主板报警声音的故障现象对照表
  13. 矩阵的谱分解 (详细推导步骤~~~特征值分解特征向量
  14. 世界最早投入运行的计算机网络是,世界上最早投入运行的计算机网络是。
  15. 5大国外广告联盟赚美金项目,诱人的美金在向你招手!
  16. CorelDRAW 2023版本更新内容及安装详细教程
  17. 机器学习算法优缺点_用于机器学习的优化算法的优缺点
  18. 字符串转json对象
  19. 十字路口倒计时交通灯
  20. Learning Cocos2d-x for XNA(6)——场景切换和场景过渡效果

热门文章

  1. ​三位中国科学家与诺贝尔物理奖的擦肩而过
  2. 中科院教授:科技界已几乎沦为名利场...
  3. 克莱因瓶为何永远无法装满?科学家发现:宇宙或许就是克莱因瓶!
  4. 完美数:数学宝库中的一颗璀璨明珠
  5. 教授呼吁:应当让博士生先回学校
  6. 重磅!杰青、优青填报界面取消“论文收录与被引统计”
  7. 这7所高校明明是985,却一个A+学科都没有!
  8. 阿里云马涛:因云进化的基础软件
  9. Dataphin功能:集成——如何将业务系统的数据抽取汇聚到数据中台
  10. 人工智能与大数据的完美结合 1