簡體   English   中英

為什么在小堆上使用完整的gc需要5秒鍾?

[英]Why will a full gc on small heap takes 5 seconds?

我在3歲的Solaris系統上運行J2EE應用程序,使用的堆約為300 MB。 從gc日志中,我看到每天觸發幾次的完整gc大約需要5秒鍾,並且每次恢復大約200 MB。 一個完整的gc在這么小的堆上花費這么長時間的原因可能是什么?

我運行Java 1.6.0_37。

緩慢的完整GC(以及次要的GC)主要是由於硬件設置不佳,其次是軟件配置(即,GC人體工程學),最后是堆中存在的對象數量所致。

查看硬件,您在Solaris上使用什么CPU型號和供應商? 它是具有多個核心的SMP系統嗎? 每個核心是否有多個線程? 您的GC是否利用系統上所有可用的虛擬處理器,即垃圾回收是否分布在多個處理器上?

使完整GC變慢的另一種情況是堆的一部分從主內存中換出了。 在那種情況下,換出的內存頁必須在垃圾回收期間換入,這可能是一個非常耗時的過程。 在這種情況下,您的計算機上沒有安裝足夠的物理內存。

系統上的其他任何應用程序是否會爭奪相同的物理資源,即CPU和內存?

查看GC的人體工程學,您正在使用什么收集器? 我建議使用多個收集器線程的並行吞吐量收集器或G1收集器。 我也建議使用NUMA配置。

一些一般規則:

  • 硬件和GC的人機工程學越好,各個垃圾收集的執行速度就越快。
  • 應用程序創建的對象越少,垃圾收集器運行的頻率就越少。
  • 創建的長期對象越少,完整垃圾收集器運行的頻率就越少。

有關GC人體工學的更多信息, 請訪問http : //www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

暫無
暫無

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

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