PCGen的垃圾收集分析

介紹

我決定結合我的兩個軟件愛好,并在PCGen上進行一些分析, PCGen是一種流行的基于Java的開放源代碼角色生成器,用于角色扮演游戲。 我用Censum ,我們( jClarity的)新的垃圾收集日志分析工具來進行分析。

本文假定您對JVM上的垃圾回收(GC)有所了解。 如果您不熟悉GC,那么建議您加入我們的jClarity朋友計劃 。 我們正在建立有關GC的知識庫,以便與整個Java社區自由共享,我們非常希望您能對此進行驗證!

項目

我正在使用的兩個項目是PCGen(我正在對其進行分析的項目)和Censum(GC分析工具)。

PCGen

PCGen是針對d20角色扮演系統(例如《星球大戰》和《龍與地下城》)的流行角色生成器和維護程序。 這是一個長期運行的項目(> 10年),由一個大型(約750,000 LOC)Java Swing桌面工具組成,該工具具有大量專有格式的數據文件。 免責聲明:我是PCGen的主席。

PCGen是一個數據密集型工具。 為了驅動其規則引擎并滿足響應式UI的要求(具有大量詳細信息),許多此類數據已預先加載并保存在內存中。 用戶過去曾報告以下問題。

  1. 在處理多個字符和/或高級字符時,經常會出現暫停。
  2. 創建高級別角色或創建的角色超過2個時,PCGen就會死亡。 更多精通技術的用戶報告說,他們在pcgen日志文件中看到OutOfMemoryError。

為了減輕PCGen(6.0)最新版本中的這種不良性能,已經做了一些工作,因此我決定使用Censum來確定這些更改是否改善了性能。

森森

Censum是jClarity的新垃圾收集分析工具。 重點是使用功能強大的分析來處理原始日志數據,并為繁忙的開發人員(例如PCGen!的貢獻者)快速提供簡單的英語答案。 免責聲明:我是jClarity的CTO。

Censum是一項對開放源代碼項目免費的新產品,當然,如果您要購買副本,今天就可以獲得免費的評估許可證 (單擊Try Censum )!

TLDR –結論

我們有好消息,一些信息和壞消息。

好消息

積極的消息是,PCGen開頭的默認堆設置(-Xms256m -Xmx512m)現在足夠大小,足以保持PCGen的運行。 即使創建了第5個復雜字符,也沒有OutOfMemoryError。

Censum顯示,一旦運行了完整的GC(通常在創建了每個新字符之后),便會恢復很大一部分堆,并且每個字符占用大約25-50 MB的堆空間。 我們可以粗略地推斷出,起始點(已加載數據)約為125MB,PCGen可以隨時輕松地保持大約10-15個字符打開而不會崩潰。 對于一個總經理來說,這可能還不足以讓他的哥布林部落開始運轉,但是對于大多數常規聚會而言,這當然足夠了!

壞消息

負面消息稍多的是Censum報告,PCGen的暫停時間相對較高,很可能是由于過早晉升而引起的。 提早升級過多會導致我們想要的存儲速度更快地進入舊一代。 這可能會產生連鎖反應,導致收集更多舊的基因組以及完整的GC,自然導致更長的停頓時間。 有關高暫停時間,過早升級以及PCGen可以做什么的更多詳細信息,請參見完整的分析部分。

從這里到哪里?

PCGen可以遵循Censum的“權宜之計”建議,以改變年輕一代空間的大小。 通過使用-XX:NewSize標志并將其設置為?256M,可以緩解高暫停時間的問題。

但是,PCGen的長期解決方案是繼續減少其數據結構(特別是玩家角色的表示)的影響。 實際上,這是PCGen今天正在進行的項目!

技術設置

PCGen通常從具有默認堆設置-Xms256m和-Xmx512m的Shell腳本運行。 對該腳本進行了更改,以提供產生可分析的GC日志所需的最少標志集。 添加到java命令的標志是:

