Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
大型对象集的Java内存分配_Java_Memory_Heap_Heap Memory_Large Object Heap - Fatal编程技术网

大型对象集的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

我目前正在用java开发一个游戏引擎,但是,例如,在堆上分配大量对象时,我会遇到性能问题

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+粒子没有问题。