當前位置:首頁 » 編程語言 » java類的內存

java類的內存

發布時間: 2022-07-24 12:38:17

㈠ 1. java有幾種內存每一種內存有什麼功能哪一種內存速度快

有六個地方都可以存儲數據:
(1) 寄存器(Registers)。這是速度最快的存儲場所,因為寄存器其他所有存儲媒介都不同:它位於處理器內部。不過,寄存器的數量十分有限,所以寄存器是根據需要由編譯器適當地分配。作為一個程序員,我們對此沒有直接的控制權,也沒辦法在程序里頭感覺到寄存器的任何存在跡象。

(2) Stack(棧)。位於一般的RAM(random-access memory,隨機訪問內存)中。處理器通過其指針(「棧指針」,stack pointer)獲得處理的直接支持。棧指針若向下(後)移,會分配新的內存;若向上(前)移,則會釋放那些內存。這是一種特別快、特別有效率的數據存儲方式,速度僅次於寄存器。由於Java編譯器有責任產生「將stack指針前後移動」的程序代碼,所以它必須能夠完全掌握它所編譯的程序中「存在stack里頭的所有數據的實際大小和存活時間」。如此一來便會限製程序的彈性。由於這個限制,盡管有些Java數據要存儲在棧里——特別是對象句柄,但Java對象並不放到其中。

(3) Heap(堆)。Heap是一種通用性質的內存存儲空間(也存在於RAM中),用來置放所有Java對象。「內存堆」或「堆」(Heap)勝過stack之處在於,編譯器不需知道究竟得從堆里分配多少存儲空間,也不需知道從堆上分配的空間究竟要存活多長的時間。因此,用堆存儲數據時會得到更大的靈活性。要求創建一個對象時,只需用new即可。執行這些代碼時,會在堆里分配空間。當然,為達到這種靈活性,必然會付出一定的代價:在堆里分配存儲空間時會比從棧里分配花掉更長的時間(假設你真的可以在Java中像C++一樣地從stack上產生對象的話)!

(4) 靜態存儲空間(Static storage)。這兒的「靜態」(Static)是指「位於固定位置」(也在RAM里頭)。靜態存儲空間存放著「程序運行期間」一直存在的數據。可用static關鍵字將某個對象內的特定成員設為靜態,但Java對象本身永遠都不會置入靜態存儲空間。

(5) 常量存儲空間(Constant storage)。常量值通常被直接置於程序代碼里頭。因為它們永遠都不會改變,所以也是安全的。有的常數需要嚴格地保護,所以可考慮將它們置入只讀存儲器(read-only memory,ROM)中。

(6) 非RAM存儲空間(Non-RAM storage)。若數據完全存活於程序之外,則程序不運行時數據仍繼續存在,脫離了程序的控制范圍。其中兩個最主要的例子便是「串流化對象(streamed objects)」和「持久性對象(persistent objects)」。在串流化對象形式中,對象會被轉換為一連串的位元組(bytes)流,這些bytes通常會被傳送給另一台機器。而在持久性對象形式中,對象被存儲於磁碟,即使程序運行結束,這些對象還能夠繼續保有。這種類型的存儲空間的特點在於,它們能夠將對象轉換為可存儲於其他媒介的形式,並在需要時,將所存儲的數據還原成可存儲於RAM中的一般對象。Java提供了對「輕量級持久性(Lightweight persistence)」的支持。新版本有可能提供更完善的解決方案。

針對你的補充我也補充一下:堆內存和棧內存確實是我們常常用的東西,比如
Animal a = new Animal();
這個時候相當於在堆內存中開辟了一個空間保存了Animal的信息以及著塊空間的內存地址,然後在棧內存中劃了一小快空間保存了堆中的內存地址,這個時候我們就可以說引用a指向Animal()了.

可是有時候,有個靜態類.Animal,裡面有個靜態方法speak();
那麼可以這么直接調用Animal.sepak();
這個時候既沒有new,也沒有Animal a=??;
所以既沒有在堆中開辟空間也沒有在棧內存中開辟空間 ,
可是方法確實能執行,一切程序都運行在內存里,那麼證明有新的內存區,就是靜態空間了.
當然還有常量什麼的等等

㈡ Java中內存分為幾塊

你說的是jvm的內存空間吧。
在方法(代碼塊)中定義一個變數時,java就在棧中為這個變數分配JVM內存空間,當超過變數的作用域後,java會自動釋放掉為該變數所分配的JVM內存空間;而在堆中分配的JVM內存由java虛擬機的自動垃圾回收器來管理。

JVM內存區域組成

JVM內存分四種:

1、棧區(stacksegment)—由編譯器自動分配釋放,存放函數的參數值,局部變數的值等,具體方法執行結束之後,系統自動釋放JVM內存資源

2、堆區(heapsegment)—一般由程序員分配釋放,存放由new創建的對象和數組,jvm不定時查看這個對象,如果沒有引用指向這個對象就回收

