国产美女一级毛片精品久久久|婷婷影院在线综合免费视频|最新国产午夜精品视频成人|久久精品九九无码免费

Java內(nèi)存的分配原理SGI怎樣的?

來源:北大青鳥飛迅校區(qū)|發(fā)布時間:2013-04-27 13:51:25

  JAVA內(nèi)存分配與管理是Java的核心技術之一,之前我們曾介紹過Java的內(nèi)存管理與內(nèi)存泄露以及Java垃圾回收方面的知識,今天我們再次深入Java核心,詳細介紹一下Java在內(nèi)存分配方面的知識。一般Java在內(nèi)存分配時會涉及到以下區(qū)域:

  ◆寄存器:我們在程序中無法控制

  ◆棧:存放基本類型的數(shù)據(jù)和對象的引用,但對象本身不存放在棧中,而是存放在堆中

  ◆堆:存放用new產(chǎn)生的數(shù)據(jù)

  ◆靜態(tài)域:存放在對象中用static定義的靜態(tài)成員

  ◆常量池:存放常量

  ◆非RAM存儲:硬盤等永久存儲空間

  Java內(nèi)存分配中的棧

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

  Java內(nèi)存分配中的堆

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

  在堆中產(chǎn)生了一個數(shù)組或?qū)ο蠛,還可以 在棧中定義一個特殊的變量,讓棧中這個變量的取值等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址,棧中的這個變量就成了數(shù)組或?qū)ο蟮囊米兞俊?引用變量就相當于是 為數(shù)組或?qū)ο笃鸬囊粋名稱,以后就可以在程序中使用棧中的引用變量來訪問堆中的數(shù)組或?qū)ο。引用變量就相當于是為?shù)組或者對象起的一個名稱。

  引用變量是普通的變量,定義時在棧中分配,引用變量在程序運行到其作用域之外后被釋放。而數(shù)組和對象本身在堆中分配,即使程序 運行到使用 new 產(chǎn)生數(shù)組或者對象的語句所在的代碼塊之外,數(shù)組和對象本身占據(jù)的內(nèi)存不會被釋放,數(shù)組和對象在沒有引用變量指向它的時候,才變?yōu)槔,不能在被使用,但?然占據(jù)內(nèi)存空間不放,在隨后的一個不確定的時間被垃圾回收器收走(釋放掉)。這也是 Java 比較占內(nèi)存的原因。

  實際上,棧中的變量指向堆內(nèi)存中的變量,這就是Java中的指針!   常量池 (constant pool)

  常量池指的是在編譯期被確定,并被保存在已編譯的.class文件中的一些數(shù)據(jù)。除了包含代碼中所定義的各種基本類型(如int、long等等)和對象型(如String及數(shù)組)的常量值(final)還包含一些以文本形式出現(xiàn)的符號引用,比如:

  ◆類和接口的全限定名;

  ◆字段的名稱和描述符;

  ◆方法和名稱和描述符。

  虛擬機必須為每個被裝載的類型維護一個常量池。常量池就是該類型所用到常量的一個有序集和,包括直接常量(string,integer和 floating point常量)和對其他類型,字段和方法的符號引用。

  對于String常量,它的值是在常量池中的。而JVM中的常量池在內(nèi)存當中是以表的形式存在的, 對于String類型,有一張固定長度的CONSTANT_String_info表用來存儲文字字符串值,注意:該表只存儲文字字符串值,不存儲符號引 用。說到這里,對常量池中的字符串值的存儲位置應該有一個比較明了的理解了。在程序執(zhí)行的時候,常量池 會儲存在Method Area,而不是堆中。

上一篇:審查Java代碼時常見的十一種錯誤
下一篇:Java+中什么是半靜態(tài)語言?原理及價值

熱門話題

招生熱線: 4008-0731-86 / 0731-82186801

學校地址: 長沙市天心區(qū)團結(jié)路6號

Copyright © 2006 | 湖南大計信息科技有限公司 版權(quán)所有

湘ICP備14017520號-3

關注我們
在線咨詢
嘿,我來幫您!