如何减少java程序的内存消耗

时间:2012-06-16 18:13:38

标签: java memory garbage-collection

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

CPU消耗很少达到50%,大部分都在10%-30%之间移动,但每增加一个3D模型,显然会增加内存消耗。

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

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

我知道SO上有一些非常相似的问题,但没有一个完全回答我的问题。

我的IDE是IntelliJ 11。

3 个答案:

答案 0 :(得分:4)

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

1)使用高度可变的对象。如果你需要模拟大量具有相似性的东西,但不需要彼此交互(例如,十几个粒子的十万个模拟相互作用,每次都有略微不同的粒子),然后一遍又一遍地使用相同的十几个对象,并利用mutator函数将负担转移到CPU。但是,我怀疑,依旧使用许多对象是一个问题,因为Java已经内置了垃圾收集。

2)使相似对象之间的相似性成为他们自己的类。例如,如果您需要大量对象,并且您注意到它们中的很大一部分共享许多内存密集型特性,请将这些特性存储在它们自己的类中,并在每个类中引用该类的单个实例。具有完全相同字段值的对象。例如,考虑一组Apple对象。你可以为GrannySmithApples,MackintoshApples,RedDeliciousApples创建不同的类,它们有自己的静态字段,用于在类中共享的特性(例如,RedDeliciousApples有一个在抽象类Apple中声明的静态String字段并设置为“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复制。

答案 1 :(得分:1)

我可以考虑采用两种不同的方法来解决您的问题:

  1. 控制GC何时启动:here是一篇完整的文章,描述如何控制垃圾收集器以及用于清理内存的不同算法。当应用程序在一分钟内创建成千上万的DTO时,我发现这种方法非常有用。
  2. 如果您的应用程序没有创建太多快速破坏的对象,那么我建议您查看您的模型并提高其效率。请记住,在处理3D可视化时,重要的是如何构建场景图。
  3. 另外,在使用基于OpenGL的解决方案时,3D可视化不会占用太多CPU。这主要是因为在渲染场景图而不是CPU时,GPU会涉及很多事实。

答案 2 :(得分:1)

从我的观点来看,你有两个选择:

  1. 通过使新对象不可变来减少创建新对象,并在不改变时重用它们
  2. 使用flywieght模式 - 重用创建的对象并在其上使用setter,而不是一次又一次地创建新对象 - 这里是一个很好的实现示例,可能非常适合您的需求http://www.javacamp.org/designPattern/flyweight.html - 它是关于创建彩色圆圈。没有flywieght它花费了2.5倍,内存消耗大约200。试试吧。