1. <i id="s6b2k"><small id="s6b2k"></small></i>
    <b id="s6b2k"><bdo id="s6b2k"></bdo></b>
  2. <wbr id="s6b2k"></wbr>

    淺談Tomcat內存配置的正確姿勢_Tomcat

    來源:腳本之家  責任編輯:小易  

    1.背景

    雖然閱讀了各大牛的博客或文章,但并沒有找到特別全面的關于JVM內存分配方法的文章,很多都是復制黏貼

    為了嚴謹,本文特別備注只介紹基于HotSpot VM虛擬機,并且基于JDK1.7的內存分配情況,有關GC的說法也是基于CMS的concurrent collection(而非G1),防止大牛拍磚.

    目前主流的JVM就是HotSpot VM(其次還有J9 VM,Zing VM),目前各類博客文章也大多基于JDK1.7以前的版本進行闡述的.

    (注:因為不同的虛擬機實現,不同的JDK,內存的分布都不一樣,也就是說下面文章中提到的內存結構都只是邏輯結構,并不是內存的物理結構)

    本文只介紹內存分配的方法,有關于具體的垃圾回收機制,內存結構的原理不作為本文重點,也希望通過本文讓大家對JVM有一點點的認知,小編對JVM理解并不透徹,不想誤人子弟。

    2.內存總體結構

    如果只是為了解決問題,不想了解其中緣由的請跳過本章節

    本文介紹的是垃圾回收的內存區域的結構(簡稱GC堆,不包括程序計數器,棧,本地方法棧),引用一個大牛的說法《一個java對象的這一輩子》

    我是一個普通的Java對象,我出生在Eden區,在Eden區我還看到和我長的很像的小兄弟(其他java對象),我們在Eden區中玩了挺長時間。有一天Eden區中的人實在是太多了(會觸發Young GC,每次GC加一歲)),我就被迫去了Survivor區的“From”區,自從去了Survivor區,我就開始漂了,有時候在Survivor的“From”區,有時候在Survivor的“To”區,居無定所(每次Young GC都需要Survivor區中的from區和to區"對調")。直到我18歲的時候(進行了18次Young GC),爸爸說我成人了,該去社會上闖闖了。于是我就去了年老代那邊,年老代里,人很多,并且年齡都挺大的,我在這里也認識了很多人。在年老代里,我生活了20年,然后被回收(Old GC)。

    解釋一下,首先內存總體分為年輕代(young),老年代(old),永久代(permanent),如下圖

    年輕代:(針對年輕代的垃圾回收我們簡稱Young GC)

    年輕代分為eden區,survivor區

    1.eden區,是new Object(),對象誕生的地方

    2.survivor區是經過垃圾回收后的仍存活的對象存儲區域,survivor區中又分為from區和to區

    2.1.from區: 經過GC回收,eden區和to區仍存活的對象會存放在from區

    2.2.to區: 經過GC回收,eden區和from區仍存活的對象會轉移到to區

    2.3.正因為2.1和2.2的操作,所以from區和to區中的存活對象來回轉移,并且始終有一個區是空的

    老年代:(針對老年代的垃圾回收簡稱Old GC)

    經過18次Young GC后年輕代中仍存活的對象,會從年輕代中轉移到老年代

    老年代滿了之后,會觸發Old GC,仍存活的對象繼續保留在老年代中,直到經過20次Old GC進行回收

    永久代:(針對年輕代+老年代+永久代的回收簡稱Full GC)

    是HotSpot VM針對Java方法區的一個實現,通常存儲類信息、常量池、靜態變量、JIT編譯后的代碼等數據(簡單理解成編譯代碼的存儲區域,即可以理解成:我們的java項目運行時,加載的類文件越多,則需要的永久代內存空間越大)

    (注:據說永久代是Hotspot虛擬機特有的概念,別的JVM都沒有這個東西,在Java 8中,永久代被徹底移除,取而代之的是另一塊與堆不相連的本地內存——元空間)

    3.通常內存問題解釋

    常見問題一 java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出

    原因:項目運行階段,new的對象過多,撐滿了配置的最大內存,會出現該錯誤

    解決方法:手動設置Xms ,Xmx 的大小.

    常見問題二 java.lang.OutOfMemoryError: PermGen space ----PermGen space (永久代) 溢出

    原因:開發的項目Java文件比較多的時候,會出現該錯誤(即項目很大,被JVM加載的文件很多)

    解決方法:手動設置MaxPermSize大小.

    常見問題三 java.lang.StackOverflowError ---- 棧溢出

    原因:通常都是某個代碼邏輯遞歸層次太多導致的,

    解決方法:修改遞歸代碼,控制遞歸層數

    4.內存分配方法(建議,非藥到病除)

    本文只介紹常用的一些配置參數,通常情況下永久代不算堆內存(單獨占用另一塊內存),新生代占年老代的1/2,即占整個堆內存的1/3,按照這個原則我們給出一個配置例子。

    比如服務器可以提供1G的內存以供項目使用,依據上圖我們給出如下配置。

    運行模式:

    -server 服務器模式,多CPU時,性能更佳

    新生代與老年代:(通常不單獨配置新生代與老年代,所以直接配置整個內存堆大小即可)

    -Xms384m 內存堆初始的內存空間

    -Xmx768m 內存堆最大內存空間

    永久代:(新生代,老年代配置剩余的內存留給永久代)---注意jdk1.8已移除

    -XX:PermSize=128m 永久代初始化大小

    -XX:MaxPermSize=256m 永久代最大的內存空間(默認為64m)

    4.不同環境下的Tomcat內存配置方法

    前面已經進行各類內存問題的詳解以及配置參數的簡要介紹,下面我們介紹一下各種環境下的具體配置方法.

    1. 使用命令行啟動的tomcat:

    修改TOMCAT_HOME/bin/catalina.sh(windows中是catalina.bat), 在文件上方添加如下語句

    JAVA_OPTS="-server -Xms384m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m"

    2.如果tomcat注冊成了windows服務,使用tomcat目錄中的/bin/tomcat8w.exe修改就可以了.如下圖

    3.如果是使用myeclipse開發中,啟動tomcat,上述的修改就不起作用了,可進行如下設置:

    Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK面板中的Optional Java VM arguments中添加如下內容:

    -server -Xms384m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m

    最后說兩句:

    不管配置什么,以及配置的參數值是多少,都需要根據實際項目不斷的調試,不要輕易放棄.

    比如tomcat的內存配置,也不是越大越好,適合項目/適合服務器配置才是最好的

    到此這篇關于淺談Tomcat內存配置的正確姿勢的文章就介紹到這了,更多相關Tomcat內存配置內容請搜索真格學網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持真格學網!

    您可能感興趣的文章:Docker tomcat的設置內存大小配置方式windows java.exe內存暴漲解決、idea跑java\ tomcat內存無限增長Spring關閉Tomcat Servlet容器時內存泄漏問題解決方案tomcat內存溢出問題解決經歷優化Tomcat配置(內存、并發、緩存等方面)方法詳解有關tomcat內存溢出的完美解決方法TOMCAT內存溢出及大小調整的實現方法Tomcat內存溢出分析及解決方法

  3. 本文相關:
  4. tomcat+mysql高并發配置優化講解
  5. linux 中tomcat遠程調試代碼的實現方法
  6. tomcat中的session與cookie深入講解
  7. 如何設置tomcat的默認端口(圖文)
  8. servlet和tomcat_動力節點java學院整理
  9. 解決tomcat重新部署后圖片等資源被自動刪除的問題
  10. eclipse添加新server時無法選擇tomcat7的解決方法
  11. tomcat使用線程池處理遠程并發請求的方法
  12. 關于 tomcat進程意外退出的問題解析
  13. 詳解如何通過tomcat的managerservlet遠程部署項目
  14. 關于tomcat內存設置
  15. 當tomcat注冊為windows服務時候,怎樣配置tomcat的...
  16. Tomcat 內存配置問題
  17. tomcat怎么配置內存perm size
  18. 如何加大tomcat的內存及加大TOMCAT的連接數
  19. 如何配置Tomcat的JVM虛擬機內存大小
  20. 請問TOMCAT默認內存是多大,16G物理內存應該給TOMC...
  21. 如何設置Tomcat的JVM虛擬機內存大小
  22. 配置tomcat最大內存設置是多少
  23. 為什么tomcat實際使用內存會超過Xmx設置
  24. 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全星外虛擬主機華眾虛擬主機linuxwin服務器ftp服務器dns服務器tomcat nginxzabbix云和虛擬化服務器其它首頁服務器docker tomcat的設置內存大小配置方式windows java.exe內存暴漲解決、idea跑java\ tomcat內存無限增長spring關閉tomcat servlet容器時內存泄漏問題解決方案tomcat內存溢出問題解決經歷優化tomcat配置(內存、并發、緩存等方面)方法詳解有關tomcat內存溢出的完美解決方法tomcat內存溢出及大小調整的實現方法tomcat內存溢出分析及解決方法tomcat+mysql高并發配置優化講解linux 中tomcat遠程調試代碼的實現方法tomcat中的session與cookie深入講解servlet和tomcat_動力節點java學院整理解決tomcat重新部署后圖片等資源被自動刪除的問題eclipse添加新server時無法選擇tomcat7的解決方法tomcat使用線程池處理遠程并發請求的方法關于 tomcat進程意外退出的問題解析詳解如何通過tomcat的managerservlet遠程部署項目tomcat7.0安裝配置詳細(圖文)直接雙擊啟動tomcat中的startup.tomcat中更改網站根目錄和默認頁在tomcat中部署web項目的操作方法如何修改tomcat默認端口號8080的關于tomcat的server.xml里host節tomcat環境變量詳細配置步驟tomcat啟動報錯:java.util.zip.tomcat啟動startup.bat一閃而過問啟動tomcat時 錯誤: 代理拋出異常tomcat antiresourcelocking antijarlock關于給tomcat設置maxpostsize的問題及注意idea打包成war包部署到tomcat及訪問路徑問同一臺服務器(電腦)運行多個tomcat的設置解決eclipse最新版無法使用tomcat插件問題修改tomcat運行時jvm編碼問題tomcat實現熱部署詳解java的環境變量和tomcat服務器配置啟動tomcat時 錯誤: 代理拋出異常 : java解決idea的tomcat啟動報多個listener的錯
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.yu113.com All Rights Reserved
    战天txt全集下载