2012-07-23 258 views
2

我有有一個獨立的Java應用程序:故障排除無界的Java駐留集大小(RSS)增長

-Xmx1024m -Xms1024m -XX:MaxPermSize=256m -XX:PermSize=256m 

超過它會佔用更多的內存隨着時間的推移,開始交換(和減緩)和最終死了很多次(不是OOM + dump,剛剛死了,沒有/ var/log/messages)。

我試過到目前爲止:

  1. 堆轉儲:活動對象採取200-300Mb了1G堆 - >確定與堆
  2. 的活動線程數是相當恆定(〜60 -70) - >確定與線程堆棧
  3. JMX在某一點停止應答(MB它的答案,但超時較低)
  4. 關閉掉 - 它死更快
  5. strace的 - 似乎一切都慢下來了一點,應用程序仍然沒有死亡,並不確定這事情看起來有
  6. 檢查頂部:VIRT增長到5.5GB,RSS 3.7千兆
  7. (我們開始交換明顯)檢查的vmstat:

    --------------------------procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ 
    Sun Jul 22 16:10:26 2012: r b swpd free buff cache si so bi bo in cs us sy id wa st 
    Sun Jul 22 16:48:41 2012: 0 0 138652 2502504 40360 706592 1 0 169 21 1047 206 20 1 74 4 0 
    . . . 
    Sun Jul 22 18:10:59 2012: 0 0 138648 24816 58600 1609212 0 0 124 669 913 24436 43 22 34 2 0 
    Sun Jul 22 19:10:22 2012: 33 1 138644 33304 4960 1107480 0 0 100 536 810 19536 44 22 23 10 0 
    Sun Jul 22 20:10:28 2012: 54 1 213916 26928 2864 578832 3 360 100 710 639 12702 43 16 30 11 0 
    Sun Jul 22 21:10:43 2012: 0 0 629256 26116 2992 467808 84 176 278 1320 1293 24243 50 19 29 3 0 
    Sun Jul 22 22:10:55 2012: 4 0 772168 29136 1240 165900 203 94 435 1188 1278 21851 48 16 33 2 0 
    Sun Jul 22 23:10:57 2012: 0 1 2429536 26280 1880 169816 6875 6471 7081 6878 2146 8447 18 37 1 45 0 
    
  8. 特區也顯示出穩定系統%增長=交換:

    15:40:02   CPU  %user  %nice %system %iowait %steal  %idle 
    17:40:01   all  51.00  0.00  7.81  3.04  0.00  38.15 
    19:40:01   all  48.43  0.00  18.89  2.07  0.00  30.60 
    20:40:01   all  43.93  0.00  15.84  5.54  0.00  34.70 
    21:40:01   all  46.14  0.00  15.44  6.57  0.00  31.85 
    22:40:01   all  44.25  0.00  20.94  5.43  0.00  29.39 
    23:40:01   all  18.24  0.00  52.13  21.17  0.00  8.46 
    12:40:02   all  22.03  0.00  41.70  15.46  0.00  20.81 
    
  9. 檢查PMAP gaves以下最大貢獻者:

    000000005416c000 1505760K rwx-- [ anon ] 
        00000000b0000000 1310720K rwx-- [ anon ] 
        00002aaab9001000 2079748K rwx-- [ anon ] 
    
  10. 嘗試我從東西通過strace的甩PMAP了地址關聯不給我匹配

  11. 添加更多的內存是不實際的(只是讓後來問題出現)

  12. 開關JVM的不可能(ENV是不在我們的控制之下)

,問題是: 我還可以嘗試跟蹤問題的原因或嘗試解決它?

+0

類似問題http://stackoverflow.com/questions/26041117/growing-resident-memory-usage- rss-of-java-process – 2016-08-25 11:47:10

回答

1

問題出在一個配置文件庫中 - 它記錄了CPU調用/分配站點,因此需要內存來存儲它。

所以,人因子這裏:)

1

您的JVM中的某些內容正在使用「無限」數量的非堆內存。一些可能的候選人是:

  • 線程堆棧。
  • 由本地代碼庫分配的原生堆。
  • 內存映射文件。

當您執行線程堆棧轉儲時,第一種可能性將顯示爲大量(且增加)的線程數。 (只是檢查它...好嗎?)

第二個你可以(可能)消除,如果你的應用程序(或它使用的某個第三部分庫)不使用任何本機庫。

如果您的應用程序(或其使用的某個第三方零件庫)不使用內存映射文件,則可以消除第三個問題。


我猜想你沒看到OOME的原因是你的JVM被Linux OOM殺手殺死了。它也有可能是JVM以本機代碼(例如,由於malloc失敗未被正確處理)救援出來的,但我認爲JVM崩潰轉儲將是更可能的結果...

1

有與Java和glibc> = 2.10的一個已知問題(包括Ubuntu的> = 10.04,RHEL> = 6)。

治療方法是設置此env。變量: export MALLOC_ARENA_MAX=4

有有關設置MALLOC_ARENA_MAX https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage?lang=en

This blog post says

駐留存儲器已經知道以類似於 內存泄漏或內存碎片的方式蠕變的IBM製品。

在Google或SO上搜索MALLOC_ARENA_MAX以獲取更多參考信息。

你可能需要調整還有其他的malloc選項以優化分配內存的低碎片:

# tune glibc memory allocation, optimize for low fragmentation 
# limit the number of arenas 
export MALLOC_ARENA_MAX=2 
# disable dynamic mmap threshold, see M_MMAP_THRESHOLD in "man mallopt" 
export MALLOC_MMAP_THRESHOLD_=131072 
export MALLOC_TRIM_THRESHOLD_=131072 
export MALLOC_TOP_PAD_=131072 
export MALLOC_MMAP_MAX_=65536 
+0

JVM可能會泄漏導致類似症狀的本地內存。請參閱http://www.evanjones.ca/java-native-leak-bug.html以調試泄漏。一些bug的例子是http://www.evanjones.ca/java-bytebuffer-leak.html和http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8164293。未封閉的GZIPInputStream和GZIPOutputStream實例也可能是泄漏的來源。 – 2016-08-25 11:42:08

+0

這個討論關於CloudFoundry上Java過程RSS大小的增長:https://github.com/cloudfoundry/java-buildpack/issues/320#issuecomment-242350879 – 2016-08-25 11:42:21

+0

「爲了追蹤泄漏,使用jemalloc並打開採樣分析使用MALLOC_CONF環境變量「。 ,請參閱http://www.evanjones.ca/java-native-leak-bug.html – 2016-08-25 11:44:09