我们的一个项目出现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)

解决方案 »

  1.   

    出现异常的地方时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;
    }
      

  2.   

    try {
    bo.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    开门记得关门
      

  3.   

    有什么方法确定是因为没关闭流导致的内存溢出吗,我在我机器上实验,发现JavaW这个进程的内存一直没增加啊,只是在一个范围内波动。按理应该是不停的一直再涨吗
      

  4.   

    如果是因为流没关闭的话,是不是在应该在new 一个新流的时候,就应该报内存溢出,而不是到writeObject的时候才报吧
      

  5.   

    ByteArrayOutputStream 可以不用关,关了也白关,它的 close() 是个空方法。估计是反序列化产生问题了,只有这段代码和异常,没有具体的对象数据,无法解答。
      

  6.   

    抛的内存异常后面跟了个serialVersionUID,我又查了下ObjectOutputStream.writeObject方法,说的是写进的Object类都要序列化才行,是不是这方面出的异常。
    我是新手,有哪些地方说错,请见谅!!
      

  7.   

      ByteArrayOutputStream bo = new ByteArrayOutputStream();
               
      ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
      ObjectInputStream oi = new ObjectInputStream(bi);
      newOb = (oi.readObject()); 全部都是空值,不内存溢出才怪
      

  8.   

    相关的class比较多,流程也有点复杂,我也有点不熟悉的,
    反正就是传进来一个Object,这个对象是个映射类,数据库里有对应的表