java代碼執(zhí)行內(nèi)存分布 java基本數(shù)據(jù)類型內(nèi)存分布

Java內(nèi)存區(qū)域劃分、內(nèi)存分配原理是什么?

 Java虛擬機在執(zhí)行Java程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域。這些區(qū)域都有各自的用途,以及創(chuàng)建和銷毀的時

成都創(chuàng)新互聯(lián)公司長期為上1000家客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為伍家崗企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站建設,伍家崗網(wǎng)站改版等技術(shù)服務。擁有10年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

間,有的區(qū)域隨著虛擬機進程的啟動而存在,有些區(qū)域則是依賴用戶線程的啟動和結(jié)束而建立和銷毀。根據(jù)《Java虛擬機規(guī)范(第2版)》的規(guī)

定,Java虛擬機所管理的內(nèi)存將會包括以下幾個運行時數(shù)據(jù)區(qū)域,如下圖所示:

JAVA如何分配內(nèi)存的?棧內(nèi)存是什么?堆內(nèi)存?數(shù)據(jù)區(qū)?

你上面寫的程序有問題,我就不說了,自己看看書。

關(guān)于java內(nèi)存分配是這樣的:

程序代碼存儲在"code segment"中,靜態(tài)變量和字符串常量存儲在“data segment"區(qū)域中,局部變量存儲在"stack"(棧內(nèi)存)中,nwe出來的東西(即對象)存儲在"heap"(堆內(nèi)存)中。

怎樣用java實現(xiàn)內(nèi)存動態(tài)分配

1、java是如何管理內(nèi)存的

Java的內(nèi)存管理就是對象的分配和釋放問題。(兩部分)

分配 :內(nèi)存的分配是由程序完成的,程序員需要通過關(guān)鍵字new 為每個對象申請內(nèi)存空間 (基本類型除外),所有的對象都在堆 (Heap)中分配空間。

釋放 :對象的釋放是由垃圾回收機制決定和執(zhí)行的,這樣做確實簡化了程序員的工作。但同時,它也加重了JVM的工作。因為,GC為了能夠正確釋放對象,GC必須監(jiān)控每一個對象的運行狀態(tài),包括對象的申請、引用、被引用、賦值等,GC都需要進行監(jiān)控。

2、 JVM的內(nèi)存區(qū)域組成

java把內(nèi)存分兩種:一種是棧內(nèi)存,另一種是堆內(nèi)存1。在函數(shù)中定義的基本類型變量和對象的引用變量都在函數(shù)的棧內(nèi)存中分配;2。堆內(nèi)存用來存放由new創(chuàng)建的對象和數(shù)組以及對象的實例變量 在函數(shù)(代碼塊)中定義一個變量時,java就在棧中為這個變量分配內(nèi)存空間,當超過變量的作用域后,java會自動釋放掉為該變量所分配的內(nèi)存空間;在堆中分配的內(nèi)存由java虛擬機的自動垃圾回收器來管理

堆和棧的優(yōu)缺點

堆的優(yōu)勢是可以動態(tài)分配內(nèi)存大小,生存期也不必事先告訴編譯器,因為它是在運行時動態(tài)分配內(nèi)存的。

缺點就是要在運行時動態(tài)分配內(nèi)存,存取速度較慢; 棧的優(yōu)勢是,存取速度比堆要快,僅次于直接位于CPU中的寄存器。

另外,棧數(shù)據(jù)可以共享。但缺點是,存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。

Java程序運行時,沒有賦值的基本類型變量會在內(nèi)存中分配空間嗎?

基本類型的變量如果是臨時變量,只要定義了,就會分配內(nèi)存空間,不管是否被賦值;如果是作為對象的屬性出現(xiàn),只要該對象不實例化,就不會分配內(nèi)存空間。\x0d\x0a\x0d\x0a一個完整的Java程序運行過程會涉及以下內(nèi)存區(qū)域:\x0d\x0a1、寄存器:JVM內(nèi)部虛擬寄存器,存取速度非???,程序不可控制。\x0d\x0a2、 棧:保存局部變量的值,包括:\x0d\x0a 1)用來保存基本數(shù)據(jù)類型的值;\x0d\x0a 2)保存類的實例,即堆區(qū)對象的引用(指針)\x0d\x0a 3)也可以用來保存加載方法時的幀\x0d\x0a3、堆:用來存放動態(tài)產(chǎn)生的數(shù)據(jù),比如new出來的對象。注意創(chuàng)建出來的對象只包含屬于各自的成員變量,并不包括成員方法。因為同一個類的對象擁有各自的成員變量,存儲在各自的堆中,但是他們共享該類的方法,并不是每創(chuàng)建一個對象就把成員方法復制一次。\x0d\x0a\x0d\x0a4、常量池:JVM為每個已加載的類型維護一個常量池,常量池就是這個類型用到的常量的一個有序集合。包括直接常量(基本類型,String)和對其他類型、方法、字段的符號引用(1)。池中的數(shù)據(jù)和數(shù)組一樣通過索引訪問。由于常量池包含了一個類型所有的對其他類型、方法、字段的符號引用,所以常量池在Java的動態(tài)鏈接中起了核心作用。常量池存在于堆中。\x0d\x0a\x0d\x0a5、代碼段:用來存放從硬盤上讀取的源程序代碼。\x0d\x0a6、數(shù)據(jù)段:用來存放static定義的靜態(tài)成員。\x0d\x0a\x0d\x0a注意:\x0d\x0a 1.一個Java文件,只要有main入口方法,我們就認為這是一個Java程序,可以單獨編譯運行。\x0d\x0a 2.無論是普通類型的變量還是引用類型的變量(俗稱實例),都可以作為局部變量,他們都可以出現(xiàn)在棧中。只不過普通類型的變量在棧中直接保存它所對應的值,而引用類型的變量保存的是一個指向堆區(qū)的指針,通過這個指針,就可以找到這個實例在堆區(qū)對應的對象。因此,普通類型變量只在棧區(qū)占用一塊內(nèi)存,而引用類型變量要在棧區(qū)和堆區(qū)各占一塊內(nèi)存。

Java對象的內(nèi)存分配

棧內(nèi)存放引用型變量,指向堆里面new出來的對象

堆內(nèi)存放new出來的對象

方法只有一份用來共享,只有在執(zhí)行的時候才在內(nèi)存中分配空間,如圖:

網(wǎng)站欄目:java代碼執(zhí)行內(nèi)存分布 java基本數(shù)據(jù)類型內(nèi)存分布
轉(zhuǎn)載來于:http://muchs.cn/article8/hgidop.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設外貿(mào)網(wǎng)站建設、品牌網(wǎng)站設計、網(wǎng)站制作微信公眾號、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務器托管