PPM系统内存溢出问题解决

ppm内存溢出问题解决

一、发现问题

PPM系统手工下发数据到CRM时。下发10万条,每次2000条分页下发。

时间长了会出现内存溢出。在测试库测试发现,linux的内存占用会上升到40%,然后weblogic抛出错误

 

# java.lang.OutOfMemoryError: requested 67 bytes for char in /BUILD_AREA/jdk6_05/hotspot/src/share/vm/runtime/sharedRuntime.cpp. Out of swap space?

另外,在weblogic和tomcat下面测试,weblogic下面会出现这个问题,tomcat没有问题。另外把这句代码注释后,问题就不会出现了。Weblogic和tomcat的不同点在于weblogic用了分布式事务,tomcat是开发环境,没有用分布式事务。

 

二、分析问题

1、JVM参数调优

问题一定是和这个查询语句有关。但是这个SQL查询没有问题,dao也是单例的,对象也是方法内定义的,也不是静态的,应该会被回收:

 

看了weblogic的启动配置,于是通过打印GC来看一下问题,一开始发现打印的GC是这种格式:

352.403: [GC 352.404: [DefNew: 13487K->737K(14208K), 0.0121280 secs] 84892K->72466K(203264K), 0.0122890 secs] [Times: user=0.01 sys=0.01, real=0.01 secs] 

DefNew代表的意义是串行回收器,而这个应用是大吞吐量的应用,应该是并行回收才对。所以就改成了并行回收。

关于GC日志:http://blog.csdn.net/huangzhaoyang2009/article/details/11860757

关于Jvm内存调优jstat的使用:

http://www.cnblogs.com/jackyrong/archive/2010/01/21/1653163.html

新生代与老生代:http://blog.csdn.net/ustcxjt/article/details/7287430

详细的JVM内存模型、GC收集器:

http://blog.csdn.net/lufeng20/article/details/7402386

 

发现现网的配置是并发收集器,于是测试库也改成并发收集器,并把-xmx调用90,希望让内存早一点爆掉:

-XX:+UseConcMarkSweepGC:设置并发收集器

好处是加快了GC的频率。每秒都有年青代的GC,年老代要到90%左右才会GC。

