0

我有一个 Java 3D 程序,它使用了很多(数百个)3D 模型(3ds 和 obj)。我使用的模型越多(我真的,真的必须这样做,它是真实世界对象的一种 3D 模型),程序变得越重,直到任何单个操作都需要很长时间才能完成。

CPU 消耗很少达到 50%,大部分在 10%-30% 之间移动,但内存消耗随着每个添加的 3D 模型而增长(显然)。

我知道如何最小化 c++/c 程序的内存印记,但是对于 Java 的 GC,除了使用 -Xmx 增加 JVM 的内存之外,我能做些什么吗?我已经在运行 -xMx512Mb。

我使用 GCViewer 检查了 GC 日志,没有发现任何可疑之处。

我知道关于 SO 的一些非常相似的问题,但没有人准确回答我的问题。

我的 IDE 是 IntelliJ 11。

4

3 回答 3

4

有两种简单的方法可以减少您正在创建的对象的数量,其中一种或两种可能适用于您的目的,尽管没有规范我无法确定。

1) 使用高度可变的对象。如果您需要模拟大量相似度很高但不必相互交互的事物(例如,十万次模拟十几个粒子交互,每次粒子略有不同),然后一遍又一遍地使用相同的十几个对象,并利用 mutator 函数将负担转移到 CPU。但是,我怀疑按顺序使用许多对象对您来说是个问题,因为 Java 已经内置了垃圾收集。

2)将相似对象之间的相似性作为自己的类。例如,如果您需要大量对象,并且注意到其中很大一部分共享许多内存密集型特征,请将这些特征存储在它们自己的类中,并在每个对象中引用该类的单个实例具有完全相同的字段值的对象。例如,考虑一组 Apple 对象。您可以为 GrannySmithApples、MackintoshApples、RedDeliciousApples 创建不同的类,并使用它们自己的静态字段来实现跨类共享的特征(例如 RedDeliciousApples 在抽象类 Apple 中声明了一个静态字符串字段并设置为“red”),或者(允许更多运行时的灵活性)每个类都可以有一个 CoreCharacteristic 的实例。

CoreCharacteristic c = new CoreCharacteristic(<some parameters>);
Apple apple1 = new Apple(c);
Apple apple2 = new Apple(c);
Apple apple3 = new Apple(c);
Apple apple4 = new Apple(c);

将只为所有四个苹果使用一个 CoreCharacteristic,将存储 CoreCharacteristic 字段所需的内存量减半,否则这些字段将被每个 Apple 复制。

于 2012-06-16T18:27:51.420 回答
1

我可以想到两种不同的方法来处理您的问题:

  1. 控制 GC 何时启动:是一篇完整的文章,描述了如何控制垃圾收集器以及用于清理内存的不同算法。当应用程序在一分钟内创建成千上万个 DTO 时,我发现这种方法非常有用。
  2. 如果您的应用程序没有创建太多快速丢弃的对象,那么我建议您查看您的模型并提高其效率。请记住,在处理 3D 可视化时,重要的是如何构建场景图。

附带说明一下,使用基于 OpenGL 的解决方案时,3D 可视化不会占用那么多 CPU。这主要是因为在渲染场景图时涉及很多的是 GPU,而不是 CPU。

于 2012-06-16T18:30:15.183 回答
1

从我的角度来看,您有两个选择:

  1. 通过使它们不可变来减少创建新对象,如果它们不变则重用它们
  2. 使用flywieght模式-重用创建的对象并在它们上使用setter,而不是一次又一次地创建新的对象-这是一个很好的实现示例,可能完全适合您的需求http://www.javacamp.org/designPattern/flyweight。 html - 它是关于创建色环。如果没有 flywiegh,它需要 2.5 倍的时间,并且内存消耗要大 200 倍。尝试一下。
于 2012-06-16T18:33:25.443 回答