記憶體布局分3個部分:
1.物件頭
第一部分是物件自身執行資料mark word(hashcode、gc分代年齡、鎖狀態)。這是乙個非固定資料結構,以便在極小的空間儲存盡量多的資訊。
另一部分是型別指標class metadata adress,指向類的元資料,確定型別。
如果是陣列還有乙個array length記錄陣列長度。
2.例項資料
儲存真正資訊,即**中定義的各種型別的字段,包括繼承來的父類屬性。
3.對齊填充
hotspot要求物件的起始位址必須是8位元組的倍數,所以每個物件如果不滿足,則要填充。猜測這樣還是為了滿足cpu cache line。充分利用cpu快取。
物件訪問
採用直接引用,變數在棧中直接儲存物件的堆記憶體位址。優點是快,類似c語言。缺點是隨著gc的記憶體移動,要更改物件的記憶體位址。
物件訪問建立流程
執行類載入,初始化類變數資訊
分配記憶體區域
初始化變數初始值
初始化物件頭資訊
執行構造器
記憶體分配
使用帶記憶體整理功能的gc時
分配多大記憶體即移動記憶體指標與分配大小相同的距離
使用不帶記憶體整理的gc時
kvm維護乙個記憶體快列表,分配記憶體時找出一塊足夠大的記憶體區域進行分配。無法找到時觸發gc。
記憶體分配的併發問題
採用cas重試保證記憶體分配操作的原子性
在堆中為每個執行緒分配一小塊記憶體,記憶體先在tlab上分配,分配不足時再從堆中分配新的tlab,才需要cas。經測試效能快一倍。
指令重拍問題
cpu充分利用多核能力,會將沒有依賴關係的**亂序執行。執行完成後再進行重組,保證順序和一致性
在new物件時,初始化物件和設定引用指向的記憶體位址會發生指令重排序。所以多執行緒時再物件初始化之前執行了變數訪問物件會出現問題。
解決方法是加上volitile ,他會給變數加上lock鎖。來禁用指令重排。
virtualbox虛擬機器 虛擬機器的網路
今天要測試ip多宿主 ip multihoming 即host和guest的兩個網絡卡分別接,host ping guest的ipv6不通。解決過程如下 命令輸出 ip addr 1 lo mtu 65536 qdisc noqueue state unknown link loopback 00 ...
debian虛擬機器安裝kvm虛擬機器
一 概念介紹 1 libvirt是linux上的虛擬化庫,是長期穩定的c語言api,支援kvm qemu xen lxc等主流虛擬化方案。virsh是libvirt對應的shell命令。2 kvm,即kernel basedvirtual machine的簡稱,是乙個開源的系統虛擬化模組,自linu...
安裝虛擬機器二 安裝虛擬機器
安裝軟體 vmware 10 centos 6.5 x86 64 minimal.iso 安裝步驟 第一步 第二步 安裝首介面 選擇第乙個 第三步 跳過磁碟掃瞄 第四步 點選 next 第五步 語言選擇english 第六步 設定鍵盤型別 第七步 儲存設定 第八步 清空虛擬磁碟 第九步 設定主機名 ...