java內存對象
1. java對象內存分配
應該是i=47;吧
{static int i +47;
static void incr(){
i++;
}
這是靜態代碼塊首先執行 int i=47; 在內存中 在棧里首先創建一個i的引用,然後再看棧里是否有47,沒有的話就將47存放進棧里。然後再將引用指向47.
{}statictest應該寫錯了吧。。statictest st1=new statictest() 應該是兩個步驟。首先在椎里生成一個對象空間,這個對象是個引用.然後再new的時候將在椎里生成對象。
棧你可以理解為先進後出更重要的是java里把它理解為放編譯前就固定的 值。椎則放new出來的對象,也就是編譯時生成的。
2. java 對象的屬性在內存里以什麼形式存在
java對象是引用類型,引用類型的對象的內存分配在堆中。
如果分配在堆中的java對象包含屬性,這可以分兩種情況分析:
1.屬性是基本類型(byte,char,int等)的
則對象的堆內存保存的就是基本類型的值本身。
2.屬性是引用類型的(String是引用類型的)
則對象的堆內存中保存的只是這個屬性的引用,屬性所指向的對象分配在其它堆內存中。
所以,你的理解1是對的,它就是屬性是引用類型時的情況。但理解得不完整,還應包括屬性是基本類型時的情形。
3. 運行時java對象在內存中是什麼樣子的
JAVA對象是在堆中存儲的, 它在內存中的地址被存儲在一個或多個變數當中,類似於C中的指針,通過這些變數來操作對象, 對象理論上是不能獨立存在的,可以有多個變數存有它的地址,但不能沒有變數存它的地址,一旦沒有變數存有它的地址,就沒法對它進行操作, 對於程序運行來說,它就成了內存垃圾,正常情況下會被JAVA垃圾收集器給清除(少數異常情況可能回收不掉)
4. java內存模型的java對象的內存分配
(1) 寄存器(register)。這是最快的保存區域,這是主要由於它位於處理器內部。然而,寄存器的數量十分有限,所以寄存器是需要由編譯器分配的。我們對此沒有直接的控制權,也不可能在自己的程序里找到寄存器存在的任何蹤跡。
(2) 堆棧(stack)。位於通用RAM(隨機訪問存儲器)中。可通過它的「堆棧指針」 獲得處理的直接支持。堆棧指針若向下移,會創建新的內存;若向上移,則會釋放那些內存。這是一種特別快、特別有效的數據保存方式,僅次於寄存器。創建程序時,Java編譯器必須准確地知道堆棧內保存的所有數據的「長度」以及「存在時間」 。這是由於它必須生成相應的代碼,以便向上和向下移動指針。這一限制無疑影響了程序的靈活性,所以盡管有些Java 數據要保存在堆棧里— — 特別是對象句柄(也稱對象的引用),但Java對象並不放到其中。
(3) 堆(heap)。一種通用性的內存池(也在RAM區域),其中保存了Java對象。和堆棧不同的是,「內存堆」或「堆」(Heap )最吸引人的地方在於編譯器不必知道要從堆里分配多少存儲空間,也不必知道存儲的數據要在堆里停留多長的時間。因此,用堆保存數據時會得到更大的靈活性。要求創建一個對象時,只需用new 命令編制相關的代碼即可。執行這些代碼時,會在堆里自動進行數據的保存。當然,為達到這種靈活性,必然會付出一定的代價。在堆里分配存儲空間時會花掉更長的時間!
(4) 靜態存儲(static storage)。這兒的「靜態」(Static)是指「位於固定位置」(盡管也在RAM 里)。程序運行期間,靜態存儲的數據將隨時等候調用。可用static關鍵字指出一個對象的特定元素是靜態的。但Java 對象本身永遠都不會置入靜態存儲空間。
(5) 常數存儲(constant storage)。常數值通常直接置於程序代碼內部。這樣做是安全的,因為它們永遠都不會改變。
(6) 非RAM 存儲(non-storage-RAM)。若數據完全獨立於一個程序之外,則程序不運行時仍可存在,並在程序的控制范圍之外。其中兩個最主要的例子便是「 流式對象」和「固定對象」 。對於流式對象,對象會變成位元組流,通常會發給另一台機器。而對於固定對象,對象保存在磁碟中。即使程序中止運行,它們仍可保持自己的狀態不變。對於這些類型的數據存儲,一個特別有用的技巧就是它們能存在於其他媒體中。一旦需要,甚至能將它們恢復成普通的、基於RAM的對象。Java 1.1提供了對輕量級持久化(Lightweight persistence)的支持。未來的版本甚至可能提供更完整的方案。
5. 一個Java對象到底佔用多大內存
Object o=new Object():
在java中空對象佔八個位元組,對象的引用佔四個位元組。所以上面那條語句所佔的空間是4byte+8byte=12byte.java中的內存是以8的倍數來分配的,所以分配的內存是16byte.
舉個例子:
Class O{
int i;
byte j;
String s;
}
其所佔內存的大小是空對象(8)+int(4)+byte(1)+String引用(4)=17byte,因要是8的整數倍,所以其佔大小為24byte.
當然,如果類里有其他對象的話,也要把其他對象的空間算進去
6. 如何計算Java對象所佔內存的大小
java中可以用.getBytes().length獲取字元串佔用內容的大小,原理是java中任何字元都採用Unicode編碼,所以衡量佔用內存大小採用佔用的位元組數。
舉例如下:
public
class
TestStringSize
{
public
static
final
void
main(String[]
args)
{
System.out.println("佔用內存大小:"+"學java".getBytes().length);
}
}
輸出結果:
佔用內存大小:6
byte
7. Java怎麼直接在內存中讀寫對象
JAVA對象是在堆中存儲的,它在內存中的地址被存儲在一個或多個變數當中,類似於C中的指針,通過這些變數來操作對象,對象理論上是不能獨立存在的,可以有多個變數存有它的地址,但不能沒有變數存它的地址,一旦沒有變數存有它的地址,就沒法對它進行操作,對於程序運行來說,它就成了內存垃圾,正常情況下會被JAVA垃圾收集器給清除(少數異常情況可能回收不掉)
8. 一個Java對象到底佔多大內存
對象頭
對象頭在32位系統上佔用8bytes,64位系統上佔用16bytes。
實例數據
原生類型(primitive type)的內存佔用如下:
Primitive Type Memory Required(bytes)
boolean 1
byte 1
short 2
char 2
int 4
float 4
long 8
double 8
reference類型在32位系統上每個佔用4bytes, 在64位系統上每個佔用8bytes。
對齊填充
HotSpot的對齊方式為8位元組對齊:
(對象頭 + 實例數據 + padding) % 8等於0且0 <= padding < 8
指針壓縮
對象佔用的內存大小收到VM參數UseCompressedOops的影響。
1)對對象頭的影響
開啟(-XX:+UseCompressedOops)對象頭大小為12bytes(64位機器)。
static class A {
int a;
}
9. 一個Java對象會佔多大內存
這要看你的java對象是什麼樣的對象了。比如2個list對象A和B,A里就放一個元素,B里放100個,那麼B所佔的內存就會比A大,而B所包含的元素越多,佔用的內存會越大。直到你的伺服器內存溢出
10. java 能知道一個內存對象是多大嗎
第一問中,integer,Double是可以准確知道大小的
java中int double(包裝類分別是Integer和Double,實際是一樣的)分別佔用的大小是4B 和8B
這里說的B,就是我們通常說的KB中的那個B,全稱是Byte。
1B = 8bit。 所以我們通常會說int是32位,有時候又4位元組
而String他是有char數組組成,一個長度為10的String,佔用的char就是10個,一個char是2B。
所以看String佔多少內存,需要知道String的長度
二問中:答案是可以的
摘自ObjectOutPutStream的API說明
FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(12345);
oos.writeObject("Today");
oos.writeObject(new Date());
oos.close();