1. 程式人生 > >淺析Java中的記憶體機制

淺析Java中的記憶體機制

一.物件和引用

要了解Java中物件在記憶體中的位置,首先要分清楚兩個概念,物件和引用。在Java中,使用

new Object()
來產生一個新的物件,這時,物件存在於堆記憶體中。而使用
Object object

僅僅產生了一個Object引用,引用存在於棧記憶體中,但此時僅僅聲明瞭一個引用,並沒有指向任何Object物件。可能到這裡你還是不太理解物件和引用的概念。做一個很形象比喻,引用就像是一臺電視機的遙控器,而物件則是電視機。引用是一個可以操控物件的入口,而物件則是操作的實體。它們兩個在記憶體位置如下圖:

如果僅僅只是聲明瞭一個引用,則JVM僅僅在類的棧區記憶體分配了一個空間,用來儲存引用的值。這裡可以將引用看做C語言中的指標,或者可以看做C++中的控制代碼。這時就出現了第二個問題,如何將物件賦值給引用?Java給了我們兩種方法:

引用賦值的兩種方法:

1.先宣告引用,再進行賦值
Object object;
object = new Object();
2.直接在宣告引用時賦值
Object object = new Object();
這時,引用就和物件連線在一起了,我們就可以通過引用來對物件進行操作了。他們現在在記憶體中如下: 需要注意的時,Java中一個物件可以被多個引用指向,但是一個引用只能指向一個物件。

二.繼承中的引用和物件

我們先來看一段程式碼
public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		father fa = new son();
fa.sub();//呼叫父類sub方法
//fa.Test();  //無法呼叫
fa.test();  //呼叫子類test方法
		son b = (son)fa;
//b.test();
		   b.Test();       //呼叫子類Test方法
	}

}

class father{
void sub(){
System.out.println("father.sub()");
}
	void test(){
		System.out.println("father.test()");
	}
}

class son extends father{
	void Test(){
		System.out.println("son.Test()");
	}
void test(){
System.out.println("son.test()");
}
}
我們可以看到一個父類引用可以指向子類物件,但是隻能呼叫父類宣告過的方法。這具體是為什麼呢?這時候我們就可以想之前那個比喻了,引用僅僅是一個遙控器,之前在父類已經定義了這個遙控器上的所有按鈕(方法),你雖然能讓它控制子類電視機,但是它本身並沒有子類的特有功能的按鈕,它肯定不能用啊。這樣下邊就容易理解了,再將這個引用再重新進行賦值給一個子類引用時,遙控器又重新擁有了這些按鈕,當然可以控制這些功能了。由此,我們可以明白,引用可以和物件分離,但是需要注意的是,父類引用可以指向任何一個子類物件,但是子類引用卻不可以指向父類物件。

三.類中其他成員的記憶體分配

  用static修飾符修飾的資料成員是不屬於任何一個類的具體物件,而是屬於類的靜態資料成員。它被儲存在類的記憶體區的公共儲存單元中,而不是儲存在某個物件的記憶體區中。因此,一個類的任何物件訪問它時,存取到的都是相同的數值。訪問方式為通過類名加點操作符來訪問,也可通過物件引用來訪問。
 常量被分配在棧區記憶體,當物件銷燬時,記憶體銷燬。

四.記憶體的回收與釋放

Java中的記憶體回收機制完全由Java虛擬機器來控制,當一個物件完全沒有引用時,這個物件成為垃圾。需要注意,Java中垃圾並不一定會被回收,什麼時候回收還需要看Java虛擬機器的處理。但是Java虛擬機器往往在資源不夠的情況下才進行垃圾回收。為了使其及時回收垃圾,我們可以用System.gc()方法來提醒虛擬機器進行垃圾回收。但是僅僅是提醒,Java虛擬機器並不一定會執行回收機制。

相關推薦

淺析Java記憶體機制

一.物件和引用 要了解Java中物件在記憶體中的位置,首先要分清楚兩個概念,物件和引用。在Java中,使用 new Object()來產生一個新的物件,這時,物件存在於堆記憶體中。而使用Object object 僅僅產生了一個Object引用,引用存在於棧記憶體中,但此時

【本人禿頂程式設計師】淺析JAVA記憶體與棧記憶體的區別

←←←←←←←←←←←← 快!點關注!!! Java把記憶體劃分成兩種:一種是棧記憶體,一種是堆記憶體。 一、棧記憶體 存放基本型別的變數,物件的引用和方法呼叫,遵循先入後出的原則。 棧記憶體在函式中定義的“一些基本型別的變數和物件的引用變數”都在函式的棧記憶體中分配。當在一

JAVA反射機制五(JavaBean的內省與BeanUtils庫)

getc ron 輸出結果 下載 比較 static 完成 自動完成 規則   內省(Introspector) 是Java 語言對JavaBean類屬性、事件的一種缺省處理方法。   JavaBean是一種特殊的類,主要用於傳遞數據信息,這種類中的方法主要用於訪問私有的

JAVA反射機制六(java.lang.reflect包)

instance 檢查 item 類繼承 final win 基類 cte member 一、簡介 java.lang.reflect包提供了用於獲取類和對象的反射信息的類和接口。反射API允許對程序訪問有關加載類的字段,方法和構造函數的信息進行編程訪問。它允許在安全限制

