簡體   English   中英

我的代碼中的內存不足異常

[英]Out of memory exception in my code

我正在運行代碼長時間作為Oracle數據庫壓力測試的一部分並使用java版本“1.4.2”。 簡而言之,我所做的是:

while(true)
{
    Allocating some memory as a blob
    byte[] data = new byte[1000];
    stmt = fConnection.prepareStatement(query); // [compiling an insert query which uses the above blob]
    stmt.execute();  // I insert this blob-row in the database. 
stmt.close();

}

現在我想運行這個測試8-10小時。 然而,顯然在插入大約1500萬條記錄后,我點擊了java.lang.OutOfMemoryError

我用-Xms512m -Xmx2g運行它。 我嘗試使用更高的值,但我似乎沒有那么多的硬件,我認為它不是req:

    java -Xms512m -Xmx4g -jar XX.jar
    Invalid maximum heap size: -Xmx4g
    The specified size exceeds the maximum representable size.
    Could not create the Java virtual machine.
    java -Xms2g -Xmx3g -jar XX.jar
    Error occurred during initialization of VM
    Could not reserve enough space for object heap
    Could not create the Java virtual machine.

我將其作為多線程程序運行。 所以arnd 10個線程正在進行插入。

有沒有什么方法可以不用黑客的方式繞過這個程序。 我的意思是,如果我決定運行15-20小時而不是8-10小時。

編輯:添加stmt.close,因為我已經在我的代碼中使用它。 基於評論的一些變化

謝謝

PS:抱歉,不能發布NDA的代碼

基本上,我認為你正在咆哮錯誤的樹:

  • 無論分配速度有多快,JVM / GC 都會設法釋放無法訪問的對象。 如果您正在運行經典的非並發GC,那么在GC釋放內存之前,JVM將停止執行其他操作。 如果您將JVM配置為使用並發GC,它將嘗試同時運行GC和正常工作線程...並且如果無法跟上則恢復為“停止所有並收集”行為。

  • 如果內存不足,那是因為應用程序中的某些東西(或它正在使用的庫/驅動程序)正在泄漏內存。 換句話說,即使您的應用程序不再需要它,某些東西也會導致對象保持可訪問狀態。

正如評論所指出的,您需要使用內存分析器/堆轉儲有條不紊地解決此問題。 隨機更改內容或將其歸咎於GC極不可能解決問題。

(當你說“......我確實一直使用stmt.close()”時 ,我認為這意味着你的代碼看起來像這樣:

    PreparedStatement stmt = ... 
    try {
        stmt.execute();
        // ...
    } finally {
        stmt.close();
    }

如果你不把close通話的finally則是可能的,你是不是叫close每一次。 特別是,如果在execute調用期間或在它與close調用之間拋出某些異常,則可能無法調用close ...這將導致泄漏。)

此執行由OracleConnection NativeMemory引起。 對於NIO操作oracle jdbc的人決定使用本機部分內存。 很可能在執行此查詢后過於頻繁地使您的應用程序轉儲。 要擺脫這種情況,您可以增加jdbc的緩存大小或按時間間隔重新啟動應用程序

我想你應該補充一下

stmt.close();

所以分配給preparedStatement的內存將被釋放。

如果您的代碼或庫中存在泄漏,則Memory Analyzer(MAT)是一個免費的基於Eclipse的應用程序,用於深入研究Java內存轉儲文件。 說明包括如何讓它為您刪除轉儲文件。 http://www.eclipse.org/mat/

java -Xms2g -Xmx3 -jar XX.jar
Error occurred during initialization of VM
Incompatible minimum and maximum heap sizes specified

嘗試

java -Xms2g -Xmx3g -jar XX.jar

你的盒子里有多少記憶? 您運行的是32位還是64位JVM?

編輯:似乎它可能是已知的Oracle驅動程序問題: http//www.theserverside.com/discussions/thread.tss?thread_id = 10218


只是一個遠景,我知道你在這里做了簡單的JDBC,但如果你有任何增強器(AspectJ,Hibernate,JPA),有一個(輕微的)Perm gen泄漏的機會,設置-XX:MaxPermGen=256m只是為了在安全方面

此外,jvisualvm內存分析器和jprofiler(您可以使用試用版)將更快地指出它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM