日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

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

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

1、 JAVA的堆內(nèi)存和棧內(nèi)存

Java把內(nèi)存劃分為兩種:一種是堆內(nèi)存,一種是棧內(nèi)存

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

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

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

堆內(nèi)存用來存放由new創(chuàng)建的對象和數(shù)組,在堆中分配的內(nèi)存,由java虛擬機的自動垃圾回收器來管理。

2、 棧和堆的共同點和優(yōu)缺點

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

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

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

3、 Java中的數(shù)據(jù)類型有兩種

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

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

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

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

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

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

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

3、 Java堆和棧的區(qū)別

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

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

如果棧內(nèi)存沒有足夠的 空間儲存方法的調(diào)用和局部變量,jvm會拋出stackOverFlowError.

如果堆內(nèi)存沒有 足夠的空間儲存方法的調(diào)用和局部變量,jvm會拋出OutOfMemoryError。

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

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

4、 JVM中的堆和棧

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

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

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

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

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

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

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

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

運動步數(shù)有氧達人2018-06-03

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

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

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

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