自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于Java中內(nèi)存溢出的解決辦法

開(kāi)發(fā) 后端
J2EE應(yīng)用系統(tǒng)是運(yùn)行在J2EE應(yīng)用服務(wù)器上的,而j2ee應(yīng)用服務(wù)器又是運(yùn)行在JVM上的,生成環(huán)境中JVM參數(shù)的優(yōu)化和設(shè)置對(duì)于J2EE應(yīng)用系統(tǒng)性能有著決定性的作用。

J2EE應(yīng)用系統(tǒng)是運(yùn)行在J2EE應(yīng)用服務(wù)器上的,而j2ee應(yīng)用服務(wù)器又是運(yùn)行在JVM上的,生成環(huán)境中JVM參數(shù)的優(yōu)化和設(shè)置對(duì)于J2EE應(yīng)用系統(tǒng)性能有著決定性的作用。要優(yōu)化系統(tǒng),則需要對(duì)JVM參數(shù)進(jìn)行合理的設(shè)置,所以我們需要了解究竟在什么地方進(jìn)行設(shè)置、有哪些參數(shù)以及各參數(shù)的意義分別是什么,并且我們還得了解JVM的內(nèi)存管理機(jī)制究竟是個(gè)什么玩意兒?其實(shí)我們?cè)诰W(wǎng)上搜索引擎上,一搜就有可以獲取到一大把相關(guān)信息,關(guān)鍵是我們?nèi)绾紊钊氲睦斫馑鼈?。那么下面我們就?jiǎn)單的介紹一下究竟什么是JVM的內(nèi)存管理機(jī)制吧~!  

JVM的早期版本并沒(méi)有進(jìn)行分區(qū)管理;這樣的后果是JVM進(jìn)行垃圾回收時(shí),不得不掃描JVM所管理的整片內(nèi)存,所以搜集垃圾是很耗費(fèi)資源的事情,也是早起JAVA程序的性能低下的主要原因。隨著JVM的發(fā)展,JVM引進(jìn)了分區(qū)管理的機(jī)制。

JVM所管理的所有內(nèi)存資源分為2個(gè)大的部分。***存儲(chǔ)區(qū)(Permanent Space) 和堆空間(The Heap Space)。其中對(duì)空間又分為新生區(qū)()和養(yǎng)老區(qū),新生區(qū)又分為伊甸園,幸存者0區(qū)、幸存1區(qū)。如下圖:

 

關(guān)于個(gè)分區(qū)的用途,大家可以參考其他相關(guān)文檔。本教程所要處理的問(wèn)題是如何解決內(nèi)存溢出的問(wèn)題。接下來(lái)以tomcat服務(wù)器為例:

我們首先得找到內(nèi)存管理所要設(shè)置的參數(shù)在哪個(gè)文件:<CATALINA_HOME>/bin/catalina.bat。

需要添加一行代碼:

JAVA_OPTS="-Xms512m-Xmx512m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=256m"

下面分別對(duì)各參數(shù)進(jìn)行介紹和解釋:

JVM 相關(guān)參數(shù):

參數(shù)名參數(shù)說(shuō)明

-server 啟用能夠執(zhí)行優(yōu)化的編譯器, 顯著提高服務(wù)器的性能,但使用能夠執(zhí)行優(yōu)化的編譯器時(shí),服務(wù)器的預(yù)備時(shí)間將會(huì)較長(zhǎng)。生產(chǎn)環(huán)境的服務(wù)器強(qiáng)烈推薦設(shè)置此參數(shù)。

-Xss 單個(gè)線程堆棧大小值;JDK5.0 以后每個(gè)線程堆棧大小為1M,以前每個(gè)線程堆棧大小為256K。在相同物理內(nèi)存下,減小這個(gè)值能生成更多的線程。但是操作系統(tǒng)對(duì)一個(gè)進(jìn)程內(nèi)的線程數(shù)還是有限制的,不能無(wú)限生成,經(jīng)驗(yàn)值在3000~5000左右。

