WEB开发网
开发学院软件开发Java 剖析使用 ObjectOutputStream 可能引起的内存泄漏... 阅读

剖析使用 ObjectOutputStream 可能引起的内存泄漏

 2010-05-10 00:00:00 来源:WEB开发网   
核心提示: 清单 6. 多次写入不同内容FileOutputStreamfos=newFileOutputStream("c:\\test.txt");ObjectOutputStreamoos=newObjectOutputStream(fos);for(inti=0;i<5;i

清单 6. 多次写入不同内容

FileOutputStream fos = new FileOutputStream("c:\\test.txt"); 
ObjectOutputStream oos = new ObjectOutputStream(fos); 
 
for (int i = 0; i < 5; i++) { 
  MyObject myObj = new MyObject(); 
  myObj.str1 = "test1" + i; 
  myObj.str2 = "test2" + i; 
  oos.writeObject(myObj); 
} 
fos.close(); 

我们再来看一下写入的结果:

清单 7. 写入 5 次不同内容的对象

#sr #com.travelsky.test.MyObject €喳 +?^`# #L #str1t #Ljava/lang/String;L #str2q ~ #xpt 
#test10t #test20q ~ #sq ~ t #test11t #test21q ~ #sq ~ t #test12t #test22q ~ #sq ~ t 
#test13t #test23q ~ #sq ~ t #test14t #test24q ~ # 

测试小结

通过上面的测试就很容易的发现,我们虽然写入了 5 次,但是不会每次写入都会插入写入对象和成员变量类型的信息,而是在第一次写入的时候插入一些头信息,以后再写就不会再插入了。这实际是 Java 做的优化,通过该优化从而减少 socket 传输的开销。
我想现在应该有人已经看出问题来了,它之所以可以这么做优化,前提是持有 MyObject 的引用,也就是说,不会释放掉 MyObject 的引用。如果你是长连接的方式(socket 中很常用),ObjectOutputStream 会一直持有你以前发送过的对象的引用,从而导致 JVM 在进行垃圾回收的时候不能回收之前发送的对象的实例,经过漫长时间的运行,最终导致内存溢出。这一点从我通过 Jprobe 跟踪也得到了印证。

上一页  1 2 3 4  下一页

Tags:剖析 使用 ObjectOutputStream

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接