A. java的內存分配是什麼樣的
關於java內存分配是這樣的:
程序代碼存儲在"code segment"中,靜態變數和字元串常量存儲在「data segment"區域中,局部變數存儲在"stack"(棧內存)中,nwe出來的東西(即對象)存儲在"heap"(堆內存)中
B. java的內存分配問題
樓上不對。==是比較的內存地址,這點是毋庸置疑的。
首先,要明白,兩個x的定義過程。
x的定義過程是:聲明一個標量 int類型 x,然後在棧內存中尋找,看有沒有5這個值,如果有,x指向5,如果沒有,把5放進來,x指向這個5.
t.x也是一樣的。
那麼現在就很明了了。不管test2是不是new出來的。Test2中的x都會先在棧內存中尋找5這個值,經過尋找發現,確實有5,這個5已經在Test類中定義,這時候就直接指向了。所以「==」之後會得到true。因為他們指向的就是同一個內存地址。
如果還有不明白,請追問。
C. 簡述java內存分配與回收策率有什麼用
引言:大多數情況下,對象在新生代Eden區中分配。當Eden區沒有足夠空間進行分配時,虛擬機將發起一次Minor GC。新生代GC(Minor GC):指發生在新生代的垃圾收集動作,因為Java對象大多都具備朝生夕滅的特性,所以Minor GC非常頻繁,一般回收速度也比較快。老年代GC(Major GC / Full GC):指發生在老年代的GC,出現了Major GC,經常會伴有至少一次的Minor GC(但非絕對的,在Parallel Scavenge收集器的收集策略里就有直接進行Major GC的策略選擇過程)。Major GC的速度一般會比Minor GC慢10倍以上。
三、總結
可達性分析:以名為“GC根”的對象為起點,從這些節點向下搜索。當一個對象不能連接到“垃圾回收根”時,意味著它是可回收的。
D. 怎樣用java實現內存動態分配
1、java是如何管理內存的
Java的內存管理就是對象的分配和釋放問題。(兩部分)
分配 :內存的分配是由程序完成的,程序員需要通過關鍵字new 為每個對象申請內存空間 (基本類型除外),所有的對象都在堆 (Heap)中分配空間。
釋放 :對象的釋放是由垃圾回收機制決定和執行的,這樣做確實簡化了程序員的工作。但同時,它也加重了JVM的工作。因為,GC為了能夠正確釋放對象,GC必須監控每一個對象的運行狀態,包括對象的申請、引用、被引用、賦值等,GC都需要進行監控。
2、 JVM的內存區域組成
java把內存分兩種:一種是棧內存,另一種是堆內存1。在函數中定義的基本類型變數和對象的引用變數都在函數的棧內存中分配;2。堆內存用來存放由new創建的對象和數組以及對象的實例變數 在函數(代碼塊)中定義一個變數時,java就在棧中為這個變數分配內存空間,當超過變數的作用域後,java會自動釋放掉為該變數所分配的內存空間;在堆中分配的內存由java虛擬機的自動垃圾回收器來管理
堆和棧的優缺點
堆的優勢是可以動態分配內存大小,生存期也不必事先告訴編譯器,因為它是在運行時動態分配內存的。
缺點就是要在運行時動態分配內存,存取速度較慢; 棧的優勢是,存取速度比堆要快,僅次於直接位於CPU中的寄存器。
另外,棧數據可以共享。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。
E. Java把如何把內存劃分為4個部分
Java把內存劃分為以下4個部分:
1、棧區(stacksegment)—由編譯器自動分配釋放,存放函數的參數值,局部變數的值等,具體方法執行結束之後,系統自動釋放JVM內存資源。
2、堆區(heapsegment)—一般由程序員分配釋放,存放由new創建的對象和數組,jvm不定時查看這個對象,如果沒有引用指向這個對象就回收。
3、靜態區(datasegment)—存放全局變數,靜態變數和字元串常量,不釋放。
4、代碼區(codesegment)—存放程序中方法的二進制代碼,而且是多個對象共享一個代碼空間區域。
F. java中內存的分配問題
根據樓主的描述,感覺樓主的思想還停留在面向過程的層面上,對於java這樣的純面向對象的語言的語法和調用機制感到迷茫。這是很正常的,面向對象和面向過程本來就是兩個東西,從面向過程轉到面向對象,確實有點困難。
在你的問題中,你說「為什麼在main方法中,必須為屬性賦值或創建對象才能列印輸出,而在前一個類的方法中可以直接列印輸出呢?」,這個問題證明了你對java中「類」和對象的概念沒有理解清楚,首先,name屬性石類Stu的成員變數,許可權為public,因此任何類Stu的實例都可以通過.來引用該成員,但是其他類無法繞過Stu及其對象而引用該屬性(其實應該這么說,面向對象的語言中,沒有面向過程的語言中所謂的『全局變數』,定義一個變數,該變數必須屬於某個類的,在java中也肯定是屬於某個類的,而不能是如你所想的那樣,某個類中定義一個變數,任何類都可以繞過其所在類直接使用變數名來引用該變數,這是不可能實現的)。
舉個例子來講,你(類Stu)可以使用自己的手(變數name),來做任何事(System.out.println(name)),因為對於你來說手是你自己的,因此可以自由使用,這是憲法(JVM)賦予你(任何類)的自由權利但是對於其他人(類test)來說,如果要使用你的手(System.out.println(name+"\t"+a+"\t"+stu.name)),必須通過你(Stu.name),才能使用,難道你見過別人請你幫忙的時候,只帶走了你的手,而沒有把你帶走嗎?
關於虛擬機在執行Why y = new Why();代碼時,是如何分配內存的,一樓已經回答的很清楚了,我就不再贅述了。
最後,建議樓主多看看java入門,好好理解面向對象的思想,這一點無論是剛入門,還是日後你成為技術大牛,做架構設計,這一點都是至關重要的,至少在java世界中是這樣的。