-verbose:gc -Xloggc:pcgen_gc.log -XX:+ PrintGCDetails -XX:+ PrintTenuringDistribution

  • -verbose:gc和-Xloggc:pcgen_gc.log生成基本日志,該日志輸出到名為pcgen_gc.log的文件。
  • -XX:+ PrintGCDetails提供Censum執行分析所需的GC分配信息的絕對最小集。
  • 最后,-XX:+ PrintTenuringDistribution提供有關對象何時從年輕的世代空間(伊甸園,幸存者1和幸存者2)移動到舊世代空間(使用期限)的有用信息。

所有這些選項對正在運行的JVM幾乎沒有影響。 您應該始終在生產中啟用這些功能!

PCGen在運行Mac OS 10.7.5的MBP上與Oracle Java 7u10一起運行,具有8GB RAM,256MB SSD驅動器和超線程雙核2.8Ghz i7處理器。

PCGen活動

PCGen首先加載基本游戲模式和系統文件+基本UI來加載數據源。 下一步是讓用戶選擇要加載的數據源(角色扮演游戲規則集)。 裝有“怪獸”套裝的流行SRD 3.5 (地牢和巨龍3.5e)已加載。

一個角色( Karianna )被逐級創建到第20個巫師中,該巫師具有滿載的咒語,設備和熟悉的貓(在PCGen中實際上是第2個角色)。 此后添加了幾個更復雜的角色,包括大龍藍龍(大量數據!)。

分析

我將介紹最初的數據加載用例,然后介紹常規用法(創建字符)。

資料載入

我很好奇初始數據加載對內存的影響。 盡管使用具有PCGen的SSD驅動器可以縮短加載時間,但毫無疑問,這是項目目標! 這是Censum在GC之后在堆分配方面顯示的內容。

如您所見,數據的初始加載在數據加載結束時導致了許多年輕的世代集合和一個舊的(永久的)GC事件。 堆使用率最高可攀升至約325MB,但在收集垃圾后,堆使用率又降至約100MB。 加載大約15本厚規則書的數據還不錯!

但是,PCGen的數據加載有點像Web /應用程序服務器(例如Tomcat)的啟動期。 就您的GC分析而言,通常最好將其排除在一次性啟動之外,而不是分析正在運行的應用程序。

創建角色

創建Karianna并將她提升到20級需要填寫13個主選項卡的詳細信息?20個子選項卡和大量數據! 還創建了另外4個字符,它們具有相似的復雜性,其中一些友好(貓很熟悉),而有些則不友好(大龍藍龍)。

該過程的一些屏幕截圖如下:

技能專長

設備

嵌入式字符表

Censum的分析

打開日志文件后,Censum立刻將我帶到了“分析摘要”屏幕,該屏幕使我一目了然地了解了PCGen的垃圾回收的進行情況。

好消息

我立即知道:

  1. 我有正確的標志來收集足夠的GC數據以進行分析以使其正常工作
  2. 我的GC吞吐量很好(PCGen花費時間在運行,而不是在進行垃圾收集)
  3. 沒有討厭
    System.gc()調用(通常不是很好的做法)。

信息新聞

內存利用率 (內存泄漏是其中的一個子集)和內存池大小是信息性的,因為日志尚未收集24小時的數據(建議的最小值是查看應用程序一個完整工作日的周期)。

壞消息

PCGen似乎具有高的暫停時間以及過早的升級問題。 讓我們進一步深入探討!

高暫停時間

高暫停時間是由于GC收集器必須暫停應用程序線程才能以安全的方式清理對象引用所致。 收集器必須掃描和清理的對象引用越多,暫停時間就越長! 最長的停頓通常是由完整的GC集合引起的,其中清理了整個Java堆(例如,年輕一代和老一代的空間都變得很滿)。

