2017-08-03 23 views
0

我最近正在用tomcat開發一個休息服務。我設置了JAVA_OPTS = -Xmx1648m -Xmn1648 -server並確保它們已經生效。碼頭工作時內存限制設置爲4g。由於內存中斷,Tomcat被Docker容器殺死

觀察結果表明,tomcat進程的內存使用量不斷增長,最終達到4g。然後,隨機時間在幾分鐘到幾小時之間,內存成本保持在99%〜100%之間。然後,tomcat進程崩潰,沒有像jvm heap oom這樣的錯誤。

當docker stats觀察到的內存消耗大約爲3.5g時,我使用jmap來轉儲堆。轉儲文件大小低於400米。使用mat來分析轉儲文件顯示實際上大部分內存部分可以被垃圾收集。我還手動運行jcmd pid GC.run,這大大減少了內存使用量(從2g到1.4g)。

我的檢查是,tomcat從未達到jvm設置的限制,否則應該有關於jvm堆棧的錯誤日誌。然後,內存應該被jvm或tomcat中的其他線程使用。但我找不到解決這個問題的方法。請幫忙!

回答

0

當Xmx設置爲1648即1.4G時,JVM將不會使用更多的內容。如果存在內存分配問題,則可能導致OOM。當你說「內存成本保持在99%〜100%之間」時,你的意思是RAM內存?在這種情況下,你的RAM大小是多少?你的任務負荷是多少?你在做頻繁的I/O操作嗎?

+0

是的,RAM內存。 RAM大小受碼頭集裝箱限制,即4g。任務負載確實具有頻繁的I/O。當收到請求時,我們做一些MySQL插入操作,並將文件從源路徑複製到目標路徑。 –

+0

RAM和堆內存是獨立的實體。當達到閾值時,可能會有一些操作系統kill操作,這個問題與java堆無關。可能是一些操作系統限制。 –