Java 在垃圾收集器开始工作之前,我如何回收不再需要的对象?
我的老师让我下载一个2d游戏并提高应用程序的性能。现在我有点卡住了,我决定下载Jprofiler来检查游戏使用的内存等。我看到应用程序使用了大量的矩形,只有当garbace collector来做这件事时,它们才会被删除。我的问题是:有没有办法在GC出现之前去掉这些矩形?这是Jprofiler扫描的图片 精灵对象具有用于边界的矩形阵列列表Java 在垃圾收集器开始工作之前,我如何回收不再需要的对象?,java,garbage-collection,Java,Garbage Collection,我的老师让我下载一个2d游戏并提高应用程序的性能。现在我有点卡住了,我决定下载Jprofiler来检查游戏使用的内存等。我看到应用程序使用了大量的矩形,只有当garbace collector来做这件事时,它们才会被删除。我的问题是:有没有办法在GC出现之前去掉这些矩形?这是Jprofiler扫描的图片 精灵对象具有用于边界的矩形阵列列表 tileX = (int)xMap/tileXSize; tileY = (int)yMap/tileYSize; accurateX =
tileX = (int)xMap/tileXSize;
tileY = (int)yMap/tileYSize;
accurateX = -(int)xMap%tileXSize;
accurateY = -(int)yMap%tileYSize;
for (int i=tileX; i<tileX+displayX+1 && i<sizeX; i++) {
for (int j=tileY; j<tileY+displayY+1 && j<sizeY; j++) {
Sprite s = spriteMap[j][i];
if (s != null) {
s.act();
// Colisones con los objetos de al lado
if (inMap(i+1,j) && spriteMap[j][i+1] != null) {
if (s.collidesWith(spriteMap[j][i+1], false)) {
s.collision(spriteMap[j][i+1]);
spriteMap[j][i+1].collision(s);
}
}
if (inMap(i,j+1) && spriteMap[j+1][i] != null) {
if (s.collidesWith(spriteMap[j+1][i], false)) {
s.collision(spriteMap[j+1][i]);
spriteMap[j+1][i].collision(s);
}
}
if (inMap(i+1,j+1) && spriteMap[j+1][i+1] != null) {
if (s.collidesWith(spriteMap[j+1][i+1], false)) {
s.collision(spriteMap[j+1][i+1]);
spriteMap[j+1][i+1].collision(s);
}
}
if (s.isToDelete()) {
spriteMap[j][i] = null;
}
}
}
tileX=(int)xMap/tileXSize;
tileY=(int)yMap/tileYSize;
accurateX=-(int)xMap%tileXSize;
准确度=-(int)yMap%tileYSize;
对于(inti=tileX;i,您可以通过分析代码的时间复杂性来提高性能。
在分析阶段之后,您可以尝试降低复杂性(如果可能)。您需要从指数时间复杂度转换为线性或对数。有什么实际的性能问题?矩形在做什么,它们都可能与程序相关,不能收集!?可能的重复必须定义您的“性能”概念。垃圾收集器不会运行,因为剩余的未使用内存太多,拥有未使用的内存没有任何好处。这是一个很好的CPU消耗策略。垃圾收集器不运行时不会浪费CPU周期。当您希望应用程序消耗更少的内存时,可以设置上限,例如usi禁用-Xmx
选项。然后,垃圾收集器将更频繁地运行,减少内存消耗,但提高CPU消耗。@JasperHeeren 100 MB的内存并不多,除非您在设备上运行。您可以使用池回收矩形,但可能不值得花费太多时间。2 GB值得在PC或服务器上花费大约1小时的时间。100 MB相当于3分钟。如前所述,分配/GC很可能不是问题所在。100 MB没有什么我想更改的;忘记内存,也许速度可以提高。碰撞检测算法(您没有向我们展示)可能是需要解决的问题。这只是半个答案。单独分析并不能提高性能