java - JApplet 在 ObjectInputStream.readObject 上遇到 java.lang.OutOfMemoryError 异常(来源未知)

标签 java out-of-memory

我编写了一个连接到服务器的 JApplet。连接时它会收到一个 ImageIcon。收到后,它会向服务器发送一个字符串“I”进行确认。这向服务器发出信号发送下一个 imageIcon。

    while(noExceptions){
   try{
    Object something = in.readObject();
    if(something instanceof ImageIcon){
     camDisplay.setIcon( (ImageIcon)something );
     validate();
     sendMessage("I");
    }else{
     System.out.println("What the hell was that?!");
    }
    Runtime rt = Runtime.getRuntime();
    rt.gc(); 
   }catch(Exception e){
    noExceptions=false;
    ...
   }
     }

当我第一次收到异常时,我添加了对垃圾收集器的调用,但它没有帮助。我放入了一些 println,但它总是在第 128 个图像上崩溃。 Object Something = in.readObject(); 抛出异常

camDisplay 是一个显示在小程序中的 JLabel。

Exception in thread "Thread-12" java.lang.OutOfMemoryError: Java heap space
    at java.lang.reflect.Array.newArray(Native Method)
    at java.lang.reflect.Array.newInstance(Unknown Source)
    at java.io.ObjectInputStream.readArray(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at javax.swing.ImageIcon.readObject(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at RoboClient.run(RoboClient.java:226)
    at java.lang.Thread.run(Unknown Source)

修复:

System.out.println((sendImageCount++)+" send image");
        out.writeUnshared( new ImageIcon(_image) );
        out.flush();
        if(sendImageCount>100){
            out.reset();
            sendImageCount=0;
        }

最佳答案

请参阅 ObjectOutputStream.reset() 和 ObjectOutputStream.writeUnshared()。

关于java - JApplet 在 ObjectInputStream.readObject 上遇到 java.lang.OutOfMemoryError 异常(来源未知),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4702961/

相关文章:

java - 在 Java 中强制释放大型缓存对象

c - 在这个程序中数组是如何存储在内存中的?

Android OutOfMemory 错误和 LruCache

javafx 2.0 向 Label 添加边框

java - 实现 java.lang.reflect.Proxy 的注释背后的基本原理是什么?

java - 如何设置@OneToOne映射的约束名称?

java - 如何在我的应用程序中使用 Scene Builder Dark Theme

android - 如何解决 java.lang.OutOfMemoryError : GC overhead limit exceeded error in android studio

r - 存储和使用对于内存来说太大的数据帧的最佳实践?

java - 如何读取大小 >40MB 的 XLSX 文件