虛擬機(jī)分為:系統(tǒng)虛擬機(jī)(比如VMware)、程序虛擬機(jī)(比如Java虛擬機(jī))
1、堆、棧、方法區(qū)
圖中創(chuàng)建user對(duì)象,就是根據(jù)方法區(qū)中的User類信息來創(chuàng)建的。
1)當(dāng)user是成員字段。那么每一個(gè)線程進(jìn)來時(shí),都會(huì)操作同一個(gè)堆中的實(shí)例,所以成員字段對(duì)應(yīng)的實(shí)例是線程共享的。(操作的是同一個(gè)變量引用,引用指向的實(shí)例也是同一個(gè))
2)當(dāng)user是局部變量。那么每一個(gè)線程進(jìn)來時(shí),都會(huì)各自在堆中創(chuàng)建一個(gè)實(shí)例,該實(shí)例由該線程私有,所以局部變量對(duì)應(yīng)的堆中實(shí)例是線程私有的。(操作的是各自的引用,引用指向的也是各自的實(shí)例)
問題:如果一個(gè)成員字段,在方法中使用時(shí),重新賦值了,而不是直接使用。那么該引用或引用指向的堆中實(shí)例是線程安全的嗎?不是。
總結(jié):
多線程環(huán)境下,成員字段的引用只有一個(gè),指向的堆中實(shí)例也只有一個(gè)(不管方法中是否重新賦值)。(所以成員字段線程共享)
局部變量,每個(gè)線程都有自己的引用,指向堆中各自的實(shí)例。(所以局部變量線程安全)

二、辨清java堆

三、Java棧

四、Java方法區(qū)

五、虛擬機(jī)參數(shù)

jvm參數(shù)配置:
(1)-XX 對(duì)于系統(tǒng)級(jí)別的配置(jvm),如配置日志信息,或者配置使用哪種垃圾回收器
(2)非-XX? 基本上都是應(yīng)用層面上的配置。如配置堆、棧、方法區(qū)的內(nèi)存大小(每一個(gè)Java程序都可以分別配置自己要使用的堆棧方法區(qū)的大?。恳粋€(gè)jvm上可以運(yùn)行多個(gè)Java程序)
+ 啟用
- 禁用

main方法運(yùn)行時(shí),run configuration, 添加jvm參數(shù): 設(shè)置當(dāng)前程序的堆內(nèi)存大小,和打印jvm信息
-Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags
更細(xì)粒度的堆內(nèi)存設(shè)置

堆溢出時(shí),導(dǎo)出整個(gè)堆的信息

測試打印堆溢出信息,jvm參數(shù):
-Xms2m -Xmx2m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/Test03.dump
java棧配置

方法區(qū)配置(以前以為方法區(qū)屬于堆的一部分,這么看不是)

直接內(nèi)存配置

jvm不錯(cuò)的博客:
http:www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html