2011-05-05 87 views
1

Iv'e編碼了一個帶有.obj文件的ObjectLoader,它給了我我想要的東西。 我的問題是,當處理大文件(甚至不是那麼大,大約80kb),我最終 最終沒有得到所有的信息,因爲它會在一段時間後停止閱讀。垃圾回收問題

我在logcat中獲取該即時通訊做之前和debuger簡單地移動到下一個方法:

DEBUG/dalvikvm(25743):GC_FOR_MALLOC釋放2076名對象/在50ms的
DEBUG/dalvikvm 124280字節( 25743):GC_FOR_MALLOC釋放4名對象/在52ms
DEBUG 232字節/ dalvikvm(25743):GC_FOR_MALLOC釋放142個的對象/在49ms
DEBUG 46728字節/ dalvikvm(25743):GC_FOR_MALLOC釋放0對象/ 0字節在53ms DEBUG/dalvikvm(25743):GC_FOR_MALLOC在39ms中釋放了533個對象/ 63504個字節
DEBUG/dalvikvm(25743):GC_FOR_MALLOC釋放4名對象/在50ms的
DEBUG 216字節/ dalvikvm(25743):GC_EXTERNAL_ALLOC釋放132個的對象/ 26768字節在40ms內

換句話說,很多垃圾收集的我猜。僅僅是因爲我在代碼中分配了很多內存?如果是這樣,是否有我需要閱讀的基本知識,或者您有任何其他建議?我使用了4個矢量,每個矢量最終保存着2K-3K左右的物體。 編輯:有7個向量,3個額外的承載索引,但我仍然認爲它不是那麼多。

private void readObj(InputStreamReader in) throws IOException 
{ 
    BufferedReader reader = null; 
    String line = null; 

    reader = new BufferedReader(in); 

    while ((line = reader.readLine()) != null) 
    { 
     Log.v(TAG, line); 
     if (line.startsWith("f")) 
     { 
      faces++; 
      processFLine(line); 
     } else if (line.startsWith("vn")) 
     { 
      normals++; 
      processVNLine(line); 
     } else if (line.startsWith("vt")) 
     { 
      UVCoords++; 
      processVTLine(line); 
     } else if (line.startsWith("v")) 
     { 
      vertices++; 
      processVLine(line); 
     } 
    } 

}

private void processVNLine(String line) 
{ 
    String[] tokens = line.split("[ ]+"); 
    int c = tokens.length; 
    for (int i = 1; i < c; i++) 
    { 
     _vn.add(Float.valueOf(tokens[i])); 
    } 
} 

private void processFLine(String line) 
{ 
    String[] tokens = line.split("[ ]+"); 
    int c = tokens.length; 

    if (tokens[1].matches("[0-9]+")) 
    { 
     caseFEqOne(tokens, c); 
    } 
    if (tokens[1].matches("[0-9]+/[0-9]+")) 
    { 
     caseFEqTwo(tokens, c); 
    } 
    if (tokens[1].matches("[0-9]+//[0-9]+")) 
    { 
     caseFEqOneAndThree(tokens, c); 
    } 
    if (tokens[1].matches("[0-9]+/[0-9]+/[0-9]+")) 
    { 
     caseFEqThree(tokens, c); 
    } 

}

private void caseFEqThree(String[] tokens, int c) 
{ 
    for (int i = 1; i < c; i++) 
    { 
     Short s = Short.valueOf(tokens[i].split("/")[0]); 
     s--; 
     _vPointer.add(s); 

     s = Short.valueOf(tokens[i].split("/")[1]); 
     s--; 
     _vtPointer.add(s); 

     s = Short.valueOf(tokens[i].split("/")[2]); 
     s--; 
     _vnPointer.add(s); 
    } 
} 
+2

這聽起來不像大量的內存除了那些矢量之外還有其他問題 – 2011-05-05 06:43:46

+0

我不認爲任何人都可以在不查看代碼或至少數據結構的情況下提供有用的答案。 – 2011-05-05 06:48:15

+0

好吧,我會從課堂上發佈一些代碼。也許我真的很愚蠢。從來沒有真正關心內存分配。 – Henrik 2011-05-05 06:48:28

回答

1

那麼我現在得到了答案,這很尷尬......正如你所說的那樣,這不是垃圾收集器的錯。這是LogCat的錯。而不是打印出關於垃圾收集的排行的事實,這是因爲它沒有打印出我在循環完成時使用的Log.i(標記,字符串)。 (在循環過程中,我使用了Log.v(),所以它確實沒有給我提供不完整的結果,我只是無法看到完整的結果或者它完成了。好吧,無論如何,很抱歉拿起你的'時間這一點,我想感謝,對thoose的你,試圖幫助。

如果任何主持人看到這一點,你可以關閉的問題。否則,我會盡快將其刪除。

0

我可以看到你在做一個系統性的錯誤,雖然我不知道這是否是你的問題的原因。

例如:

String[] tokens = line.split("[ ]+"); 
int c = tokens.length; 
for (int i = 1; i < c; i++) 
{ 
    _vn.add(Float.valueOf(tokens[i])); 
} 

在Java中,數組索引從0開始,上升到array.length - 1。你的代碼似乎在跳過第零個標記,在這裏和其他地方。在processFLine中,您使用tokens[1]來選擇不同的格式,因此可能會得到ArrayIndexOutOfBoundsException

+0

那是因爲我不喜歡第一個(索引0),只是因爲iv'e在我的文件中有這樣幾行建立:v 0.000 1.000 0.000(例如)所以我想跳過'v 「 – Henrik 2011-05-05 07:19:34