作為一個用戶,我注意到停頓了兩次,還不足以真正打擾我,但我知道我的硬件非常好,而且這些停頓時間對于其他用戶而言可能會更糟。

正如Censum指出的那樣,暫停所花費的時間的0.15%并不是主要的問題,而是所關心的0.666秒的暫停時間。 但是,我記得最長的暫停時間可能來自PCGen中的初始數據加載。 為了與此相關,Censum提供了一張暫停時間圖。

數據加載是最嚴重的違法行為,但是肯定的是,由于GC已滿,因此對于每個創建的角色,每個角色創建點周圍都有?秒的良好暫停。 在使用PCGen的情況下,再說一秒鐘對我來說并不令人討厭,但是正如Censum所示,完整的GC需要時間,因此PCGen應該減少完整的GC的數量。

在這種情況下,我們知道由于Censum給我們的另一個警告–提早升級,我們可能會得到比我們想要的更多的完整GC。

提早促銷

提早提倡本質上是指應該在年輕一代空間中收集的對象在年齡增長之前就被提升到老一代空間中。 這個“年齡”被稱為任職期限,它基于1980年代進行的軟件研究和JVM的運行時啟發式算法的結合。 由于以下原因,可能會提早升職:

  1. 創造新物體的速度淹沒了年輕一代的空間
  2. 正在創建的對象太大,無法容納年輕的一代空間。 例如大的連續內存塊。

這具有對舊的發電空間施加壓力的效果。 它的填充速度更快,因此會收集更多的舊基因組并最終出現完整的GC,從而導致更頻繁的暫停時間。

當我去看看應該提升對象多長時間以及它們被提升多早時,我立即得到了答案。 “任期摘要”屏幕向我們顯示了“任期閾值”設置為15(對象可以在年輕一代中存活約15個集合,然后自然提升為老一代)。 另請注意,過早地提升了100%的對象!

然后,我去看看何時提升對象。 Censum告訴我,大多數人幾乎是在年輕一代就開始晉升的(Tenuring Threshold為1)。 該值向我表明,到達的對象對于當前的年輕一代而言太大。 但是,我仔細檢查并確保對象分配不是很高,Censum告訴我,對象分配的峰值約為2.5GB / s,這僅是大約? 我的MBP的功能,所以我們可以了。

PCGen采取的步驟

PCGen團隊的下一步將是查看jmap中的直方圖之類的內容,以查看正在創建哪些大對象。 快速檢查jmap輸出意味著我知道我們有String(字符串),char和byte的大型(多MB)連續數組。

此時PCGen的一個選項是調整年輕一代空間的大小,以便使用
-XX:NewRatio或-XX:NewSize標志。 設置這兩個值之一的大小將取決于從jmap用法中發現的結果。 在這種情況下,需要將-XX:NewSize設置為?256M,以減少暫停次數。

但是,通常這不是一個很好的長期解決方案。 PCGen項目最好減少這些大的連續內存分配的使用。 由湯姆·帕克(Tom Parker)和詹姆斯·登普西(James Dempsey)領導,這正是PCGen團隊正在做的事情,將龐大的內存結構從整體式的PlayerCharacter類中提取到了更靈活的較小方面。

摘要

令人驚奇的是,PCGen志愿者為6.0版本付出的辛勤工作為最終用戶帶來了實實在在的紅利!

幾年前,我追蹤了PCGen用戶在加載第25級Kobold Shaman時報告的30秒以上的暫停。 我花了幾天的時間才發現這是一個GC /內存問題,因為我只有原始的GC日志文件(它們是多線程的,不確定的野獸)。 展望未來,我肯定會使用像Censum這樣的工具來更快地解決這些問題,這意味著我可以繼續為PCGen添加新功能!

如果您想解決棘手的GC問題,請不要忘記查看PCGen來滿足d20角色扮演游戲的需求和Censum !

參考:來自我們的JCG合作伙伴 Martijn Verburg 的PCGen垃圾收集分析,網址為Are We There Yet博客。

