您好,登錄后才能下訂單哦!
Thinking in Java 一書中提到,引用和對象就像瑤控器和電視機。用瑤控器(引用)來操作電視機(對象),想換頻道什么的直接操作瑤控器就可以了,瑤控器再來調控電視機。如果你在房間里面走動,同時還想操作電視換頻道,你只需要攜帶瑤控器就可以了。我覺得這個比較非常好,引用是用來操作對象的,對象是由你來創建的。通常用new關鍵字來創建一個對象。那么這些對象是怎樣存儲的,內存又是怎樣分配的呢?
存儲在什么地方?
1.寄存器(register):由于寄存器是在CPU內部的,所以它的速度最快,但是數量有限,所以由編譯器根據需求進行分配。
2.棧(stack):位于通用RAM中,通過棧指針的移動來分配和釋放內存,指針向下移動分配新的內存;指針向上移動則釋放內存。速度僅次于寄存器。創建程序時,Java編譯器必須知道存儲在棧內所有數據的確切大小和生命周期,因為它必須生成相應的代碼,以便上下移動棧指針,這就限制了程序的靈活性。所以java中的對象并不存放在棧當中,但對象的引用存放在棧中。
3.堆(heap):也是位于RAM中的內存池,用于存放所有的JAVA對象。編譯器不需要知道要從堆里分配多少存儲區域,也不需要知道存儲的數據在堆里面存活多長時間,因此堆要比棧靈活很多。當你new創建一個對象時,編譯器會自動在堆里進行存儲分配。當然,為這種靈活性必須要付出相應的代碼。用堆進行存儲分配比用棧進行存儲存儲需要更多的時間。
4.靜態存儲(static storage):這里的“靜態”是指“在固定的位置”(也在RAM里)。靜態存儲里存放程序運行時一直存在的數據。你可用關鍵字static來標識一個對象的特定元素是靜態的,即存放類中的靜態成員,但JAVA對象本身從來不會存放在靜態存儲空間里。
5. 常量存儲(constant storage):存放字符串常量和基本類型常量(public static final)。常量值通常直接存放在程序代碼內部,它們永遠不會被改變。有時,在嵌入式系統中,常量本身會和其他部分分割離開,所以在這種情況下,可以選擇將其放在ROM中。
簡單描述下垃圾回收機制
垃圾回收回收的是無任何引用的對象占據的內存空間(堆)而不是對象本身,要注意以下3點:
1)對象可能不會被回收,即垃圾回收不一定會執行;
2)垃圾回收并不等于析構;
3)垃圾回收只與內存有關。
引用計數器:一種簡單但是速度很慢的垃圾回收策略。即每個對象都有一個引用計數器,當有引用連接至對象時計數器加1;當引用離開時計數器減1。垃圾回收器會在含有全部對象的列表中遍歷,發現某個對象的引用計數器為0時,就釋放其占用的內存。
優點:引用計數收集器可以很快的執行,交織在程序運行中。對程序不被長時間打斷的實時環境比較有利。
缺點:無法檢測出循環引用。如父對象有一個對子對象的引用,子對象反過來引用父對象。這樣,他們的引用計數永遠不可能為0。
自適應、分代的、停止——復制、標記——清掃 垃圾回收方法:
停止——復制:先暫停程序的運行,然后將所有活的對象從當前堆復制到另一個堆,沒有被復制的都是垃圾。當對象從一個堆復制到另一個堆,它們的排列是一個挨著一個的,所以新堆保持緊湊排列。
標記——清掃:遍歷所有的引用,找出所有活的對象,然后對它們進行標記,這個過程不會回收任何對象,只有全部標記工作完成時才開始清除工作。沒有被標記的對象將會被釋放,不發生任何復制動作,所以剩下的堆空間不是連續的。
創建了幾個對象?
String s="abc"; 創建了幾個對象?
毫無疑問,這里面只創建了一個對象——“abc";
String s1="abc"; String s2=s1;創建了幾個對象?
仍然只有一個對象——“abc";
String s1="abc"; String s2=”abc";創建了幾個對象?
這里仍然只有一個對象——“abc";
String s="abc"+"def";創建了幾個對象?
注意,這里創建了三個對象:“abc"、”def"、“abcdef";
String s=new String("abc");創建了幾個對象?
大家也都知道是兩個對象。實際上是"abc"本身就是文字池中的一個對象,在運行new String()時,把文字池即pool中的字符串"abc"復制到堆中,并把這個對象的應用交給s,所以創建了兩個String對象,一個在pool中,一個在堆中。
String s1=new String("abc");String s2=new String("abc");創建了幾個對象?
三個對象。"abc"是文字池中的一個對象,然后又在堆中用new String()創建了兩個對象。
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。