亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

1、 JAVA的堆內存和棧內存

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

堆:主要用于儲存實例化的對象、數組。由JVM動態分配內存空間。一個jvm只有一個堆內存,線程是可以共享數據的。

棧:主要用于儲存局部變量和對象的引用變量,每個線程都有有一個獨立的??臻g,所以線程之間不共享數據的。

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

堆內存用來存放由new創建的對象和數組,在堆中分配的內存,由java虛擬機的自動垃圾回收器來管理。

2、 棧和堆的共同點和優缺點

1、 棧(stack)與堆(heap)都是java用來在內存中存放數據的地方,java自動 管理堆和棧。

2、 棧的優勢是,存取速度比較快,僅次于直接位于cpu中的寄存器,當缺點是,存放在棧中的數據大小和生存期必須是確定的,缺乏靈活性。棧數據也是可以共享的。

堆的優勢是可以動態的分配內存大小,生存期也不必事先告訴編譯器,java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由于在運行時動態分配內存,存取速度較慢。

3、 Java中的數據類型有兩種

一種是基本類型,共8中。這種類型的定義是通過 諸如int a = 3;的形式來定義的,稱為自動變量。值得注意的是,自動變量存的是字面值,不是類的示例,所以沒有類的存在。如ing a=3; 這里的a是一個指向ing類型的引用,指向 3這個字面值。這些字面值得數據,由于大小可知,生存期可知,出于追求速度的原因,就存在于棧中。

棧有一個很重要的特性,就是存在棧中的數據可以共享。

假如同時定義int a = 3;int b = 3;

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

需要注意的是,這種字面值的引用和類對象的引用不同,假定兩個類 對象的引用同時指向一個對象,如果一個對象引用變量修改了這個對象的內部狀態,那么另外一個對象引用變量也即刻反映出這個變化。

字面值的引用中,其中a的值得變化不會影響到b的值。

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

3、 Java堆和棧的區別

棧內存用來儲存局部變量和方法的調用,堆內存用來儲存java中的對象。無論成員變量、局部變量、還是類 變量,他們指向的對象都儲存在堆內存中。

棧內存歸屬于單個線程,每個線程都會有一個棧內存,其儲存的變量只能在其所屬線程中可見。堆內存中的對象對所有的線程可見。堆內存中的對象可被所有的線程訪問。

如果棧內存沒有足夠的 空間儲存方法的調用和局部變量,jvm會拋出stackOverFlowError.

如果堆內存沒有 足夠的空間儲存方法的調用和局部變量,jvm會拋出OutOfMemoryError。

棧內存 要遠遠小于堆內存,如果使用遞歸的話,棧內存很快就會 用完,如果沒有及時跳出的話,會發生stackOverFlowError問題。

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

4、 JVM中的堆和棧

JVM是基于堆棧的虛擬機.JVM為每個新創建的線程都分配一個堆棧.也就是說,對于一個Java程序來說,它的運行就是通過對堆棧的操作來完成的。堆棧以幀為單位保存線程的狀態。JVM對堆棧只進行兩種操作:以幀為單位的壓棧和出棧操作。 我們知道,某個線程正在執行的方法稱為此線程的當前方法.我們可能不知道,當前方法使用的幀稱為當前幀。當線程激活一個Java方法,JVM就會在線程的 Java堆棧里新壓入一個幀。這個幀自然成為了當前幀.在此方法執行期間,這個幀將用來保存參數,局部變量,中間計算過程和其他數據.這個幀在這里和編譯原理中的活動紀錄的概念是差不多的. 從Java的這種分配機制來看,堆棧又可以這樣理解:堆棧(Stack)是操作系統在建立某個進程時或者線程(在支持多線程的操作系統中是線程)為這個線程建立的存儲區域,該區域具有先進后出的特性。

每一個Java應用都唯一對應一個JVM實例,每一個實例唯一對應一個堆。應用程序在運行中所創建的所有類實例或數組都放在這個堆中,并由應用所有的線程 共享.跟C/C++不同,Java中分配堆內存是自動初始化的。Java中所有對象的存儲空間都是在堆中分配的,但是這個對象的引用卻是在棧中分配,也就是說在建立一個對象時從兩個地方都分配內存,在堆中分配的內存實際建立這個對象,而在棧中分配的內存只是一個指向這個堆對象的指針(引用)而已。

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

分享到:
標簽:Java
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定