3、靜態區(datasegment)—存放全局變數,靜態變數和字元串常量,不釋放

4、代碼區(codesegment)—存放程序中方法的二進制代碼,而且是多個對象共享一個代碼空間區域

在方法(代碼塊)中定義一個變數時,java就在棧中為這個變數分配JVM內存空間,當超過變數的作用域後,java會自動釋放掉為該變數所分配的JVM內存空間;在堆中分配的JVM內存由java虛擬機的自動垃圾回收器來管理,堆的優勢是可以動態分配JVM內存大小,生存期也不必事先告訴編譯器,因為它是在運行時動態分配JVM內存的。缺點就是要在運行時動態分配JVM內存,存取速度較慢;棧的優勢是存取速度比堆要快,缺點是存在棧中的數據大小與生存期必須是確定的無靈活性。

◆java堆由Perm區和Heap區組成,Heap區則由Old區和New區組成,而New區又分為Eden區,From區,To區,Heap={Old+NEW={Eden,From,To}},見圖1所示。

Heap區分兩大塊,一塊是NEWGeneration,另一塊是OldGeneration.在NewGeneration中,有一個叫Eden的空間,主要是用來存放新生的對象,還有兩個SurvivorSpaces(from,to),它們用來存放每次垃圾回收後存活下來的對象。在OldGeneration中,主要存放應用程序中生命周期長的JVM內存對象,還有個PermanentGeneration,主要用來放JVM自己的反射對象,比如類對象和方法對象等。

在NewGeneration塊中,垃圾回收一般用Copying的演算法,速度快。每次GC的時候,存活下來的對象首先由Eden拷貝到某個SurvivorSpace,當SurvivorSpace空間滿了後,剩下的live對象就被直接拷貝到OldGeneration中去。因此,每次GC後,EdenJVM內存塊會被清空。在OldGeneration塊中,垃圾回收一般用mark-compact的演算法,速度慢些,但減少JVM內存要求.

垃圾回收分多級,0級為全部(Full)的垃圾回收,會回收OLD段中的垃圾;1級或以上為部分垃圾回收,只會回收NEW中的垃圾,JVM內存溢出通常發生於OLD段或Perm段垃圾回收後,仍然無JVM內存空間容納新的Java對象的情況。

JVM調用GC的頻度還是很高的,主要兩種情況下進行垃圾回收:當應用程序線程空閑;另一個是JVM內存堆不足時,會不斷調用GC,若連續回收都解決不了JVM內存堆不足的問題時,就會報outofmemory錯誤。因為這個異常根據系統運行環境決定,所以無法預期它何時出現。

根據GC的機制,程序的運行會引起系統運行環境的變化,增加GC的觸發機會。為了避免這些問題,程序的設計和編寫就應避免垃圾對象的JVM內存佔用和GC的開銷。顯示調用System.GC()只能建議JVM需要在JVM內存中對垃圾對象進行回收,但不是必須馬上回收,一個是並不能解決JVM內存資源耗空的局面,另外也會增加GC的消耗。

◆當一個URL被訪問時,JVM內存區域申請過程如下:

A.JVM會試圖為相關Java對象在Eden中初始化一塊JVM內存區域

B.當Eden空間足夠時,JVM內存申請結束。否則到下一步

C.JVM試圖釋放在Eden中所有不活躍的對象(這屬於1或更高級的垃圾回收),釋放後若Eden空間仍然不足以放入新對象,則試圖將部分Eden中活躍對象放入Survivor區

D.Survivor區被用來作為Eden及OLD的中間交換區域,當OLD區空間足夠時,Survivor區的對象會被移到Old區,否則會被保留在Survivor區

E.當OLD區空間不夠時,JVM會在OLD區進行完全的垃圾收集(0級)

F.完全垃圾收集後,若Survivor及OLD區仍然無法存放從Eden復制過來的部分對象,導致JVM無法在Eden區為新對象創建JVM內存區域,則出現"outofmemory錯誤"

㈢ Java的內存分配是什麼樣的

關於java內存分配是這樣的:
程序代碼存儲在"code segment"中,靜態變數和字元串常量存儲在「data segment"區域中,局部變數存儲在"stack"(棧內存)中,nwe出來的東西(即對象)存儲在"heap"(堆內存)中

㈣ 一個java類,在內存中是怎樣分配的求指點

更准確的說,我想你應該是想問一個java類的對象在生成時是怎樣分配內存的吧?生成對象時,對象的引用存放在棧里,而對象本身是存放在堆里的,棧的存取速度更快。引用的大小可以確定,應該就是地址的大小,而對象本身的大小則與具體的類相關。另外,基本類型,即int,short, long, byte, float, double, boolean, char,定義如int a = 5; 時,因為int類型的大小確定,而且為了常量使用的速度,5這個常量也是存放在棧中的,當然,引用這個常量的a,即常量的引用也是存放在棧中的。

