我編寫了一個小型java程序,它使用簡單的JDBC調用從DB2數據庫加載數據。我正在使用select查詢來獲取數據併爲此使用java語句。我已經正確關閉了語句和連接對象。我正在使用64位JVM進行編譯和運行程序。爲什麼我的JDBC調用消耗內存的數據量是實際大小的4倍
查詢返回5200萬條記錄,每行有24列,這需要我花4分鐘才能在Unix(具有多處理器環境)中加載完整數據。我使用HashMap作爲數據結構來加載數據:Map<String, Map<String, GridTradeStatus>>
。 Bean GridTradeStatus是一個簡單的getter/setter bean,其中包含24個屬性。
該程序所需的內存驚人地高。 Java堆大小上升到5.8 - 6GB來加載完整的數據,而實際使用的堆大小保持在4.7 - 4.9GB之間。我知道我們不應該將這麼多的數據加載到內存中,但是我的業務需求只能以這種方式進行。
問題是,當我將我的表的整個數據放在一個平面文件中時,它大致相當於〜1.2GB。我想知道爲什麼我的Java程序消耗的內存是其實際大小的4倍多。
java中的字符串使用UTF-16,每個字符表示2個字節。所以如果你的txt文件是一個普通的8位/字符編碼,那麼會導致雙倍的內存使用率。此外,如果您使用子字符串方法,請記住,只要子字符串對象處於活動狀態,就會釋放原始字符串newer。 – MTilsted 2013-05-09 12:35:51
感謝您的評論。是否有可能指示JVM使用UTF-8編碼? – 2013-05-10 05:13:36
不是直接。 java.lang.String將始終使用UTF-16。但我相信,谷歌搜索可以給你一個java字符串類,它使用utf-8或其他8位編碼。 – MTilsted 2013-05-10 11:26:25