天天看点

java堆溢出 java.lang.outofMemoryError:java heap space

背景:

   通过报文,向核心系统获取D-1日交易明细,存放数据库。每日交易量目前1w.每个月交易量有10%到20%的增长。

获取核心交易明细,用于对账

   建立socket短连接,10000条交易明细,需建立100次短连接。每次短连接,传输的报文大概50000个字节

风险:

 1.因为需要建立多次短连接,某一次连接的失败,之前获取的数据全部丢弃。

 2.同时多次建立连接,关闭连接,耗费性能 

 3.因为对接系统报文的限制,每次获取的报文大小,只能是50kb。每连接一次,需要在方法区创建一个50kb的字符串。并且,我解析入库之后,就没用了。朝生夕死的大对象。(不知道50kb算不算大对象,但确实耗费空间,且无用),未来日交易量增加到10w,100w更是如此

遇到的事故:在测试环境里。因为连续测试,导致堆内存溢出

java堆溢出 java.lang.outofMemoryError:java heap space

后面查看jvm内存情况

java堆溢出 java.lang.outofMemoryError:java heap space

系统jvm内存2个G。老年代和永久代。快占满了。

java堆溢出 java.lang.outofMemoryError:java heap space

主要是,字符串,以及我解析字符串创建的对象实例,居高不下。

java堆溢出 java.lang.outofMemoryError:java heap space

问题:

1.仔细看了代码,没有发现内存泄露的情况。但是,不能理解,目前老年代和永久代,占用内存居高不下。但是后面发现,在出堆内存溢出后。并没有回收内存,无论是年轻代,还是永久代,都没有回收

2.从图中可以看到永久代分配(committed)的内存已经满了。为什么没有分配新的内存。