您創建了一個了不起的應用程序。 您將其投入生產。 您會發現您沒有足夠的可用內存。 即使您的所有測量結果(可能是借助我們的小型公用事業公司進行的測量 )都表明您應該還不錯。
我們計劃發布一系列博客文章,研究堆消失的位置,并從基礎結構版本開始。 今天的假設–我的應用程序服務器可能會成為消耗我所有寶貴內存的貪婪的混蛋嗎?要找出答案,我們在五臺應用程序服務器上進行了少量測試。
女士們,先生們,讓我們介紹一下參賽者:
- Oracle Weblogic 12.1.1
- 玻璃魚 3.1.1.2
- RedHat JBoss AS 7.1.1
- Apache Tomcat 7.0.30
- 碼頭 8.1.7
您可能會說,我們這里將蘋果與橙子進行比較–通過擁有完整的Java EE配置文件(例如Weblogic,Glassfish和JBoss),與Web容器(如Jetty或Tomcat)競爭。 但是–我們已經看不到看到僅運行servlet的IBM或Oracle部署的情況了,因此我們認為在同一頁面上看到所有提到的通用容器將是一個啟發。
在開始進行測量之前,我們想向Weblogic團隊致以一些個人問候。 用于壓縮沒有根文件夾的歸檔文件。 跟蹤地獄實際上是什么,我發現了一些樂趣。 其次,向JBoss致敬。 我花了10分鐘瀏覽他們的網站來了解要下載什么。 非常感謝IBM 。 他們的WebSphere不能安裝在Mac上。
但是我們并不打算讓這個職位成為出色的續集,“ 一切都打破了,沒有人難過” 。 因此,讓我們繼續比賽吧。 到現在為止,我們所有的容器都已下載并準備參與。 我們進行的測試包括每1000毫秒后啟動所有容器并收集數據。 我們非常喜歡這種競賽的科學方法,而且我們也很懶。 這種結合導致我們使用了內部構建的另一個小實用程序 ,并將所有無聊的工作委托給了stats文件。 使用與JVM本身捆綁在一起的JMX API收集了數據。 收集的數據包含可用于JVM的總內存和未分配的內存大小。
所有容器均以“現成的配置”啟動,除了將統計實用程序添加到服務器啟動腳本之外,我們沒有進行任何其他更改。 唯一的例外是Weblogic,其PermGen空間已調整為絕對精度–當我們附加由兩個java類組成的代理時,最后出現一條錯誤消息,提示您增加PermGen的大小。
在整個測試中,我們沒有在服務器上部署任何東西,也沒有以任何方式使用服務器,包括捆綁的管理員實用程序。 在我們使用kill -9 <pid>殺死所有服務器之前,所有服務器都有90分鐘的運行時間。
用于執行測試的機器是運行OS X Mountain Lion的2010年老式64位Macbook Pro。 測試中使用的JVM是Oracle HotSpot 1.6.0_35。
但是足夠的背景。 結果不言自明:
從圖中可以看出,Tomcat是明顯的贏家,它僅消耗了15.63MB的內存 。 Weblogic要求在圖表的另一端增加兩倍以上的容量,僅為其自身分配33.73MB 。
老實說,我們最驚訝地發現Jetty僅位于第三名。 在測試之前,我們團隊內部進行的首輪下注顯然使Jetty具有最小的內存占用。 但是,沒有,它只有19.66MB ,在Glassfish和JBoss之間僅排名第三,分別消耗了23.26MB和18.89MB 。
總而言之,即使是我們競爭中的明顯失敗者,也很可能不應對您的應用程序的內存問題負責。 當然,除非您使用的內存非常有限。
我們計劃通過排列流行的框架來繼續該系列,以查看在開始在典型的Java EE應用程序中編寫一行代碼之前會損失多少內存。 您想在比賽中看到什么框架? 通過包含@JavaPlumbr的鳴叫讓我們知道。
參考: 誰在竊取您的記憶? Plumbr博客博客上的JCG合作伙伴 Nikita Salnikov Tarnovski提出 的Application Servers Edition 。
翻譯自: https://www.javacodegeeks.com/2012/12/who-is-stealing-your-memory-the-application-servers-edition.html