文档章节

故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

爱吃大肉包
 爱吃大肉包
发布于 2017/01/07 17:16
字数 1165
阅读 342
收藏 4

背景起因:

记起以前的另一次也是关于内存的调优分享下

有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡。

我按经验开始调优,在每个关键步骤的加入如下代码耗时统计进行压测:

long startTime = System.currentTimeMillis();
callRpc();   //这里比如调用RPC伪代码,当然还在插入数据库,中间件地方都加入统计
long costTime = (System.currentTimeMillis() - startTime); 
//统计600毫秒以上耗时
if (costTime > 600) { 
logger.warning("callRpc cost time:" + costTime); 
}

然后去grep日志, 最后神奇的发现各个地方都有超过600毫秒的地方...

然后各种定位的误导...

当然最终是解决了,原因是由于程序里使用了大对象导致

细分析,即使这种情况深研究也是分很多情况的

 

问题重现:

原因分析:

由于系统中使用了大对象,当并发来临,内存讲被吃紧,将有可能引起如下三种情况

第一种情况, 系统内存够用(JVM内存未使用到SWAP内存),但JVM内存不够,最终导致JVM的频繁垃圾回收(FGC),严重影响性能 (stop the word)

第二种情况,系统内存不够,把JVM堆部分用到了SWAP,那么此时的垃圾回收需要把SWAP的内存换回到系统物理内存再进行JVM的垃圾回收。最大影响,导致每次GC的时间变得很久

第三种情况,  物理内存不够用, 大量JVM的堆内存被交换到SWAP后,垃圾回收时,把SWAP内存换回物理内存,但SWAP的内存又不会立即回, 此时可以观察到垃圾回收同时swap使用的内存会变大(其它部分内存要交换到SWAP里)

 

准备:

ubuntu 1G  4核

先关闭SWAP虚拟空间 sudo swapoff -a

java version "1.7.0_101"

apache-tomcat-8.5.9

设置好Tomcat的JVM内存:

JAVA_OPTS="-Xmx500m -Xms500m -Xmn200m -Xss228k -XX:+UseConcMarkSweepGC -XX:+UseParNewGC"

apache-jmeter-2.13 用于模拟HTTP请求压测,都是100条线程并发进行压测

 

模拟代码如下

/**
 * 模拟当系统中使用大对象时,对JVM造成的影响
 * 
 * @author 包子(何锦彬). 2017.01.07
 * @QQ 277803242
 */
@WebServlet("/Test")
public class Test extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private Logger logger = Logger.getLogger(Test.class.getName());

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // use java heap 10m
        byte[] bts = new byte[1024 * 1024 * 10];// 代码段1
        long startTime = System.currentTimeMillis();
        // deal
        try {
            // 模拟业务花费时间
            Thread.sleep(500);
        } catch (InterruptedException e) {
        }

        // 理论上这里输出500附近
        long costTime = (System.currentTimeMillis() - startTime);
        if (costTime > 600) {
            logger.warning("cost time:" + costTime);
        }

        Writer out = response.getWriter();
        out.append("ok");
    }

 

 

先模拟正常的情况:

先注释掉"代码段1", 1W个请求下来,基本耗时都在500,一切正常,返回都是在500毫秒附近

垃圾回收情况,只发生了1次YGC,所以系统正常稳定...

 

模拟第一种情况:

放开“代码段1”,让每次请求都去堆内存申请10m的堆空间,同样是1W个请求,返回的平均值已经接近了2S

垃圾回收情况来看, 已经发生了1966次的FGC了, 在上面耗时158秒

 

模拟第二种情况:

把系统的SWAP打开,打开2G的SWAP,swapon -a

调大JVM参数,到1G,让JVM用到部分SWAP的空间

此时再让每次请求都去堆内存申请10m的堆空间,同样是1W个请求,性能已经低于第二种情况

垃圾回收来看,回收次数是1766次,比第二种情况发生的次数还要少,但FGC耗费的时间已经是212秒,

(虽然多了200m内存也没差距这么大,更精确看年轻代一样的内存,耗时也远超过)远超过第二种情况了

此时垃圾回收详情:

模拟第三种情况:

这种情况和我上一篇提到的类似,如果系统内存不够用时,系统将KIIL掉内存

 

总结:

频繁垃圾回收(FGC),会严重影响性能。如果此时用耗时统计去寻找瓶颈,会出现失误

 

如JVM堆用到了SWAP分区,当发生GC:

1,会导致大量SWAP被使用,2,导致每次GC的时间变得很久;

 

SWAP分区开启可以有效防止进程因为内存问题而被系统杀掉;

 

 

持续更新留言问题,解答疑问

欢迎关注我的公众号,专注重现各种线上的BUG

 或搜 “包子的实验室”

© 著作权归作者所有

爱吃大肉包

爱吃大肉包

粉丝 64
博文 40
码字总数 37046
作品 0
广州
程序员
私信 提问
[Java性能剖析]Sun JVM内存管理和垃圾回收

内存管理和垃圾回收是JVM非常关键的点,对Java性能的剖析而言,了解内存管理和垃圾回收的基本策略非常重要。本篇对Sun JVM 6.0的内存管理和垃圾回收做大概的描述。 1.内存管理 在程序运行过程...

会爬墙的猫
2011/07/22
216
0
一些长时间GC停顿问题的排查及解决办法

对于许多企业级应用,尤其是OLTP应用来说,长暂停很可能导致服务超时,而对这些运行在JVM上的应用来说,垃圾回收(GC)可能是长暂停最主要的原因。本文将描述一些可能碰到GC长暂停的不同场景...

一看就喷亏的小猿
04/22
30
0
jvm内存参数设置

1. Heap设定与垃圾回收 Java 内存分为3个区,Young,Old和Permanent。Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。 通常把前两个区域叫做堆区(Heap),Permanent区则负责保...

晨曦之光
2012/04/25
1K
0
JVM内存模型以及垃圾回收

JVM内存模型以及垃圾回收 JAVA堆的描述如下: 内存由 Perm 和 Heap 组成. 其中 Heap = {Old + NEW = { Eden , from, to } } JVM内存模型中分两大块,一块是 NEW Generation, 另一块是Old Gen...

晨曦之光
2012/04/25
587
0
JVM性能优化, Part 5:Java的伸缩性

ImportNew注: JVM性能优化系列文章前4篇由ImportNew翻译(第一篇,第二篇,第三篇, 第四篇)。本文由新浪微博:吴杰 (@WildJay) 投稿至ImportNew。感谢吴杰! 如果你希望分享好的原创文章或...

梁杰_Jack
2014/10/30
224
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 人生,还真是到处是意外

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享lil peep的单曲《High School》 《High School》- lil peep 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
42分钟前
18
2
Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
6
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
10
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部