大家帮我分析下内存溢出的原因

bbamm112 2010-08-23 02:59:50
我们的一个项目出现OutOfMemoryError异常,异常如下:
java.lang.OutOfMemoryError: serialVersionUID

at java.lang.Class.getDeclaredFieldImpl(Native Method)

at java.lang.Class.getDeclaredField(Class.java:501)

at java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1672)

at java.io.ObjectStreamClass.access$700(ObjectStreamClass.java:109)

at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:498)

at java.security.AccessController.doPrivileged(AccessController.java:192)

at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:490)

at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:386)

at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:486)

at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:386)

at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1080)

at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:341)

at com.topsoft.domain.icis.tel2.TelUtil.deepClone(TelUtil.java:79)

at com.topsoft.domain.icis.tel2.cfg.CfgManager.getConfigureItemValueById(CfgManager.java:120)

at com.topsoft.service.icis.tel2.TelServiceImpl.getUpOrgCacheFreq(TelServiceImpl.java:507)

at com.topsoft.service.icis.tel2.TelServiceImpl.isUpOrgCache(TelServiceImpl.java:492)

at com.topsoft.service.icis.tel2.TelServiceImpl.getOrgMapCache(TelServiceImpl.java:457)

at com.topsoft.service.icis.tel2.TelServiceImpl.getOrgDTOById(TelServiceImpl.java:1029)

at com.topsoft.service.icis.tel2.TelServiceImpl.getCommHql(TelServiceImpl.java:1261)

at com.topsoft.service.icis.tel2.TelServiceImpl.findRegisterInfoInComplex(TelServiceImpl.java:1222)

at sun.reflect.GeneratedMethodAccessor840.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:618)

at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:291)

at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:180)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:147)

at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:169)

at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:169)

at $Proxy148.findRegisterInfoInComplex(Unknown Source)

at com.topsoft.web.icis.tel2.action.dispatch.SearchForRepairRegisterListUIAction.start(SearchForRepairRegisterListUIAction.java:88)

at com.topsoft.web.common.RegAction.execute(RegAction.java:34)

at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)

...全文
237 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
madFatso 2010-08-23
  • 打赏
  • 举报
回复
你可以把你打开的流在用完后关闭掉
在测试你的程序
bbamm112 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bao110908 的回复:]
ByteArrayOutputStream 可以不用关,关了也白关,它的 close() 是个空方法。

估计是反序列化产生问题了,只有这段代码和异常,没有具体的对象数据,无法解答。
[/Quote]
相关的class比较多,流程也有点复杂,我也有点不熟悉的,
反正就是传进来一个Object,这个对象是个映射类,数据库里有对应的表
bbamm112 2010-08-23
  • 打赏
  • 举报
回复
启动之后能正常运行,就是运行一段时间后,程序死了,日志里报的内存异常
singlesteven 2010-08-23
  • 打赏
  • 举报
回复
ByteArrayOutputStream bo = new ByteArrayOutputStream();

ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
newOb = (oi.readObject());

全部都是空值,不内存溢出才怪
bbamm112 2010-08-23
  • 打赏
  • 举报
回复
不是一直在报异常,就是运行一段时间后,报的内存溢出
toss2000 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bbamm112 的回复:]
抛的内存异常后面跟了个serialVersionUID,我又查了下ObjectOutputStream.writeObject方法,说的是写进的Object类都要序列化才行,是不是这方面出的异常。
我是新手,有哪些地方说错,请见谅!!
[/Quote]
你可以试试,另外就是设置一下断点,然后跟一下就能知道哪里报错了
bbamm112 2010-08-23
  • 打赏
  • 举报
回复
抛的内存异常后面跟了个serialVersionUID,我又查了下ObjectOutputStream.writeObject方法,说的是写进的Object类都要序列化才行,是不是这方面出的异常。
我是新手,有哪些地方说错,请见谅!!
  • 打赏
  • 举报
回复
ByteArrayOutputStream 可以不用关,关了也白关,它的 close() 是个空方法。

估计是反序列化产生问题了,只有这段代码和异常,没有具体的对象数据,无法解答。
bbamm112 2010-08-23
  • 打赏
  • 举报
回复
如果是因为流没关闭的话,是不是在应该在new 一个新流的时候,就应该报内存溢出,而不是到writeObject的时候才报吧
bbamm112 2010-08-23
  • 打赏
  • 举报
回复
有什么方法确定是因为没关闭流导致的内存溢出吗,我在我机器上实验,发现JavaW这个进程的内存一直没增加啊,只是在一个范围内波动。按理应该是不停的一直再涨吗
madFatso 2010-08-23
  • 打赏
  • 举报
回复
try {
bo.close();
} catch (IOException e) {
e.printStackTrace();
}

开门记得关门
bbamm112 2010-08-23
  • 打赏
  • 举报
回复
出现异常的地方时deepClone里的oo.writeObject(ob)这个地方出现的
具体deepClone

public static Object deepClone(Object ob) {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
Object newOb = null;
try {
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(ob);
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
newOb = (oi.readObject());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return newOb;
}

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