0 0

关于大对象的深拷贝,性能如何解决10

有个领域对象非常复杂与庞大

目前是使用序列化进行拷贝,然后处理。不过最近由于访问量等因素造成了宕机  ,几乎都是这个地方挂了,内存溢出


想问一下还有什么简单实用的拷贝办法? 或者不一定拷贝,奇思妙想也额可以。改对象内容是不太可能。
问题补充:
一个对象的copy会导致内存溢出?我觉得很大程度上可能是你写得有问题。建议再好好检查一下。
-----------------------------------
问题不是一个人在使用系统,一并发起来谁知道几个。。。

ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(srcObj);
ByteArrayInputStream byteIn =
new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
return in.readObject();

还能如何写。。。测试了一下写入,与读出时间比 1:2。缓存一下字节流不知道有没有搞头,哈哈

那就只有进行手动clone了,以前碰到过这问题
-----------------------------------------
手动clone也是痛苦,对象套对象,N层。。。手术量特别大。


无头绪中




问题补充:
其次,我算你的并发有50w,50w的copy,每个对象我算占用内存0.5KB, 也不过256MB,莫非连256M都会导致内存溢出?

更何况,我说的量应该都是大的,50w并发一般是不可能的,一个对象0.5KB也是相当大了。

所以,我说,还是程序的问题。先把对象流手动关闭,试试看再说。
-----------------------------------------

那个流是该关一下,问题是试不了,怕是关键问题不在此。。。。一个对象0。5K? 你太小看了,我想你不是电信行业的,可能不太了解,刚才通过任务管理器批量建立对象,粗略算了一下是这个对象70M左右。jvm来不及GC,最终造成这个问题。

机器倒是性能不错了,集群,每台16G内存,16个CPU。


目前考虑一个方案是把大对象分拆小对象进行序列化拷贝,最后组装,用CPU来换内存。小对象JVM比较容易GC
2009年7月23日 10:40

7个答案 按时间排序 按投票排序

0 0

引用
那个流是该关一下,问题是试不了,怕是关键问题不在此。。。。一个对象0。5K? 你太小看了,我想你不是电信行业的,可能不太了解,刚才通过任务管理器批量建立对象,粗略算了一下是这个对象70M左右。jvm来不及GC,最终造成这个问题。

机器倒是性能不错了,集群,每台16G内存,16个CPU。


目前考虑一个方案是把大对象分拆小对象进行序列化拷贝,最后组装,用CPU来换内存。小对象JVM比较容易GC


如果说,你的一个对象有70M,那么就算不做对象copy,系统也抗不住什么并发。所以,你一开始把问题定位在对象的copy导致系统内存溢出。这本来就是一个错误。

好好重构,看看有没有什么可以延迟加载的方式,一开始把不需要的数据不放到内存中。真正用的时候在想法子放到内存。

2009年7月23日 19:09
0 0

用 hessian 序列化机制试试

2009年7月23日 15:51
0 0

ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(srcObj);
ByteArrayInputStream byteIn =
new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
return in.readObject(); 

首先,你的代码很有问题。对象流的关闭在哪做的?没有关闭流,自然有内存泄露的事情发生。

引用
问题不是一个人在使用系统,一并发起来谁知道几个。。。

其次,我算你的并发有50w,50w的copy,每个对象我算占用内存0.5KB, 也不过256MB,莫非连256M都会导致内存溢出?

更何况,我说的量应该都是大的,50w并发一般是不可能的,一个对象0.5KB也是相当大了。

所以,我说,还是程序的问题。先把对象流手动关闭,试试看再说。

2009年7月23日 14:57
0 0

那就只有进行手动clone了,以前碰到过这问题

2009年7月23日 12:51
0 0

一个对象的copy会导致内存溢出?我觉得很大程度上可能是你写得有问题。建议再好好检查一下。

2009年7月23日 11:20
0 0

将大文件分割,
用多程线操作.

2009年7月23日 10:47
0 0

序列化和反序列化很耗cpu,特别是大对象。
我们项目中,就有大对象序列化到内存里面,然后再从内存中反序列化出来。
反序列化出来以后,又对对象进行了多层的引用,现在弄得很耗cpu,内存暂时没发现泄漏。
故障还在排除中,

2009年7月23日 10:40

