快速业务通道

剖析使用ObjectOutputStream可能引起的内存泄漏 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13

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

时间:2012-01-28 IBM 李锬

使用 ObjectOutputStream 来进行对象序列化

相信大多数程序员在使用 Java 进行日常开发工作中,都曾经遇到需要把数据进行序列化的情况,比如写入文件或者写入 socket 流。Java 的类库也提供了丰富工具类供我们使用,这其中就包括 ObjectOutputStream。此类允许我们将 Java 对象的基本数据类型和图形写入 OutputStream,在需要将 Java 对象进行序列化操作时,使用该类可以极大为我们提供便利。但是使用不当也会引起一些麻烦。

需要说明的是,在使用 ObjectOutputStream 向 OutputStream 流中写入的时候会在流中添加写入 Object 的信息。这样的话在我们使用 ObjectOutputStream 编写跨语言的 Socket 通信时会遇到问题。因为数据流中加入的是 Java 特有的信息,如 Class 类型以及成员变量的类型信息,只有使用 ObjectInputStream 才能解析这些特定的信息。

好了,通过上面的说明,我们现在对 ObjectOutputStream 有了一个大体的了解,接下来我们使用具体的代码来看一下如果使用 ObjectOutputStream 来把对象序列化到对象中。

把 Java 对象序列化到文件中

首先我们有一个简单的 Java 对象类:

清单 1. 要序列化的 java 对象

class MyObject implements Serializable {    private static final long serialVersionUID = -9163423175612080544L;    String str1;    String str2; }

接下来我们使用 ObjectOutputStream 把 MyObject 对象写入文件:

清单 2. 写入文件

FileOutputStream fos = new FileOutputStream("c:\\test.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); MyObject myObj = new MyObject(); myObj.str1 = "test1"; myObj.str2 = "test2"; oos.writeObject(myObj); fos.close();

我们来看一下写入文件的内容:

清单 3. 写入文件内容

#sr #com.travelsky.test.MyObject €喳 +?^`# #L #str1t #Ljava/lang/String;L #str2q ~ #xpt #test1t #test2

我们可以看到写入的内容中包含了写入类的类型以及成员变量信息,当然关于插入的内容,我们可以覆盖 ObjectOutputStream 类的 writeStreamHeader() 方法来实现插入我们自定义的内容。当然如果这样做的话,就必须对 ObjectInputStream 类进行重写。

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

时间:2012-01-28 IBM 李锬

上面是一些题外话,下面回到正题,关于标题中提到的有内存泄漏的问题。为了更清晰直观的说明该问题,我又写了一个很简单的测试,代码如下:

清单 4. 多次写入

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

我们再来看一下写入的内容:

清单 5. 写入 5 次

#sr #com.travelsky.test.MyObject €喳 +?^`# #L #str1t #Ljava/lang/String;L #str2q ~ #xpt #test1t #test2q ~ #q ~ #q ~ #q ~ #q ~ #q ~ #q ~ #q ~ #q ~ #

我们可以看到多次写入同一个类型的对象,那么对象的类型信息是不会重复写入的。那么有人会说了,那是因为你写入的对象每次的内容都是一样的,接下来为了得到更清晰的测试结果,我们来让每次写入的内容不同。

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

FileOutputStream fos = new FileOutputStream(&qu

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号