㈤ 一個Java對象到底佔用多大內存

Object o=new Object():
在java中空對象佔八個位元組,對象的引用佔四個位元組。所以上面那條語句所佔的空間是4byte+8byte=12byte.java中的內存是以8的倍數來分配的,所以分配的內存是16byte.
舉個例子:
Class O{
int i;
byte j;
String s;
}
其所佔內存的大小是空對象(8)+int(4)+byte(1)+String引用(4)=17byte,因要是8的整數倍,所以其佔大小為24byte.
當然,如果類里有其他對象的話,也要把其他對象的空間算進去

㈥ java里的靜態類占的內存大嗎

靜態
指的是
存儲類型
說明
存儲在內存數據區

預設

一般
是存儲在
內存的
堆棧里
佔用內存大小是
根據
數據類型決定的
靜態存儲類型的,一定是
全局變數

不會在程序執行完之前
釋放內存

而一般
局部變數
在生命周期結束後,會釋放內存。(不過
全局變數不一定
就是
靜態的)

㈦ java 在內存中占幾個位元組

不同的數據類型占的內存大小不同 比如int 是四個位元組 char是一個位元組 等等

㈧ 關於java的內存問題

Java的內存分配 Java程序運行時的內存結構分成:方法區、棧內存、堆內存、本地方法棧幾種。 方法區 存放裝載的類數據信息,包括:基本信息:每個類的全限定名、每個類的直接超類的全限定名、該類是類還是介面、該類型的訪問修飾符、直接超介面的全限定名的有序列表。每個已裝載類的詳細信息:運行時常量池、欄位信息、方法信息、靜態變數、到類classloader的引用、到類class的引用。 棧內存 Java棧內存由局部變數區、操作數棧、幀數據區組成,以幀的形式存放本地方法的調用狀態(包括方法調用的參數、局部變數、中間結果……)。 堆內存 堆內存用來存放由new創建的對象和數組。在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。 本地方法棧內存 Java通過Java本地介面JNI(Java Native Interface)來調用其它語言編寫的程序,在Java裡面用native修飾符來描述一個方法是本地方法 Java對象創建內存示意圖 java中內存主要包含4塊,即heap(堆內存)、stack(棧內存)、data segment(靜態變數或是常量存放區)、codesegment(方法區).
堆內存中存放的是new出的對象,new出的對象只包含成員變數。 棧內存中:存放的是局部成員變數。對於基本的數據類型存放的是基本變數的值,而對於對象變數,存放的是堆內存的地址。 靜態、常量區:存放的是靜態變數(類變數)或是常量。 方法區:存放的是對象的方法。因此即使new出多個對象也是只是存在一個方法。 如 A a = new A(); A中含有一個work方法,2個成員變數a,b。那麼對應的內存分配為 則 a是分配在棧內存中。裡面存放了一個指向堆內存中存放的new A()的地址。 new A()會導致在堆內存中分配一塊空間,該內存中的A對象同時會含有a和b。 work()方法會在codesegment區中分配內存。 如果此時 A b = a;則表示把a的值復制給b,即b的值為a中保存的地址

㈨ JAVA內存指什麼通常又有哪幾種JAVA內存

是指的可運行內存,直接影響可以運行的軟體的大小!

㈩ java中內存的概念

Java中的內存其實是java虛擬機幫助程序員管理的。。
籠統地去講,java的內存分配分為兩個部分,一個是數據堆,一個是棧
程序在運行的時候 一般分配數據堆,把局部的臨時的變數都放進去,生命周期和進程有關系。但是如果程序員聲明了static的變數,就直接在棧中運行的,進程銷毀了,不一定會銷毀static變數。

另外為了保證java內存不會溢出,java中有垃圾回收機制
System.gc()即垃圾收集機制是指jvm用於釋放那些不再使用的對象所佔用的內存。java語言並不要求jvm有gc,也沒有規定gc如何工作。垃圾收集的目的在於清除不再使用的對象。gc通過確定對象是否被活動對象引用來確定是否收集該對象。

熱點內容
android3x 發布:2025-01-31 08:13:03 瀏覽:600
如何購買安卓版live2d 發布:2025-01-31 08:13:01 瀏覽:279
python交互輸入 發布:2025-01-31 08:12:53 瀏覽:427
requestdatapython 發布:2025-01-31 08:02:01 瀏覽:44
javades加密工具 發布:2025-01-31 07:54:04 瀏覽:244
電話如何配置ip 發布:2025-01-31 07:48:48 瀏覽:300
2021賓士e300l哪個配置性價比高 發布:2025-01-31 07:47:14 瀏覽:656
sqlserver2008光碟 發布:2025-01-31 07:32:13 瀏覽:578
sql查詢小時 發布:2025-01-31 07:23:00 瀏覽:423
新車鑒別時怎麼查看汽車配置 發布:2025-01-31 07:19:37 瀏覽:881