[GC [ParNew: 14722K->1080K(14784K), 0.0080690 secs] 84352K->70971K(90560K), 0.0082290 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 

[GC [1 CMS-initial-mark: 69891K(75776K)] 71242K(90560K), 0.0080590 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 

[CMS-concurrent-mark: 0.262/0.262 secs] [Times: user=0.74 sys=0.02, real=0.26 secs] 

[CMS-concurrent-preclean: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

[GC [ParNew: 14264K->1167K(14784K), 0.0081860 secs] 84155K->71393K(90560K), 0.0083090 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] 

[CMS-concurrent-abortable-preclean: 0.014/0.719 secs] [Times: user=0.67 sys=0.04, real=0.72 secs] 

[GC[YG occupancy: 11369 K (14784 K)][Rescan (parallel) , 0.0128120 secs][weak refs processing, 0.0001920 secs] [1 CMS-remark: 70225K(75776K)] 81594K(90560K), 0.0132190 secs] [Times: user=0.04 sys=0.01, real=0.02 secs] 

[GC [ParNew: 14351K->1250K(14784K), 0.0069010 secs] 65693K->52592K(90560K), 0.0070140 secs] [Times: user=0.03 sys=0.01, real=0.01 secs] 

[CMS-concurrent-sweep: 0.286/0.294 secs] [Times: user=0.55 sys=0.02, real=0.29 secs] 

[CMS-concurrent-reset: 0.003/0.003 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 

[GC [ParNew: 14434K->1600K(14784K), 0.0209170 secs] 39510K->26930K(90560K), 0.0210620 secs] [Times: user=0.03 sys=0.01, real=0.02 secs] 


但是出问题时,年老代内存不到80%  说明不是年老代溢出了。

   

[GC [ParNew: 14740K->1513K(14784K), 0.0072830 secs] 66353K->53378K(90560K), 0.0073820 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 

#

# An unexpected error has been detected by Java Runtime Environment:

#

# java.lang.OutOfMemoryError: requested 52 bytes for unsigned char in /BUILD_AREA/jdk6_05/hotspot/src/share/vm/code/codeBlob.cpp. Out of swap space?

#

#  Internal Error (allocation.inline.hpp:42), pid=26053, tid=3758812048

#  Error: unsigned char in /BUILD_AREA/jdk6_05/hotspot/src/share/vm/code/codeBlob.cpp

#

# Java VM: Java HotSpot(TM) Client VM (10.0-b19 mixed mode linux-x86)

# An error report file with more information is saved as:

# /home/itop/domains/dist_domain/hs_err_pid26053.log

pure virtual method called

.


2、堆栈分析

通过jmap命令把堆文布打出来,同时用eclipse的manager analyzer 工具进行分析,发现打印出来的堆只有14M,而且也没有发现问题。

 

3、关于native heap

重新把问题定位到报错的这句话:

java.lang.OutOfMemoryErro:Out of swap space?

 

是swap区内存不够用了,所以了jvm的堆没关系的。这时才想到之前说的内存都到了40%了,总内存8G,那说明是linux本身的内存爆了?

关于OutOfMemoryError:http://blog.csdn.net/sfdev/article/details/2051171

5、focus on java heap with linux


再次search了linux环境下面java heap的相关工作原理及组成信息,有发现了!
  其实java heap由2部分组成:其一为我们熟悉的JVM heap,其二为和OS相关的Native heap;
  JVM heap完全由GC掌控,我们可以通过参数-Xms、-Xmx指定其大小,并且可以用工具对其进行监控;他管理的东西就是我们所有的Java Object;
  而Native heap是平台相关的,我们既不能设置其使用大小也不能干预他的使用状态;他管理的东西一般都是很底层的,比如JIT使用的buffer、GC的底层data structures、JNI调用的所有相关对象、SWING/AWT调用需要的buffer和data structures……

 

于是开始用top命令监控内存变化,发现可用内存不停的减少。这里top命令说明一下:

Linux对内存是预占式的,可用内存=Free+buff+cached

所有used的内存可能是放在cached里预占着,等待分配,还没有在用。

另外,swap相当于window的虚拟内存。内存不足时,会使用虚拟内存,虚拟内存都不足了,就会出现:

Out of swap space?

 

第一次:内存还有1.5G

 

第二次:内存还有0.8G

第三次:内存还有400M

 

这里发现一个问题,JVM内存最大只有90M,但是通过查看linux命令发现JVM占用了8G的48.8%这么多内存。不会它真有用到native heap爆了?

发现网上有人同样遇到过这类情况:

  内存怪兽:http://ayufox.iteye.com/blog/723896

网上也有人说jdbc驱动也是用到native heap

 

4、分布式事务

     因为前面说到weblogic环境和tomcat环境的不同时有没有配分布式事务。所以就把weblogic下的分布式事务屏蔽。

屏蔽后还是有问题,然后,把屏蔽后的代码放到tomcat又没有问题。

问题应该是weblogic环境,最后发现weblogic 配的数据源是

oracle.jdbc.xa.client.OracleXADataSource

而tomcat是

oracle.jdbc.OracleDriver

   weblogic也改为oracle.jdbc.OracleDriver后正常。

   看来真的是分布式事务的问题,用到的数据库驱动导致的。xa这个驱动为什么会导致这个问题还不知道。可能是没用好,或者分布式事务不适合这种影响。

   是否是把数据都存到native heap中,为了后面分布式提交时可以比对?所以每每下发10万条数据,当下发5万条时就爆了。而爆了的内存与GC清理的内存差不太多。而分布式的提交是要等10万条全部执行完成。

 

三、处理问题

   oracle的分布式数据库驱动的问题,暂时没有去分析。因为PPM的下发是可以把下发任务拆分成多个任务。例如下发到CRM和计费的任务,拆成分别下发到CRM、下发到计费。

所以可以修改驱动,不会对业务有影响。

另外建议这种大数据量的分布式事务的控制可以通过记录每个子事务状态来控制。 如果子事务失败,通过重做的方式。

另外,如果是因为10万条语句是一个事务导致数据爆了,可以试着把事务放到2000条查询这个粒度。

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11627468/viewspace-1672087/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/11627468/viewspace-1672087/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于ppm(脉冲位置调制)的可见光通信系统仿真设计是一种通过模拟器来模拟可见光通信系统的工作原理和性能的方法。 在这个仿真设计中,我们首先需要建立一个基于ppm的可见光通信系统的模型。这个模型可以包括发送端和接收端两个主要部分。 发送端部分主要是将要传输的数据进行调制并转化为可见光波的信号。在ppm调制中,发送端将数据转化为脉冲位置的信息,并将这些信息转化为相应的光脉冲。这些光脉冲将通过可见光传输媒介传输给接收端。 接收端部分主要是通过光接收器接收光信号,并将接收到的光信号转化为与发送端一致的脉冲位置信息。然后,接收端会将脉冲位置信息转化为原始的数字数据。 在仿真设计中,我们需要考虑各种干扰因素对系统性能的影响。例如,氛围散射、光源强度变化、传输媒介噪声等都会对可见光通信系统的性能产生影响。因此,我们需要根据实际情况进行合适的建模和仿真。 通过调整各种参数,比如脉冲位置调制的顺序、脉冲位置的间隔、光源的强度等,我们可以通过仿真设计来评估不同情况下系统的性能。根据性能评估结果,我们可以优化系统设计,提高通信质量和可靠性。 总的来说,基于ppm的可见光通信系统仿真设计是一种有效的方法,可以帮助我们理解可见光通信系统的工作原理以及优化系统性能。通过合适的模型建立和参数调整,我们可以得到满足实际需求的可见光通信系统设计方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值