场景,线上堆栈10G,平时内存使用达到8个G而且慢慢增长,经常出现full gc,经过堆栈信息排查出来是由于ObjectOutputStream造成得内存泄漏。项目中使用ObjectOutputStream进行写文件,使用writeObject()方法,然而,该对象写得object可能存在内存泄漏,是由于ObjectOutputStream写对象时,依然存在这对该对象得引用,这是java得自身优化,可以减少socket得网络开销,譬如如下代码,然后看截图,我们虽然写了10次,但是并不是每次都会记录对象和成员变量得信息,而是第一次记录,之后不再记录,这时java得优化,减少socket网络开销,然而可以这么做时因为该outputstream持有myobject得引用,当数据量很大得时候必然会产生内存泄漏。
解决方法是,使用reset方法,重置状态,第二张图片就是重置后得信息,很明显,使用reset后,会增加网络网络开销,所以对于是否使用reset方法,请根据实际业务决定,当长期不停服务,最好使用reset,而对于短期内停止服务,数据量很大得,可以不是用reset。
当数量为1000000时,内存使用两下图。
内容参考如下引用:
http://www.ibm.com/developerworks/cn/java/j-lo-streamleak/
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("test.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
//try {
//Thread.sleep(20000);
//} catch (InterruptedException e2) {
//// TODO Auto-generated catch block
//e2.printStackTrace();
//}
System.out.println(new Date());
//for (int i = 0; i < 1000000; i++) {
for (int i = 0; i < 10; i++) {
MyObject myObj = new MyObject();
myObj.str1 = "test1";
myObj.str2 = "test2";
oos.writeObject(myObj);
// oos.reset();
}
try {
Thread.sleep(20000);
System.out.println(new Date());
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
fos.close();
try {
Thread.sleep(20000);
System.out.println(new Date());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
没使用reset
使用reset
未使用reset 次数100w
使用reset,次数100w
相关推荐
socket objectoutputstream 传对象 例子 网上找的很好用,在网上留一份
python-javaobj 是一个 python 库,它提供了读取和写入(写入当前是 WIP)Java 对象的函数,序列化或将被ObjectOutputStream反序列化。 这种对象表示形式是 Java 世界中的标准数据交换格式。 javaobj 模块公开了...
java-反序列化恢复 该项目旨在恢复使用java.io.ObjectOutputStream创建的文件
ObjectInputStream 和 ObjectOutputStream 的作用是,对基本数据和对象进行序列化操作支持。本文给大家详细介绍了ObjectInputStream 和 ObjectOutputStream的相关知识,感兴趣的朋友一起学习吧
JavaIO对象流 FileInputStream 与 ObjectInputStream 和 ObjectOutputStream 的组合 奥利弗·缪尔
主要介绍了java序列化与ObjectOutputStream和ObjectInputStream的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
在该方法中,首先通过FileInputStream和ObjectInputStream读取源文件对象,然后通过ObjectOutputStream将读取的对象写入备份文件中。这个简单的示例代码展示了如何使用Java序列化来实现一个文件备份工具的简单功能,...
saveContactsToFile()方法使用FileOutputStream和ObjectOutputStream对象将通讯录数据写入文件中。如果写入失败,会抛出IOException异常。 addContact()方法用于添加新的联系人信息到通讯录中,并自动将更新后的...
实现类的对象的序列化可以使用ObjectOutputStream,实现步骤如下: 创建ObjectOutputStream对象; 调用ObjectOutputStream的writeObject方法输出对象。 Java高级程序设计实战教程第五章-Java序列化机制全文共15页,...
使用ObjectOutputStream完成序列化操作: Constructor: ObjectOutputStream(OutputStream out) Method: void writeObject(Object obj) /** * 使用序列化实现数据的保存 * * @param sm StudentManage
使用流套接字建立客户机 运用ObjectOutputStream,ObjectInputStream,ServerSocket,Socket;
程序使用了ObjectInPutStream和ObjectOutPutStream这两个文件输入输出流,利用这两个文件输入输出流,可以方便的直接将通讯记录对象直接写入文件中,另外为了方便添加和删除一条记录还使用了系统的对象数组类...
◦public abstract void writeObject(ObjectOutputStream out); ◦public abstract void readObject(ObjectInputStream in); 要熟悉对文件,特别是文本文件的操作 如果读取文本文件,推荐使用BufferedReader ...
import java.io.ObjectOutputStream; public class TestObjectOutputStream { public static void main(String[] args) { try { //1.创建ObjectOutputStream类型的对象与c:/a.txt文件关联 ObjectOutputStream...
序列化: 就是使用流的技术将对象中的数据保存到文件中。 反序列化: 就是使用流的技术将文件中的数据读取到对象中。 使用到的流技术 序列化:ObjectOutputStream 反序列化:ObjectInputStream ObjectOutputStream...
ObjectOutputStream objectOutputStream = new ObjectOutputStream( out); objectOutputStream.writeObject(bean); objectOutputStream.flush(); } catch (Exception ew) { ew....
掌握串行化概念,学会使用FileInputStream,FileOutputStream,ObjectInputStream,ObjectOutputStream等类输入输出对象。 明白通过捕获异常判定输入文件流的结束。 [*]知道使用RandomAccessFile...
介绍了,下面这些类的具体使用方法,非常详细,值得一看 File FileFilter RandomAccessFile 【字节流】 InputStream OutputStream FileInputStream FileOutputStream DataInputStream DataOutputStream ...
ObjectOutputStream objout = new ObjectOutputStream(out); // 向服务器发送信息 objout.writeObject(user); socket.shutdownOutput(); System.out.println("正在向服务器端发送信息。。。"); ...
从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。 12、...