Java反射機制詳解

turn face instance java struct () 分享 2.6 一個     序言       在學習java基礎時,由於學的不紮實,講的實用性不強,就覺得沒用,很多重要的知識就那樣一筆帶過了,像這個馬上要講的反射機制一樣,當時學的時候就忽略了,到後來學習

淺析Java的final關鍵字--轉

pos x11 鏈接 輸出結果 pen ces class 引用變量 註意 轉載自:http://www.importnew.com/18586.html#comment-581628 談到final關鍵字,想必很多人都不陌生,在使用匿名內部類的時候可能會經常用到final

淺析Java的static關鍵字

log 傳媒 如果 思想 java編程 應用程序 3.4 spa print 關鍵點 《Java編程思想》對static方法的描述:“static方法就是沒有this的方法。在static方法內部不能調用非靜態方法,反過來是可以的。而且可以在沒有創建對象的前提下,僅僅通過類

javaimport機制(指定import和import *的區別)

dem single boot 路徑 list http 簡單 至少 package 轉自:https://www.cnblogs.com/dtts/p/4692480.html java中有兩種包的導入機制,總結如下: 單類型導入(single-type-i

(基礎篇)淺析JAVA的棧和堆

分享圖片 不可 img alt 插入 EDA 先進後出 我不 新的 若為生活所迫,做了自己不喜歡做的事。卻沒有達到自己預期想要的結果,那麽何必強迫自己,苦惱這一世。不如轉而做自己喜歡的事,哪怕像我一樣從頭開始。 一、概念 【老生常談】對於剛接觸計算機,沒幾年的我來說,好多老

java記憶體洩漏的理解

JAVA記憶體機制及記憶體洩露   一、Java記憶體管理機制     在C++語言中,如果需要動態分配一塊記憶體,程式設計師需要負責這塊記憶體的整個生命週期。從申請分配、到使用、再到最後的釋放。這樣的過程非常靈活,但是卻十分繁瑣,程式設計師很容易由於疏忽而

淺析java靜態方法,非靜態方法和構造方法的執行順序問題

https://blog.csdn.net/qq_42401622/article/details/81190406 對於java中的靜態方法,非靜態方法和構造方法的理解: 靜態方法是隨著的java中虛擬機器的類的載入而載入,是跟隨繫結在一起的。 public class Main{ s

淺析Java的四種執行緒池

1.使用執行緒池的好處    2.JUC中幾種常用的執行緒池 java.util.concurrent包下的Executors工廠類,提供了一系列的執行緒池的建立方法,其構造方法如下: public ThreadPoolExecutor(int corePoolSize,   

高階開發必須理解的JavaSPI機制

本文通過探析JDK提供的,在開源專案中比較常用的Java SPI機制,希望給大家在實際開發實踐、學習開源專案提供參考。 SPI是什麼 SPI全稱Service Provider Interface,是Java提供的一套用來被第三方實現或者擴充套件的API,它可以用來啟

通過原始碼淺析Java的資源載入

前提 最近在做一個基礎元件專案剛好需要用到JDK中的資源載入,這裡說到的資源包括類檔案和其他靜態資源,剛好需要重新補充一下類載入器和資源載入的相關知識,整理成一篇文章。 理解類的工作原理 這一節主要分析類載入器和雙親委派模型。 什麼是類載入器 虛擬機器設計團隊把類載入階段中的"通過一個類的全限定名來獲取描述此

淺析Java的final關鍵字

談到final關鍵字,想必很多人都不陌生,在使用匿名內部類的時候可能會經常用到final關鍵字。另外,Java中的String類就是一個final類,那麼今天我們就來了解final這個關鍵字的用法。下面是本文的目錄大綱: 一.final關鍵字的基本用法 二.深入理解fina

淺析Java的23種設計模式之----單例模式

單例模式作為23種設計模式之一,有著它特定的需求場景,比如一些內部資料結構不需要發生變化的例項(一些工具類)。 單例模式的核心就是隻允許有一個該類的靜態例項,並且這個靜態例項必須由這個類自己對外提供,也就是說只能由這個類自己例項化自己。由於只允許這個類例項化自己,就意味著我

Java反射機制(Reflection)研究及原始碼演示

如下內容內容是關於 Java中反射機制(Reflection)研究及演示的內容。   package com.jiangqq.reflection; import java.lang.reflect.Method; public class Reflection1 { public stati

淺析Java的String

一、String類  1.概述    String類代筆的是字串,是引用資料型別,Java中的所有字串文字都可以被看成是這個類的實現    字串表面上看起來儲存的是一個字元陣列,但是其底層實際上儲存的是字元陣列對應的位元組陣列。   2.常用構造方法 1 //初始化一個新建立的 String

java記憶體分配以及static的用法

Java記憶體分配與管理是Java的核心技術之一,一般Java在記憶體分配時會涉及到以下區域: 1.棧區:由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。 2.堆區:由程式設計師分配釋放, 若程式設計師不釋放,程式

淺析Java的XML

前期準備: 第三方的Dom4j庫操作XML資料,可以大大簡化程式碼量,並且降低操作難度。 Dom4j庫開源好用,有興趣的同學可以找一下相關api,或者看原始碼嘗試一下 百度雲連結:http://pan.baidu.com/s/1c2JlcmG 密碼:9eof XML是一