翻譯自: https://www.javacodegeeks.com/2013/01/garbage-collection-analysis-of-pcgen.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370193.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370193.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370193.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

THINKPHP增刪改查--(改)

1.CURD 控制器?>namespace Home\Controller;use Think\Controller;class CurdController extends Controller{ public function index(){ $db_student D(Student); $data_student $db_student->relation(true)->select();// dump($data_student); $this->assign…

Linux監控CPU關閉服務器,監控Linux服務器CPU和內存

利用腳本獲取Linux服務器的CPU和內存。需要安裝bc計算器yum install -y bc創建執行腳本計算CPU利用率,配置了5秒采樣。執行腳本,5秒后輸出采集日期|CPU負載|可用內存|總內存#!/bin/sh##echo user nice system idle iowait irq softirqCPULOG_1$(cat /pro…

springboot不會運行gc_SpringBoot 和JVM 調優(深度好文,建議收藏)

點擊上方[全棧開發者社區]→右上角[...]→[設為星標?]項目調優作為一名工程師,項目調優這事,是必須得熟練掌握的事情。在SpringBoot項目中,調優主要通過配置文件和配置JVM的參數的方式進行。一、修改配置文件關于修改配置文件 application.p…

移動端原生js,css3實現輪播圖

一、功能需求 1、自動播放2、滑動切換3、點擊切換 二、思路分析 html代碼&#xff1a; <div class"container">   <ul class"list clearfix">   <li class"item fl item5">圖5</li>   <li class"item fl …

關于換行這個動作,win 和 mac 的實現

‘\r是回車&#xff0c;前者使光標到行首&#xff0c;&#xff08;carriage return&#xff09;\n是換行&#xff0c;后者使光標下移一格&#xff0c;&#xff08;line feed&#xff09;\r 是回車&#xff0c;return\n 是換行&#xff0c;newline對于換行這個動作&#xff1a;u…

你好駱駝:自動文件傳輸

Apache Camel在其主頁上 &#xff08;以及Camel用戶指南中 &#xff09;將其描述為“基于已知企業集成模式的通用開源集成框架”。 Camel框架基于《 企業集成模式 》一書&#xff0c;并提供了該書中描述的模式的實現 。 我看一下這篇文章中使用Camel的“ Hello World”類型示例…

Linux 常用命令二 pwd cd

一、pwd命令 顯示整個路徑名&#xff1a; wangwang:~$ pwd /home/wang 二、cd命令 切換到其他路徑&#xff08;相對路徑方式&#xff09;&#xff1a; wangwang:~$ cd workpalce/ wangwang:~/workpalce$ pwd /home/wang/workpalce 切換到其他路徑&#xff08;絕對路徑方式&…

3dobject用什么打開_第一次用開塞露是什么感覺?網友:像打開了新世界的大門

第一次用開塞露是什么感覺&#xff1f;網友:像打開了新世界的大門我媽說我小時候便秘去醫院&#xff0c;醫生給開了支開塞露&#xff0c;然后在醫院的公廁里使用的&#xff0c;我媽的描述是:“要不是我手挪走的快點&#xff0c;就直接噴我手了”。。。。。。。。。。。。。。。…

linux root郵箱地址,linux – 如何將root的電子郵件轉發到外部電子郵件地址?

我家里有一臺小型服務器(Ubuntu 10.04),我想將root的電子郵件轉發到我的gmail托管域,以獲取安全通知,什么不是.我把所有東西都撕掉了,然后從頭開始跑到other issues.我現在有sendmail工作,我可以發郵件到someexternal.com并收到郵件.但是,向/root/.forward添加地址實際上并不轉…

RHEL6.4 xclock安裝小記

http://blog.sina.com.cn/s/blog_623630d50101tc67.html轉載于:https://www.cnblogs.com/Baronboy/p/7077911.html

Java 7中對String.substring的更改

眾所周知&#xff0c;在您生成相同源字符串的許多子字符串的情況下&#xff0c;Java會優化子字符串操作。 它通過使用(value, offset, count)存儲信息的方式來做到這一點。 請參閱以下示例&#xff1a; 在上圖中&#xff0c;您會看到字符串“ Hello”和“ World&#xff01;”…

原生js創建模態框

1.效果圖如下&#xff1a; 2.代碼如下&#xff1a; <!DOCTYPE html><html><head><meta charset"UTF-8"><title>Test</title><style>#pageMask {visibility: hidden; position: absolute;left: 0px; top: 0px;width:…

python查詢oracle數據庫_python針對Oracle常見查詢操作實例分析

本文實例講述了python針對Oracle常見查詢操作。分享給大家供大家參考&#xff0c;具體如下&#xff1a;1.子查詢(難)&#xff1a;當進行查詢的時候&#xff0c;發現需要的數據信息不明確&#xff0c;需要先通過另一個查詢得到&#xff0c;此查詢稱為子查詢&#xff1b;執行順序…

按鈕事件處理(3)

在進行gui編程時&#xff0c;我們最常使用的控件時按鈕&#xff0c;在java中JButton類代表了按鈕。它的類層次結構圖是&#xff1a; java.lang.Object|_ java.awt.Component|_java.awt.Container|_javax.swing.JComponent|_javax.swing.AbstractButton|_javax.swing.JButton我們…

linux下I2C驅動發送IO時序,Linux I2C 驅動閱讀的碰到的一些網上沒有提到的東西

# re: Linux I2C 驅動閱讀的碰到的一些網上沒有提到的東西 回復 更多評論2009-04-11 13:39 by 初學都樓主&#xff0c;你好。我看了你那篇《Linux I2C核心、總線與設備驅動[轉]》&#xff0c;讓我明白了不少&#xff0c;不過我還是有些不明白的地方&#xff0c;想請教一下。我…

Java內存模型和優化

總覽 許多多線程代碼開發人員都熟悉這樣的想法&#xff0c;即不同的線程可以對持有的值有不同的看法&#xff0c;這不是唯一的原因&#xff0c;即如果線程不安全&#xff0c;它可能不會看到更改。 JIT本身可以發揮作用。 為什么不同的線程看到不同的值&#xff1f; 當您有多個…

C_數組詳解

數組&#xff1a; 一 一維數組 1.1 一維數組的定義: 類型符 數組名[常量表達式]; int a[10]; 說明: 1.數組的命名規則遵循標識符命名規則。 2.定義時需要指定元素的個數。方括號里的常量表達式表示元素的個數。 3.常量表達式中不能包含變量&#xff1b;如&#xff1a;int a[n];…

CSS節選——選擇器

CSS&#xff0c;cascading style sheet&#xff0c;層疊樣式表&#xff0c;請留意層疊概念。 css3為了區分偽類和偽元素&#xff0c;偽元素采用雙冒號寫法。 常見偽類——:hover,:link,:active,:target,:not(),:focus。 常見偽元素——::first-letter,::first-line,::before…

python游戲循環設置_Pygame:游戲循環前的初始菜單

我正在制作一個this game的版本&#xff0c;并嘗試將起始菜單設置為&#xff1a;我的計劃是先做surface.fill(overlaycolor)&#xff0c;然后將這個圖像blitting到屏幕上。在一個while循環中。之后&#xff0c;在用戶想玩(另一個問題除外)之后&#xff0c;我們將進入另一個whil…

vue.js基礎知識篇(7):表單校驗詳解

目錄 網盤 第12章:表單校驗 1.npm安裝vue-validator $ npm install vue-validator 代碼示例: var Vuerequire("vue"); var VueValidatorrequire("vue-validator"); Vue.use(VueValidator); 2.直接使用script標簽引入vue.js 要下載vue-validator&#xff0c…