删除对象以释放内存JAVA
删除对象以释放内存JAVA
我正在开发一个小型的太空射击游戏。这是学习JAVA的有趣方式,我想确保我的做法是正确的。\n在运行时,这个对象(飞船)会生成其他对象(激光)。\n我是这样实现的:\n
- \n
- 屏幕上绘制了飞船。当检测到触摸时,它会创建类Laser的新实例,然后将它们添加到GameScreen类中的静态LinkedList lasers中。
- GameScreen对象负责在屏幕上绘制和更新所有的激光、飞船和特效。
\n
\n
\n这是不言而喻的。但是现在:\n
- \n
- 调用detectCollision(),将与飞船对象相交的所有激光从LinkedList lasers中删除。
- 在游戏结束时(用户退出),我遍历存储在GameScreen.lasers链表中的Laser类的所有实例,并将它们全部设置为null。完成后,我还将列表设置为null。
\n
\n
\n这是释放分配的内存的正确方法吗?\n激光创建:\n
abstract class Ship { if (canShoot()) { Laser laser = new Laser(new Rectangle(x, y, width, height)); // bounds GameScreen.playerLasers.add(laser); }}
\n激光销毁:\n
public class GameScreen { private void dispose() { for (Laser laser : playerLasers) { laser.bounds = null; laser = null; } playerLasers = null; }}
\nGameScreen类的collisionDetection():\n
public class GameScreen { private void detectCollision() { ListIteratoritr = playerLasers.listIterator(); while (itr.hasNext()){ Laser laser = itr.next(); if (laser.bounds.overlaps(ship.bounds)){ ship.health -= laser.damage; laser.bounds = null; laser = null; itr.remove(); }}}}
问题原因:Java是一种垃圾回收系统,无法手动释放内存。将对象设置为null并不会导致释放内存。Java会自动清理不再使用的对象,无需进行任何操作。需要关注的只是编程逻辑。
解决方法:在这种情况下,需要使用itr.remove();
来从游戏逻辑中移除laser对象,而不是释放内存。因此,删除null分配行后,代码如下:
if (laser.bounds.overlaps(ship.bounds)){ ship.health -= laser.damage; itr.remove(); }
关于为什么会有这个问题,可以参考这个链接:link。这是一个非常复杂的问题,通常不会遇到,并且与您的情况无关。他们为了创建仍然可以“访问”的对象而费尽心思。如果从迭代器中删除了laser对象,您将无法再访问它,垃圾回收器将会自动处理一切。
感谢您的帮助!