-XX:+UseParNewGC 可用來(lái)設(shè)置年輕代為并發(fā)收集【多CPU】,如果你的服務(wù)器有多個(gè)CPU,你可以開(kāi)啟此參數(shù);開(kāi)啟此參數(shù),多個(gè)CPU 可并發(fā)進(jìn)行垃圾回收,可提高垃圾回收的速度。此參數(shù)和+UseParallelGC,-XX:ParallelGCThreads搭配使用。

+UseParallelGC 選擇垃圾收集器為并行收集器。此配置僅對(duì)年輕代有效。即上述配置下,年輕代使用并發(fā)收集,而年老代仍舊使用串行收集。可提高系統(tǒng)的吞吐量。

-XX:ParallelGCThreads 年輕代并行垃圾收集的前提下(對(duì)并發(fā)也有效果)的線程數(shù),增加并行度,即:同時(shí)多少個(gè)線程一起進(jìn)行垃圾回收。此值***配置與處理器數(shù)目相等。***存儲(chǔ)區(qū)相關(guān)參數(shù):參數(shù)名參數(shù)說(shuō)明

-Xnoclassgc 每次***存儲(chǔ)區(qū)滿了后一般GC 算法在做擴(kuò)展分配內(nèi)存前都會(huì)觸發(fā)一次FULL GC,除非設(shè)置了-Xnoclassgc.

-XX:PermSize 應(yīng)用服務(wù)器啟動(dòng)時(shí),***存儲(chǔ)區(qū)的初始內(nèi)存大

-XX:MaxPermSize 應(yīng)用運(yùn)行中,***存儲(chǔ)區(qū)的極限值。為了不消耗擴(kuò)大JVM ***存儲(chǔ)區(qū)分配的開(kāi)銷,將此參數(shù)和-XX:PermSize這個(gè)兩個(gè)值設(shè)為相等。堆空間相關(guān)參數(shù)參數(shù)名參數(shù)說(shuō)明

-Xms 啟動(dòng)應(yīng)用時(shí),JVM 堆空間的初始大小值。

-Xmx 應(yīng)用運(yùn)行中,JVM 堆空間的極限值。為了不消耗擴(kuò)大JVM 堆控件分配的開(kāi)銷,將此參數(shù)和-Xms 這個(gè)兩個(gè)值設(shè)為相等,考慮到需要開(kāi)線程,講此值設(shè)置為總內(nèi)存的80%.

-Xmn 此參數(shù)硬性規(guī)定堆空間的新生代空間大小,推薦設(shè)為堆空間大小的1/4。

上面所列的JVM 參數(shù)關(guān)系到系統(tǒng)的性能,而其中-XX:PermSize,

-XX:MaxPermSize,-Xms,-Xmx 和-Xmn 這5 個(gè)參數(shù)更是直接關(guān)系到系統(tǒng)的性能,系統(tǒng)是否會(huì)出現(xiàn)內(nèi)存溢出。

-XX:PermSize 和-XX:MaxPermSize 分別設(shè)置應(yīng)用服務(wù)器啟動(dòng)時(shí),***存儲(chǔ)區(qū)的初始大小和極限大小;在生成環(huán)境中強(qiáng)烈推薦將這個(gè)兩個(gè)值設(shè)置為相同的值,以避免分配***存儲(chǔ)區(qū)的開(kāi)銷,具體的值可取系統(tǒng)“疲勞測(cè)試”獲取到的***存儲(chǔ)區(qū)的極限值;如果不進(jìn)行設(shè)置-XX:MaxPermSize 默認(rèn)值為64M,一般來(lái)說(shuō)系統(tǒng)的類定義文件大小都會(huì)超過(guò)這個(gè)默認(rèn)值。

-Xms 和-Xmx 分別是服務(wù)器啟動(dòng)時(shí),堆空間的初始大小和極限值。-Xms的默認(rèn)值是物理內(nèi)存的1/64 但小于1G,-Xmx 的默認(rèn)值是物理內(nèi)存的1/4 但小于1G.在生產(chǎn)環(huán)境中這些默認(rèn)值是肯定不能滿足我們的需要的。也就是你的服務(wù)器有8g 的內(nèi)存,不對(duì)JVM 參數(shù)進(jìn)行設(shè)置優(yōu)化,應(yīng)用服務(wù)器啟動(dòng)時(shí)還是按默認(rèn)值來(lái)分配和約束JVM 對(duì)內(nèi)存資源的使用,不會(huì)充分的利用所有的內(nèi)存資源。

