关于大对象的深拷贝,性能如何解决
发布网友
发布时间:2022-04-26 10:13
我来回答
共1个回答
热心网友
时间:2022-06-27 05:47
有个领域对象非常复杂与庞大
目前是使用序列化进行拷贝,然后处理。不过最近由于访问量等因素造成了宕机
,几乎都是这个地方挂了,内存溢出
-----------------------------------
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();
那就只有进行手动clone了,以前碰到过这问题
-----------------------------------------
手动clone也是痛苦,对象套对象,N层。。。手术量特别大。
更何况,我说的量应该都是大的,50w并发一般是不可能的,一个对象0.5KB也是相当大了。
所以,我说,还是程序的问题。先把对象流手动关闭,试试看再说。
-----------------------------------------
那个流是该关一下,问题是试不了,怕是关键问题不在此。。。。一个对象0。5K? 你太小看了,我想你不是电信行业的,可能不太了解,刚才通过任务管理器批量建立对象,粗略算了一下是这个对象70M左右。jvm来不及GC,最终造成这个问题。
机器倒是性能不错了,集群,每台16G内存,16个CPU。
目前考虑一个方案是把大对象分拆小对象进行序列化拷贝,最后组装,用CPU来换内存。
关于js中的对象的深拷贝常用的方式
实现深拷贝,可以采用手动递归复制或使用第三方库如lodash中的`_.cloneDeep()`函数,以确保对象及其嵌套对象的独立副本。最后,对于数组的深拷贝,同样需要注意仅使用等号赋值会进行浅拷贝,导致数组引用问题。可以采用递归复制或借助第三方库实现深拷贝。
用递归解决对象的深拷贝问题
深拷贝会另外拷贝一份一个一模一样的对象,从堆内存中开辟一个新的区域存放新对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。 简单说:深拷贝把存放对象的空间地址,再复制一份给新对象,这样两个对象直接互不干扰。基于基本数据类型直接循环复制,对于复杂数据类型再次运用for循环操作,每...
关于js中的对象的深拷贝常用的方式
3. 深拷贝示例假设场景:一个表格需要展示并编辑数据,不使用深拷贝时,编辑表单中的数据会同步更改表格,这并非期望效果。而通过深拷贝,如使用`JSON.parse(JSON.stringify(obj))`或lodash的`_.cloneDeep()`,可以创建一个新的独立对象副本,修改表单数据不会影响原始表格。数组深拷贝对于数组的深拷贝...
JSON.stringify深拷贝的缺点及解决
5、JSON.stringify()只能序列化对象的可枚举的自有属性,例如 如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor;6、如果对象中存在循环引用的情况也无法正确实现深拷贝; 总结: 用法简单,然而使用这种方法会有一些隐藏的坑:因为在序...
python的深拷贝和浅拷贝
浅拷贝适合于对象层次结构较浅的情况,比如列表、元组、字典等简单对象的复制。如果对象的元素全部为不可变类型,则可以使用浅拷贝来复制该对象。如果对象层次结构比较复杂,例如嵌套列表的列表或嵌套字典的字典,那么深拷贝就是一个合适的选择。如果一个对象的元素包含可变对象,那么在需要进行拷贝时必须使用...
尬谈Js对象的深拷贝与浅拷贝
深拷贝则确保复制的对象完全独立,互不干扰。常见的深拷贝方法有`JSON.parse()`和`JSON.stringify()`,但它们不能处理函数和正则对象。要实现自定义深拷贝,如使用`Function.prototype.call`或`new Function`,但需考虑特殊情况,如ES6函数的处理。通过上述讨论,我们了解到JavaScript对象深浅拷贝的差异和...
什么是深拷贝和浅拷贝
深拷贝和浅拷贝需要注意的地方就是可变元素的拷贝:在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被...
JAVA引用拷贝、对象浅拷贝、对象深拷贝
实现深拷贝通常需要通过序列化与反序列化过程,如将User类对象进行序列化后再反序列化,确保新创建的对象与原对象没有任何关联。在实际开发中,应尽量避免对象的多层传递赋值,以降低代码复杂性和潜在错误,优先选择浅拷贝,除非有明确的深拷贝需求,如处理不可序列化的对象或需要完全独立的副本。
深拷贝与浅拷贝的实现(一)
主要看下关于深拷贝的部分,取第一个参数,如果是boolean类型的,就赋值给deep,下面如果deep为true(也就是进行深拷贝),就递归调用extend(),这样就将对象的所有属性都添加到了target中实现了深拷贝。JSON.parse()和JSON.stringify()上面的jQuery源码是否让你眼花缭乱?有没有什么办法无脑实现深拷贝呢...
对象属性拷贝,到底谁更厉害?
进行性能对比测试后,我们发现 MapStruct 的复制速度最快,而 Apache BeanUtils 性能最差。选择工具时,需综合考虑项目需求、性能要求和开发团队习惯。本文总结了几种对象属性复制工具的使用方式与性能特点,并给出选择建议。对于需要深拷贝的场景,可考虑使用对象序列化和反序列化技术。如有任何疑问或补充意见...