2012-06-16 61 views
0

我有一個Java 3D程序,它使用很多(數百)的3D模型(3ds和obj)。 我使用的模型越多(我真的,真的必須,它是真實世界對象的3D模型),程序變得越重,直到任何單個操作需要時間才能完成。如何減少Java程序的內存消耗

CPU消耗很少達到50%,大部分是在10%-30%之間,但每增加一個3D模型,內存消耗就會增加(明顯)。

我知道如何最大限度地減少C++/c程序的內存印記,但對於Java的GC,除了使用-Xmx增加JVM的內存外,我還能做些什麼呢?我已經運行-xMx512Mb。

我檢查了GC日誌,使用GCViewer,沒有發現任何可疑的東西。

我知道一些非常類似的問題,但沒有一個回答我的問題。

我的IDE是的IntelliJ 11

+0

簡單的方法是停止使用Java。更難的方法是嘗試將所有未使用的引用設置爲'null'來幫助GC。 –

+0

我必須是多平臺:-( – Flot2011

+0

對於你期望內存不足的東西,512mb聽起來不那麼重要 –

回答

4

有兩種簡單的方法來減少你所創建的對象的數量,以及一個或兩者可滿足您的需要,雖然沒有規範我不能肯定。

1)使用高度可變的對象。如果您需要模擬大量具有相似性的事物,但不需要彼此交互(例如,十幾個粒子相互作用的十萬次模擬,每次都有微小差異的粒子),然後反覆使用相同的十幾個對象,並利用增變函數將負擔轉移給CPU。但是,我懷疑按順序使用多個對象對您來說是一個問題,因爲Java已經內置了垃圾回收功能。

2)使類似的對象之間的相似性他們自己的類。例如,如果您需要大量對象,並且您注意到其中很大一部分共享了大量內存密集型特性,請將這些特性存儲在它們自己的類中,並在每個對象中引用該類的單個實例具有完全相同字段值的對象。作爲一個例子,考慮一組Apple對象。您可以爲GrannySmithApples,MackintoshApples和RedDeliciousApples創建不同的類,使用它們自己的靜態字段來實現整個類共享的特性(例如,RedDeliciousApples在抽象類Apple中聲明瞭靜態字符串字段並設置爲「紅色」),或者(爲了允許更多運行時的靈活性)每個類都可以有一個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領域所需的內存量。

1

有我能想到的兩種不同的方法來處理你的問題:

  1. 控制時,在GC踢:here是描述如何控制垃圾收集器和用於清潔不同的算法,一個完整的文章記憶。當應用程序在一分鐘內創建成千上萬的DTO時,我發現這種方法非常有用。
  2. 如果您的應用程序沒有創建太多被快速刪除的對象,那麼我建議您查看一下您的模型並提高其效率。請記住,在處理3D可視化時,所有重要的是如何構建場景圖。

在附註中,使用基於OpenGL的解決方案時,3D可視化並不佔用太多CPU。這主要是因爲在渲染場景圖時,GPU涉及很多而不是CPU。

1

從我的角度來看,你有兩個選擇:

  1. 下降,使它們不可改變創建新的對象,並把它們的再利用,如果他們不改變
  2. 使用flywieght格局 - 再利用創建的對象,並與合作而不是一次又一次地創建新的代碼 - 這裏有一個很好的例子可以滿足您的需求http://www.javacamp.org/designPattern/flyweight.html - 它是關於創建彩色圓圈的。沒有flywieght,它花費了2.5倍,內存消耗也增加了200倍。嘗試一下。