Java对象在Java虚拟机的创建过程
創(chuàng)建
1、相應(yīng)類加載檢查過程
Java程序中的“new”操作會轉(zhuǎn)換為Class文件中方法的“new”字節(jié)碼指令。
JVM(本文特指HotSpot)遇到new指令時,先檢查指令參數(shù)是否能在常量池中定位到一個類的符號引用:
A)、如果能定位到,檢查這個符號引用代表的類是否已被加載、解析和初始化過;
B)、如果不能定位到,或沒有檢查到,就先執(zhí)行相應(yīng)的類加載過程;
2.分配內(nèi)存
分配內(nèi)存有兩種方法。內(nèi)存大小在類加載時候已被確定。
a)指針碰撞:內(nèi)存分配事規(guī)整的,在內(nèi)存中,一邊是分配過的,一邊是沒有分配過的,中間是區(qū)分它們的指針,只需要這個指針向空閑空間那邊移動一段和對象大小相等的距離即可
b)空閑列表:內(nèi)存分配是不規(guī)整的,空閑片段和已分配片段交織一起,這是后,虛擬機需要維護一張空閑列表,每次對內(nèi)存的操作就是對表的修改操作。
3.線程安全問題
對象分配內(nèi)存在虛擬機是很常見的操作,所以在并發(fā)的情況下有可能出現(xiàn) “線程A給某個對象分配內(nèi)存移動指針,還沒來的及移動指針,線程B就使用了該指針” 的問題。處理方法也是有兩種。
a)同步處理:CAS加失敗重試的方式,這樣會影響到性能。
b)直接為每個線程分配一段固定大小的緩存。
4.初始化
分配完內(nèi)存之后,虛擬機會把分配到的內(nèi)存空間都會初始化為零值,保證了實例字段不被初始化就能使用,只是實例字段都是零值。
5.執(zhí)行對象實例方法
對象執(zhí)行了方法,按照程序員的想法初始化之后,一個真正可用的對象就產(chǎn)生了。
通常,經(jīng)過上面5步對象才完全new出來。
總結(jié)
以上是生活随笔為你收集整理的Java对象在Java虚拟机的创建过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA虚拟机运行数据区
- 下一篇: JavaJDK中的命令行工具