虛擬機分為:系統(tǒng)虛擬機(比如VMware)帚稠、程序虛擬機(比如Java虛擬機)
1、堆卿叽、棧桥胞、方法區(qū)
圖中創(chuàng)建user對象,就是根據(jù)方法區(qū)中的User類信息來創(chuàng)建的考婴。
1)當user是成員字段贩虾。那么每一個線程進來時,都會操作同一個堆中的實例沥阱,所以成員字段對應的實例是線程共享的缎罢。(操作的是同一個變量引用,引用指向的實例也是同一個)
2)當user是局部變量。那么每一個線程進來時策精,都會各自在堆中創(chuàng)建一個實例舰始,該實例由該線程私有,所以局部變量對應的堆中實例是線程私有的咽袜。(操作的是各自的引用丸卷,引用指向的也是各自的實例)
問題:如果一個成員字段,在方法中使用時询刹,重新賦值了及老,而不是直接使用。那么該引用或引用指向的堆中實例是線程安全的嗎范抓?不是骄恶。
總結(jié):
多線程環(huán)境下,成員字段的引用只有一個匕垫,指向的堆中實例也只有一個(不管方法中是否重新賦值)僧鲁。(所以成員字段線程共享)
局部變量,每個線程都有自己的引用象泵,指向堆中各自的實例寞秃。(所以局部變量線程安全)
二、辨清java堆
三偶惠、Java棧
四春寿、Java方法區(qū)
五、虛擬機參數(shù)
jvm參數(shù)配置:
(1)-XX 對于系統(tǒng)級別的配置(jvm)忽孽,如配置日志信息绑改,或者配置使用哪種垃圾回收器
(2)非-XX? 基本上都是應用層面上的配置。如配置堆兄一、棧厘线、方法區(qū)的內(nèi)存大小(每一個Java程序都可以分別配置自己要使用的堆棧方法區(qū)的大谐龈铩)(每一個jvm上可以運行多個Java程序)
+ 啟用
- 禁用
main方法運行時造壮,run configuration, 添加jvm參數(shù): 設(shè)置當前程序的堆內(nèi)存大小,和打印jvm信息
-Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags
更細粒度的堆內(nèi)存設(shè)置
堆溢出時骂束,導出整個堆的信息
測試打印堆溢出信息耳璧,jvm參數(shù):
-Xms2m -Xmx2m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/Test03.dump
java棧配置
方法區(qū)配置(以前以為方法區(qū)屬于堆的一部分旨枯,這么看不是)
直接內(nèi)存配置
jvm不錯的博客:
http:www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html