熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

java虛擬機管理大內存

2013-11-23 18:46:06  來源: Java核心技術 

 眾所周知jvm的內存是受限的一為機器的體系架構二為操作系統本身
xxSPARC的內存映射是不同而各操作系統的內存管理機制也有區別
以下是來自;

Heap設定與垃圾回收Java Heap分為個區YoungOld和PermanentYoung保存剛實例化的對象當該區被填滿時GC會將對象移到Old區Permanent區則負責保存反射對象本文不討論該區JVM的Heap分配可以使用X參數設定
Xms
初始Heap大小
Xmx
java heap最大值
Xmn
young generation的heap大小
JVM有個GC線程第一個線程負責回收Heap的Young區第二個線程在Heap不足時遍歷Heap將Young 區升級為Older區Older區的大小等於Xmx減去Xmn不能將Xms的值設的過大因為第二個線程被迫運行會降低JVM的性能
為什麼一些程序頻繁發生GC?有如下原因
l         程序內調用了Systemgc()或Runtimegc()
l         一些中間件軟件調用自己的GC方法此時需要設置參數禁止這些GC
l         Java的Heap太小一般默認的Heap值都很小
l         頻繁實例化對象Release對象此時盡量保存並重用對象例如使用StringBuffer()和String()
         如果你發現每次GC後Heap的剩余空間會是總空間的%這表示你的Heap處於健康狀態許多Server端的Java程序每次GC後最好能有%的剩余空間經驗之談
.Server端JVM最好將Xms和Xmx設為相同值為了優化GC最好讓Xmn值約等於Xmx的/[]
.一個GUI程序最好是每秒間運行一次GC每次在半秒之內完成[]
注意
.增加Heap的大小雖然會降低GC的頻率但也增加了每次GC的時間並且GC運行時所有的用戶線程將暫停也就是GC期間Java應用程序不做任何工作
.Heap大小並不決定進程的內存使用量進程的內存使用量要大於Xmx定義的值因為Java為其他任務分配內存例如每個線程的Stack等
.Stack的設定
每個線程都有他自己的Stack
Xss
每個線程的Stack大小
Stack的大小限制著線程的數量如果Stack過大就好導致內存溢漏Xss參數決定Stack大小例如XssK如果Stack太小也會導致Stack溢漏
.硬件環境
硬件環境也影響GC的效率例如機器的種類內存swap空間和CPU的數量
如果你的程序需要頻繁創建很多transient對象會導致JVM頻繁GC這種情況你可以增加機器的內存來減少Swap空間的使用[]
種GC
第一種為單線程GC也是默認的GC該GC適用於單CPU機器
第二種為Throughput GC是多線程的GC適用於多CPU使用大量線程的程序第二種GC與第一種GC相似不同在於GC在收集Young區是多線程的但在Old區和第一種一樣仍然采用單線程XX:+UseParallelGC參數啟動該GC
第三種為Concurrent Low Pause GC類似於第一種適用於多CPU並要求縮短因GC造成程序停滯的時間這種GC可以在Old區的回收同時運行應用程序XX:+UseConcMarkSweepGC參數啟動該GC
第四種為Incremental Low Pause GC適用於要求縮短因GC造成程序停滯的時間這種GC可以在Young區回收的同時回收一部分Old區對象Xincgc參數啟動該GC

From:http://tw.wingwit.com/Article/program/Java/hx/201311/25698.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.