結(jié)論:“***存儲(chǔ)區(qū)溢出(java.lang.OutOfMemoryError:Java Permanent Space)”乃是***存儲(chǔ)區(qū)設(shè)置太小,不能滿足系統(tǒng)需要的大小,此時(shí)只需要調(diào)整-XX:PermSize 和-XX:MaxPermSize 這兩個(gè)參數(shù)即可。“JVM 堆空間溢出(java.lang.OutOfMemoryError: Java heap space)”錯(cuò)誤是JVM 堆空間不足,此時(shí)只需要調(diào)整-Xms 和-Xmx 這兩個(gè)參數(shù)即可。

到此我們知道了,當(dāng)系統(tǒng)出現(xiàn)內(nèi)存溢出時(shí),是哪些參數(shù)設(shè)置不合理需要調(diào)整。但我們?cè)趺粗婪?wù)器啟動(dòng)時(shí),到底JVM 內(nèi)存相關(guān)參數(shù)的值是多少呢?

這個(gè)問(wèn)題其實(shí)Sun公司早已經(jīng)意料到了,所以給我們開(kāi)發(fā)了內(nèi)存使用監(jiān)控工具jvmstat.

大家可以到ORACLE官網(wǎng)進(jìn)行下載。用它可以很方便的看到我們的服務(wù)器內(nèi)存使用情況。

將下載的jvmstat包解壓到如“C:\ProgramFiles\Java\jvmstat”(這是我本地java路徑,大家可以根據(jù)自己所安裝的java環(huán)境的路徑進(jìn)行解壓)。啟動(dòng)完之后我們就可以使用visualgc命令了,cmd進(jìn)入命令符窗口,輸入tasklist(windows下查看進(jìn)程任務(wù)PID)查找到你要檢測(cè)進(jìn)程PID.然后直接輸入visuglgc PID 就會(huì)彈出三個(gè)可見(jiàn)視圖。

如下圖:

 

原文鏈接:http://blog.csdn.net/czp0608/article/details/7352024

【編輯推薦】

  1. Java中的面向?qū)ο筇匦?/a>
  2. 探究Java初始化的過(guò)程
  3. Java集合框架的知識(shí)總結(jié)
  4. Java與F#的并行程序處理對(duì)比
  5. Java并發(fā)編程之同步互斥問(wèn)題
責(zé)任編輯:林師授 來(lái)源: czp0608的博客
相關(guān)推薦

2019-08-29 14:29:42

JVM內(nèi)存 Java

2012-05-29 16:30:33

Tomcat內(nèi)存溢出

2009-08-18 16:45:50

Tomcat內(nèi)存溢出

2009-09-17 14:11:53

2010-04-13 14:54:06

Oracle SQL

2009-09-03 09:08:08

Linuxroot密碼遺忘

2010-01-12 15:36:17

三層路由交換機(jī)

2009-06-16 11:01:14

Java內(nèi)存溢出

2009-06-03 16:41:21

Eclipse亂碼Eclipse

2011-03-04 13:07:47

Filezilla

2021-03-06 10:25:19

內(nèi)存Java代碼

2011-01-19 17:54:48

2009-05-31 09:07:35

Oracle鎖定

2024-09-09 09:41:03

內(nèi)存溢出golang開(kāi)發(fā)者

2023-08-28 10:54:09

容器Docker

2011-06-17 11:10:51

Qt 中文 輸出

2021-02-03 15:12:08

java內(nèi)存溢出

2009-12-07 18:38:16

WCF異常

2010-01-15 09:38:08

磁盤被寫保護(hù)解決辦法

2017-05-04 20:15:51

iOSNSTimer循環(huán)引用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)