您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
Android(Java)游戏循环中频繁new对象怎么处理?
对象,内存,都是Android(Java)游戏循环中频繁new对象怎么处理?
发布时间:2016-12-08加入收藏来源:互联网点击:
Android(Java)游戏循环中频繁new对象怎么处理?
回答于 2019-09-11 08:43:50
回答于 2019-09-11 08:43:50
谢邀。
我觉得这个问题需要分情况:
1、如果每次需要的对象是单一不变的,应该考虑使用单例;
2、如果每次要求对象是新的,考虑引入对象池,采用预分配的机制。
如果一味的new对象,而不去销毁对象,最终会导致内存溢出
回答于 2019-09-11 08:43:50
首先谢谢你的邀请。
针对这个问题首先需要分析,代码逻辑上是否一定要在循环中创建对象。
1、如果不是必须的就需要优化代码逻辑。因为java中每次new创建一个对象就需要分配内存,对于Java对象来讲,如果说这个对象一直被其他对象所引用,则该对象不会被垃圾回收器回收。而循环中不断创建对象,导致程序占用内存越来越多,最后可能导致频繁Minor GC或者Full GC,甚至内存溢出,这是应该尽量避免的。
2、如果循环中创建对象无法避免,则需要分析每次需要的对象类型。
(1)、如果每次需要的对象可以是不变的,则可以使用单例,这样就只需要创建一次,多次调用即可。
(2)、如果每次需要的对象要不一样的,则需要分析每次创建的对象是只需要在循环里面使用,还是把对象放入集合中在循环体外面使用。
a、如果每次创建的对象只在循环里面使用,则可以把引用的声明放在循环外面,循环里面每次创建不同的对象。这样就是分别把多个对象地址赋值给同一个引用,当把一个新对象地址赋值给引用时,前一个对象已经是无引用状态,可以更快的被垃圾回收器回收,有可能循环还未结束,前面创建的对象已经被回收了,这样可以更快的释放内存。
b、如果每次创建的对象有在循环外面使用,则引用的声明和对象的创建都需要放在循环里面。这种情况是最不理想的,因为创建的对象太多,且都有引用指向对象,这样垃圾回收器就不能回收对象,占用内存较多。
回答于 2019-09-11 08:43:50
首先谢谢您的邀请,回答中有不足之处还请谅解。在循环的时候创建对象,一般分两种情况:
1.在循环体外,始终都是这一个对象,循环放入的都是最新的值。
2.在循环体内,创建的是不同的对象,每次放入的对应这不同值的对象。
事实上在Java的GC回收机制中如果一个对象有着具体的引用,那么是不会被GC自动回收的。
也就是说:
Card mCard = new Card();//写在N个循环内等于你有N个引用对应了N个对象
所以N个对象在一段时间内都是会占用内存,直到内存不足GC主动回收
mCard = new Card();//写在N个循环内等于你使用1个引用分别N次调用了N个对象
所以当后一个对象init后,前一个对象已经是“无引用状态”,会很快的被GC自动回收,有可能在你的循环还未结束时,就已经进行了多次GC回收,这点很重要。
也就是说我个人比较偏向用第二种方法,这个应该能更好的管理内存。
回答于 2019-09-11 08:43:50
首先应该看一下代码逻辑是否可以优化,频繁new对象就是不断的在分配内存,之后垃圾回收器会不断地回收不在使用的内存,这会发生内存抖动,导致性能非常差。应该尽量避免。
如果避免不了new对象,可以采用对象池,先分配一块内存,之后使用时从对象池中取,而不是频繁new对象。
大家好!我是黑客之家小编,黑客之家头条号
分享黑客技术,物联网、GO、Python、Kotlin、Android、Java编程知识,科技资讯等喜欢的朋友可以关注我的头条号!
上一篇:有没有哪一刻觉得自己颜值爆表?
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |