簡體   English   中英

gc堆分配和我的java程序之間的速率

[英]rate beetween gc heap allocation and my java program

我的應用程序拋出java.lang.OutOfMemoryError: GC overhead limit exceeded錯誤。 我進行了搜索,並獲得了足夠的信息。 甲骨文說:

原因:詳細消息“超出了GC開銷限制”表明垃圾收集器一直在運行,並且Java程序的進度非常緩慢。 進行垃圾回收之后,如果Java進程花費了其大約98%的時間用於垃圾回收,並且正在恢復的內存少於2%,並且到目前為止已經執行了最后5個(編譯時間常數)連續垃圾集合,則引發java.lang.OutOfMemoryError。 通常會拋出此異常,因為活動數據量幾乎無法容納到Java堆中,而新分配的可用空間卻很少。 行動:增加堆大小。 可以通過命令行標志-XX:-UseGCOverheadLimit關閉超出GC開銷限制的java.lang.OutOfMemoryError異常。

我的問題是; 如何跟蹤GC和Java程序分配的堆。 我嘗試了jstat -gcutil但是它沒有足夠的信息。 有沒有一種工具可以查看Java程序堆分配與GC堆分配之間的比率? 感謝您的建議。

請注意,它不是“ java堆”還是“ gc堆分配”,而是專用於實際程序的CPU時間與專用於GC的CPU時間。 當大部分時間都花在垃圾收集器上時,將引發異常。

當分配的堆接近其最大大小(選項-Xmx )並且堆中的大多數對象都可以訪問時,就會發生這種情況。 您的工作是查找最大大小是否太小(可能使用的是默認值),或者是否存在內存泄漏(阻止收集大樹的對象)。

處理此問題時,我更喜歡使用jvisualvm,它是Oracle JDK隨附的,並提供實時圖形信息。

最新的JVM比早期的JVM提供更詳細的信息,但是它們也使用不同的GC算法,這可能會改變觀察到的結果。

暫無
暫無

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

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