特黄特色三级在线观看免费,看黄色片子免费,色综合久,欧美在线视频看看,高潮胡言乱语对白刺激国产,伊人网成人,中文字幕亚洲一碰就硬老熟妇

學習啦>生活課堂>生活小常識>

java堆與棧的區(qū)別

時間: 志峰887 分享

  java堆與棧相信很多人都會混淆,那么應該怎樣去區(qū)分呢?下面是學習啦小編為大家準備的java堆與棧的區(qū)別,希望大家喜歡!

  java堆與棧的區(qū)別

  各司其職

  最主要的區(qū)別就是棧內存用來存儲局部變量和方法調用。

  而堆內存用來存儲Java中的對象。無論是成員變量,局部變量,還是類變量,它們指向的對象都存儲在堆內存中。

  獨有還是共享

  棧內存歸屬于單個線程,每個線程都會有一個棧內存,其存儲的變量只能在其所屬線程中可見,即棧內存可以理解成線程的私有內存。

  而堆內存中的對象對所有線程可見。堆內存中的對象可以被所有線程訪問。

  異常錯誤

  如果棧內存沒有可用的空間存儲方法調用和局部變量,JVM會拋出java.lang.StackOverFlowError。

  而如果是堆內存沒有可用的空間存儲生成的對象,JVM會拋出java.lang.OutOfMemoryError。

  空間大小

  棧的內存要遠遠小于堆內存,如果你使用遞歸的話,那么你的棧很快就會充滿。如果遞歸沒有及時跳出,很可能發(fā)生StackOverFlowError問題。

  你可以通過-Xss選項設置棧內存的大小。-Xms選項可以設置堆的開始時的大小,-Xmx選項可以設置堆的最大值。

  java堆與棧相關閱讀

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

  Java的堆是一個運行時數據區(qū),類的對象從中分配空間。這些對象通過new、newarray、anewarray和 multianewarray等指令建立,它們不需要程序代碼來顯式的釋放。堆是由垃圾回收來負責的,堆的優(yōu)勢是可以動態(tài)地分配內存大小,生存期也不必事 先告訴編譯器,因為它是在運行時動態(tài)分配內存的,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由于要在運行時動態(tài)分配內存,存取速度較 慢。

  棧的優(yōu)勢是,存取速度比堆要快,僅次于寄存器,棧數據可以共享。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。

  棧中主要存放一些基本類型的變量(,int, short, long, byte, float, double, boolean, char)和對象句柄。

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

  int a = 3;

  int b = 3;

  編譯器先處理int a = 3;首先它會在棧中創(chuàng)建一個變量為a的引用,然后查找棧中是否有3這個值,如果沒找到,就將3存放進來,然后將a指向3。接著處理int b = 3;在創(chuàng)建完b的引用變量后,因為在棧中已經有3這個值,便將b直接指向3。這樣,就出現了a與b同時均指向3的情況。

  這時,如果再令a=4;那么編譯器會重新搜索棧中是否有4值,如果沒有,則將4存放進來,并令a指向4;如果已經有了,則直接將a指向這個地址。因此a值的改變不會影響到b的值。

  要注意這種數據的共享與兩個對象的引用同時指向一個對象的這種共享是不同的,因為這種情況a的修改并不會影響到b, 它是由編譯器完成的,它有利于節(jié)省空間。而一個對象引用變量修改了這個對象的內部狀態(tài),會影響到另一個對象引用變量。

1721130