相关推荐

    JS面试题中深拷贝的实现讲解

    Q:那如何深拷贝一个对象呢? R:机智的你 JSON.parse(JSON.stringify(obj)); Q:使用stringify这种方式有何弊端? 性能问题,stringify再解析其实需要耗费较多时间,特别是数据量大的时候。 一些类型无法拷贝,...

    python模块

    * copy: copy模块提供了对复合(compound)对象(list,tuple,dict,custom class)进行浅拷贝和深拷贝的功能。 * pickle: pickle模块被用来序列化python的对象到bytes流,从而适合存储到文件,网络传输,或...

    二十三种设计模式【PDF版】

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 B. 结构模式 设计模式之 Adapter(适配器) 使用类再生的两个方式:组合(new)和继承(extends),这个已经在 thinking in java中提到过. 设计模式...

    设计模式中的原型模式在Python程序中的应用示例

    原型模式本质就是克隆对象,所以在对象初始化操作比较复杂的情况下,很实用,能大大降低耗时,提高性能,因为“不用重新初始化对象,而是动态地获得对象运行时的状态”。 应用特性: 需要大量的基于某个基础原型进行...

    C#微软培训资料

    14.4 继承中关于属性的一些问题.169 14.5 小 结 .172 第四部分 深入了解 C#.174 第十五章 接 口 .174 15.1 组件编程技术 .174 15.2 接 口 定 义 .177 15.3 接口的成员 .178 15.4 接口的实现 .182 ...

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

    深入解析Windows操作系统中文.part2.rar

    解决常见的引导问题 281 5.3 停机 286 5.4 本章总结 288 第6章 进程、线程和作业 289 6.1 进程的内部机理 289 数据结构 289 内核变量 297 性能计数器 297 有关的函数 298 6.2 CreateProcess的流程 300 阶段1:打开...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    实现一个拷贝文件的类使用字节流还是字符串.mp4 │ Java面试题13.线程的实现方式 怎么启动线程怎么区分线程.mp4 │ Java面试题14.线程并发库和线程池的作用?.mp4 │ Java面试题15.设计模式和常用的设计模式.mp4 │ ...

    值类型和引用类型的区别

    将一个值类型变量 装箱成一个引用类型变量,首先会在托管堆上为新的引用类型变量分配内存空间,然后将值类型变量拷贝到托管堆上新分配的对象内存中,最后返回新分配的对象内 存地址。装箱操作是可逆的,所以还有拆箱...

    本科毕业设计开题报告(学生电子作业提交与分析系统的设计与实现V2)

    选题的创新点:该选题采用的均是计算机成熟的技术,在计算机技术方面并没有体现创新点,但是通过完成该毕业设计,可以使得自己对计算机软件开发由更深的认识,积极培养自己的创新意识。 八、已查阅的相关文献

    .net技术资料大全(语言规范 源码教程 学习笔记 技术资料 .net代码生成器)

    处理“进程性能计数器被禁用”的错误.txt 串口操作.txt 打开word文件.txt 打造“浏览器”.txt 带图标和自定义颜色的ListBox.txt 得到当前数据库中所有用户表信息.txt 读取、设置系统时间日期.txt 读写注册表...

    ASP升级.net资料大全(c#入门 语言规范 源码教程 学习笔记 技术资料 面试题 asp与.net代码生成器)

    处理“进程性能计数器被禁用”的错误.txt 串口操作.txt 打开word文件.txt 打造“浏览器”.txt 带图标和自定义颜色的ListBox.txt 得到当前数据库中所有用户表信息.txt 读取、设置系统时间日期.txt 读写注册表...

    c/c++ 学习总结 初学者必备

    答: 编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。 14、 static有...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),Oracle技术能够帮助提高就业的深度。 其三、职业方向多:Oracle数据库管理方向、Oracle开发及系统架构方向、Oracle数据建模数据仓库等...

    flex3的cookbook书籍完整版dpf(包含目录)

    创建ArrayCollection的深度拷贝 13.12节. 用唯一的IDs标识数据对象 第十四章. 数据绑定(466) 14.1节. 绑定一个属性 14.2节. 绑定到一个函数 14.3节. 创建一个双向绑定 14.4节. 使用ActionScript来进行数据绑定 ...

    最新AngularJS开发宝典视频教程 后盾网AngularJS培训视频教程 后盾网.txt

    ├最新AngularJS开发宝典—第012讲 函数使用方法大小写转换与对象深拷贝.mp4 ├最新AngularJS开发宝典—第013讲 函数使用对象扩充与数据遍历.mp4 ├最新AngularJS开发宝典—第014讲 json数据转换与本地存储及$scope...

    入门学习Linux常用必会60个命令实例详解doc/txt

    在使用mount这个指令时,至少要先知道下列三种信息:要加载对象的文件系统类型、要加载对象的设备名称及要将设备加载到哪个目录下。 (1)Linux可以识别的文件系统 ◆ Windows 95/98常用的FAT 32文件系统:vfat ;...

Global site tag (gtag.js) - Google Analytics