對象存儲布局
A. 類和對象的內存分配關系如何
一個類的每個對象的數據成員有自己的內存
一個類的所有對象合用成員函數的內存
具體的細節,你可以去看一本書《深度探索c++對象模型》,網上也有電子版
B. 對象和內存溢出怎麼處理
1. 對象。
A.創建。首先檢查指令的參數能不能在常量區找到類的符號引用,並檢查這個類是否載入、解析和初始化過,如果沒有就執行類的載入過程。其次是內存分配,類載入之後就知道要分配的內存大小,分配方法有兩種,一種是指針碰撞,就是一塊內存是使用過的,一塊是未使用的,用一個指針分割,新分配的內存指針就向空閑的挪動,compact功能的虛擬機是用指針碰撞;另一種是空閑列表,就是一個列表記錄空閑的內存塊,不斷更新列表,新分配的內存在列表中尋找一個合適大小的內存塊,sweep功能的虛擬機是使用空閑列表。第三,在分配內存空間的時候,還要考慮並發性。有兩個方法,一種是同步處理,如採用CAS和失敗重試的方法;另外一種是把內存分配動作按照線程劃分在不同的空間之中,每個線程在堆中預先分配一小塊內存,本地線程分配緩沖TLAB,那個線程需要分配內存在那個TLAB上分配,只有TLAB用完了,才要同步鎖定,重新分配。第四、對對象進行必要設置,比方說對象屬於那個類,如何找到類的元數據信息和對象hashcode以及對象GC分代年齡等。
B.對象的內存布局。分為對象頭、實例數據和對齊填充。對象頭包括兩部分,第一部分是存儲對象自身信息,如hashcode,GC分代年齡,鎖狀態等;第二部分是類型指針,對象指向它的類的元數據的指針,虛擬機通過這個指針確定這是那個類的實例。
C.對象訪問定位。兩種方式,一種是句柄訪問,句柄池有訪問對象實例數據的指針和訪問對象數據類型的指針。這個訪問最大好處是reference是穩定的句柄池地址,對象改變都是改變句柄池裡面的指針,而reference本身不動。另外一種就是直接指針,它有到對象類型數據的指針和實例數據。這個訪問的好處是速度更快,節省了一次指針定位的開銷。
2. 內存溢出OOM。
A.堆溢出。堆存放的是對象實例,只要不斷創建對象,並且保證GC Root到對象有可大路徑避免被垃圾回收清除掉對象,那麼對象數量達到最大堆容量限制就會OOM。用內存映象分析工具,Eclipse Memory Analyzer分析一下。
B.虛擬機棧和本地方法棧溢出。分為兩種,一種是如果線程請求的棧深度大於虛擬機所允許的最大深度,拋出StackOverFlowError異常;另一種是如果虛擬機在擴展棧時無法申請到足夠內存空間,拋出OutOfMemoryError異常。可以減小最大堆和棧容量來獲取更多的線程數量。
C.方法區和常量池溢出。會有額外提示 PermGen space。
D.本機直接內存溢出。這個Heap Dump文件看不到內存佔用,但是如果有直接或簡介使用了NIO,那有可能就是本機直接內存溢出了。
C. 翻譯一段計算機關於對象存儲英文
對象存儲是基於數據對象,對包括數據屬性和元數據在內的用戶數據進行封裝的儲存。使對象存儲數據,屬性和元數據相結合,確定數據布局或每一個對象的基礎上的服務質量,提高靈活性和可管理性。
D. 面向對象在運行時內存空間是如何組織的
子程序 的局部數據 放在當前 運行棧的棧頂 用變址寄存器 編制定址 把全局數據放在靜態區
以上說法在C++中依然正確。類里的變數,函數放到一起,就像一個模塊一樣。具體對象的內存布局,可以看 侯捷 翻譯的《深入C++對象模型》,這里有詳細介紹。
其他面向對象語言的實現就不清楚了。
E. 對象所佔用的內存,是否包括這個類裡面所有方法的代碼
1)類裡面的方法,僅僅佔用類本身的代碼區內存,不會存在於對象內存之中
2)那麼A和B各new出100個對象出來,所消耗的內存是一樣多嗎
與JVM實現相關。以SUN的JVM來說,一個對象的內存布局是:第一部分:是一個指針,指向該對象所擁有的方法的列表。第二部分:一個指針,指向一個代表該對象類型的一個Class對象,第三部分:該對象的數據成員空間。
F. 請問C++中怎麼計算對象佔用的內存啊
一個基本概念:類只是一個數據結構的定義,類的成員變數根本就不佔用內存空間(static成員例外,static成員放在靜態數據段中)
如果對象本身是堆棧(ss)里的,那麼它的(非靜態)數據成員也在堆棧里
如果對象本身是堆里的,那麼它的(非靜態)數據成員也在堆里
如果對象本身是ds里的,那麼它的數據成員也在ds里
如果僅考慮數據成員,c++的對象與c的結構類型變數沒什麼區別
所謂public/private/protected規定的是成員的「存取」許可權
而ss/ds/heap是「存儲」方式,與前者沒有任何關系
G. linux下有沒有可以查看類對象的內存布局的
這個要用調試器來查看吧,調試器能夠查看當前調試程序的內存空間,在調試器中定位到一個內存地址,再結合實際代碼就可以查看內存布局,當然,類對象的內存空間也一目瞭然,查看函數的調用棧都是可以的。
H. 如何使用VS2008命令行選項查看對象的內存布局
這些都是標准命令行命令了
cd
命令是改變當前路徑,但是它不會改變當前盤符,改變盤符要輸入
[盤符]:
命令。
如下:
setting
environment
for
using
microsoft
visual
studio
2010
x86
tools.
d:\program
files\microsoft
visual
studio
10.0\vc>cd
c:\windows\system32
d:\program
files\microsoft
visual
studio
10.0\vc>c:
c:\windows\system32>
I. java面向對象中如何分析內存布局,求高手解答
java語言不能操作內存的。。