大型对象集的Java内存分配
我目前正在用java开发一个游戏引擎,但是,例如,在堆上分配大量对象时,我会遇到性能问题大型对象集的Java内存分配,java,memory,heap,heap-memory,large-object-heap,Java,Memory,Heap,Heap Memory,Large Object Heap,我目前正在用java开发一个游戏引擎,但是,例如,在堆上分配大量对象时,我会遇到性能问题 public class GLParticleSystem { private GLParticle[] particles = new GLParticle[2000]; private int numberOfParticles; public GLParticleSystem(numberOfParticles) { this.numberOfParticles = num
public class GLParticleSystem {
private GLParticle[] particles = new GLParticle[2000];
private int numberOfParticles;
public GLParticleSystem(numberOfParticles) {
this.numberOfParticles = numberOfParticles;
}
public void init() {
for (int i = 0; i < numberOfParticles; i++) {
particles[i] = new GLParticle();
}
}
}
感谢Gary您在init中创建了新对象,您可能会发现对象池非常有用。不要每次创建对象时都创建对象,而是首先创建一个大型集合。然后,每当您需要一个对象时,您都会获取一个预分配的对象
如果您在init中创建新对象,您可能会发现对象池非常有用。不要每次创建对象时都创建对象,而是首先创建一个大型集合。然后,每当您需要一个对象时,您都会获取一个预分配的对象
专用静态最终浮点U=480f
和V
会有一点帮助
看看做这些事情的未来任务。
私有静态最终浮点U=480f
和V
会有一点帮助
查看FutureTask来做这些事情。您可以为
GLParticle
的每个成员创建10个单独的2000数组,并使用。在这个实现中,每个GLParticle都将其索引传递到GLParticleSystem
的数组中,以及包含这些数组的GLParticleSystem
实例。这稍微有点麻烦,但当拥有大量细粒度对象的CPU周期变得过于昂贵时,这是第一个尝试的模式。您可以为GLParticle
的每个成员创建10个单独的2000数组,并使用它。在这个实现中,每个GLParticle都将其索引传递到GLParticleSystem
的数组中,以及包含这些数组的GLParticleSystem
实例。这稍微有点麻烦,但这是当拥有大量细粒度对象的CPU周期变得过于昂贵时尝试的第一种模式。虽然我有点惊讶于只分配2000个对象会出现性能问题,但很抱歉,没有简单的解决方法。Java缺少C/C结构类型,与这些语言相比,它在这种情况下不是一种非常有效的语言。您的问题有三种解决方案
1) 在需要之前预先分配对象。虽然它可以工作,但这不是一个很好的解决方案,因为您必须手动将未使用的对象返回到预先分配的对象池中
2) 假设GLParticle是一个小对象(56字节),如果您的使用允许,可以将其重写为GLParticles类,该类存储固定数量的GLParticle对象的数据
class GLParticles {
private static final float u = 480f, v = 504f;
private GLSpriteSheet[] images;
private float[] x, y, vX, vY, alpha, alphaStep;
private boolean[] isDead;
private long[] startTime, lifeTime;
GLParticles( int size ) {
// allocate arrays here...
}
}
这不仅更节省空间,而且分配(和收集)速度更快
3) 如果您使用的JVM具有托儿所和线程本地GC池的大小,请尝试优化这些池的大小。虽然我有点惊讶于您仅分配2000个对象会出现性能问题,但很抱歉,您的问题没有简单的解决方案。Java缺少C/C结构类型,与这些语言相比,它在这种情况下不是一种非常有效的语言。您的问题有三种解决方案 1) 在需要之前预先分配对象。虽然它可以工作,但这不是一个很好的解决方案,因为您必须手动将未使用的对象返回到预先分配的对象池中 2) 假设GLParticle是一个小对象(56字节),如果您的使用允许,可以将其重写为GLParticles类,该类存储固定数量的GLParticle对象的数据
class GLParticles {
private static final float u = 480f, v = 504f;
private GLSpriteSheet[] images;
private float[] x, y, vX, vY, alpha, alphaStep;
private boolean[] isDead;
private long[] startTime, lifeTime;
GLParticles( int size ) {
// allocate arrays here...
}
}
这不仅更节省空间,而且分配(和收集)速度更快
3) 如果您使用的JVM具有托儿所和线程本地GC池,请尝试优化它们的大小。GLParticle类有多复杂?你能发布它的数据成员吗?init在它自己的线程中运行吗?你能在显示任何图像之前进行初始化吗?GLParticle的2k对象什么都不是,问题不在于分配本身。我打赌你初始化了
GLSpriteSheet
,这将是一个主要问题,其余的都是无关紧要的(你可以从评论中推断,有很多方法可以减轻你所描述的内容。)GLParticle
类有多复杂?你能发布它的数据成员吗?init在它自己的线程中运行吗?你能在显示任何图像之前进行初始化吗?GLParticle的2k对象什么都不是,问题不在于分配本身。我打赌你初始化了GLSpriteSheet
,这将是一个主要问题,其余的都是无关紧要的(从评论中可以推断,有很多方法可以减轻你所描述的内容)非常感谢我昨晚实现了这一点,分配3000+粒子没有问题。非常感谢我昨晚实现了这一点,分配3000+粒子没有问题。