奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

java語言

java內存的詳細介紹

時間:2025-03-29 08:52:58 java語言 我要投稿
  • 相關推薦

java內存的詳細介紹

  java內存的詳細介紹

  Java 中的堆和棧 Java把內存劃分成兩種:一種是棧內存,一種是堆內存。

  在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配。當在一段代碼塊中定義一個變量時,java就在棧中為這個變量分配內存空間,當超過變量的作用域后,java會自動釋放掉為該變量分配的內存空間,該內存空間可以立刻被另作他用。

  堆內存用于存放由new創建的對象和數組。在堆中分配的內存,由java虛擬機自動垃圾回收器來管理。在堆中產生了一個數組或者對象后,還可以在棧中定義一個特殊的變量,這個變量的取值等于數組或者對象在堆內存中的首地址,在棧中的這個特殊的變量就變成了數組或者對象的引用變量,以后就可以在程序中使用棧內存中的引用變量來訪問堆中的數組或者對象,引用變量相當于為數組或者對象起的一個別名,或者代號。

  引用變量是普通變量,定義時在棧中分配內存,引用變量在程序運行到作用域外釋放。而數組&對象本身在堆中分配,即使程序運行到使用new產生數組和對象的語句所在地代碼塊之外,數組和對象本身占用的堆內存也不會被釋放,數組和對象在沒有引用變量指向它的時候,才變成垃圾,不能再被使用,但是仍然占著內存,在隨后的一個不確定的時間被垃圾回收器釋放掉。這個也是java比較占內存的主要原因,實際上,棧中的變量指向堆內存中的變量,這就是 Java 中的指針!

  Java 中的堆和棧

  Java把內存劃分成兩種:一種是棧內存,一種是堆內存。

  1.棧(stack)與堆(heap)都是Java用來在Ram中存放數據的地方。與C++不同,Java自動管理棧和堆,程序員不能直接地設置;蚨。

  2. 棧的優勢是,存取速度比堆要快,僅次于直接位于CPU中的寄存器。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。另外,棧數據可以共享。堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由于要在運行時動態分配內存,存取速度較慢。

  3. Java中的數據類型有兩種。

  一種是基本類型(primitive types), 共有8種,即int, short, long, byte, float, double, boolean, 注意,

  并沒有string的基本類型)。這種類型的定義是通過諸如int a = 3; long b = 255L;的形式來定義的,稱為自動變量。值得注意的是, 自動變量存的`是字面值,不是類的實例,即不是類的引用,這里并沒有類的存在。如int a = 3; 這里的a是一個指向int類型的引用,

  指向3這個字面值。這些字面值的數據,由于大小可知,生存期可知(這些字面值固定定義在某個程序塊里面,程序塊退出后,字段值就消失了),

  出于追求速度的原因,就存在于棧中。

  另外,棧有一個很重要的特殊性,就是存在棧中的數據可以共享。假設我們同時定義:

  int a = 3;

  int b = 3;

  編譯器先處理int a = 3;首先它會在棧中創建一個變量為a的引用,然后查找有沒有字面值為3的地址,沒找到,就開辟一個存放3這個 字面值的地址,然后將a指向3的地址。接著處理int b = 3;在創建完b的引用變量后,由于在棧中已經有3這個字面值,便將b直接指向3的地址 。這樣,就出現了a與b同時均指向3的情況。

  特別注意的是,這種字面值的引用與類對象的引用不同。假定兩個類對象的引用同時指向一個對象,如果一個對象引用變量修改了這個 對象的內部狀態,那么另一個對象引用變量也即刻反映出這個變化。相反,通過字面值的引用來修改其值,不會導致另一個指向此字面值的 引用的值也跟著改變的情況。如上例,我們定義完a與b的值后,再令a=4;那么,b不會等于4,還是等于3。在編譯器內部,遇到a=4;時,它 就會重新搜索棧中是否有4的字面值,如果沒有,重新開辟地址存放4的值;如果已經有了,則直接將a指向這個地址。因此a值的改變不會影 響到b的值。

  另一種是包裝類數據,如Integer, String, Double等將相應的基本數據類型包裝起來的類。這些類數據全部存在于堆中,Java用new() 語句來顯示地告訴編譯器,在運行時才根據需要動態創建,因此比較靈活,但缺點是要占用更多的時間。

  在JAVA中,有不同的地方可以存儲數據:

  1. 寄存器(register)。這是最快的存儲區,因為它位于不同于其他存儲區的地方——處理器內部。但是寄存器的數量極其有限,所以 寄存器由編譯器根據需求進行分配。你不能直接控制,也不能在程序中感覺到寄存器存在的任何跡象。

  2. 堆棧(stack)。位于通用RAM中,但通過它的“堆棧指針”可以從處理器哪里獲得支持。堆棧指針若向下移動,則分配新的內存;若 向上移動,則釋放那些內存。這是一種快速有效的分配存儲方法,僅次于寄存器。創建程序時候,JAVA編譯器必須知道存儲在堆棧內所 有數據的確切大小和生命周期,因為它必須生成相應的代碼,以便上下移動堆棧指針。這一約束限制了程序的靈活性,所以雖然某些JA VA數據存儲在堆棧中——特別是對象引用,但是JAVA對象不存儲其中。

  3. 堆(heap)。一種通用性的內存池(也存在于RAM中),用于存放所以的JAVA對象。堆不同于堆棧的好處是:編譯器不需要知道要從堆 里分配多少存儲區域,也不必知道存儲的數據在堆里存活多長時間。因此,在堆里分配存儲有很大的靈活性。當你需要創建一個對象的時候 ,只需要new寫一行簡單的代碼,當執行這行代碼時,會自動在堆里進行存儲分配。當然,為這種靈活性必須要付出相應的代碼。用堆進行 存儲分配比用堆棧進行存儲存儲需要更多的時間。

  4. 靜態存儲(static storage)。這里的“靜態”是指“在固定的位置”。靜態存儲里存放程序運行時一直存在的數據。你可用關鍵字static 來標識一個對象的特定元素是靜態的,但JAVA對象本身從來不會存放在靜態存儲空間里。

  5. 常量存儲(constant storage)。常量值通常直接存放在程序代碼內部,這樣做是安全的,因為它們永遠不會被改變。有時,在嵌入 式系統中,常量本身會和其他部分分割離開,所以在這種情況下,可以選擇將其放在ROM中

【java內存的詳細介紹】相關文章:

JAVA對象創造及內存布局介紹02-26

Java內存回收07-17

Java的內存模型03-03

java中JVM虛擬機內存模型詳細說明01-17

Java內存是如何劃分的03-30

Java內存回收相關知識05-09

Java內存區域的使用詳解02-11

有關JAVA和JAVAC命令詳細介紹03-11

Java線程編程中的主線程詳細介紹01-31

主站蜘蛛池模板: 涿鹿县| 清徐县| 武宣县| 慈利县| 旌德县| 延吉市| 西乌珠穆沁旗| 象山县| 新闻| 梁河县| 始兴县| 本溪| 南投市| 政和县| 富蕴县| 安溪县| 绥化市| 新乡县| 南江县| 宜良县| 内江市| 龙川县| 平阴县| 太和县| 尚志市| 洛浦县| 宁陕县| 泸定县| 华容县| 龙南县| 罗源县| 秦皇岛市| 东乌珠穆沁旗| 洞头县| 隆林| 大方县| 蓝山县| 庐江县| 屏东县| 青岛市| 临夏县|