1. 程式人生 > >Java String的記憶體機制

Java String的記憶體機制

JVM執行時,會將記憶體分為兩個部分:堆和棧。堆中存放的是建立的物件,而棧中存放的方法呼叫過程的區域性變數或引用。而設計Java字串物件記憶體實現的時候,在堆中又開闢了一塊很小的記憶體,稱之為字串常量池,專門用來存放特定的字串物件。

建立Java字串物件有兩種常用的方式:

String 引用變數名="字串內容";
String 應用變數名=new String(<引數序列>);

我們先來看看建立字串物件的第一種方式記憶體如何分配的,程式碼如下:
String s1="osEye.net";
String s2="osEye.net";


如上圖描述了引用物件的關係,以及記憶體的分配。Java實現的步驟如下:

  1. 檢視字串常量池中是否存在內容與“osEye.net”相同的字串物件。
  2. 若沒有,則新建立一個包含該內容的字串物件,並讓引用變數指向該物件。例如,建立字串s1的時候,字串常量池中沒有,則建立一個新物件,並讓引用s1指向該物件。
  3. 若已經存在包含該內容的字串物件,則讓字串引用直接指向該物件。例如,在建立字串s2的時候,字串常量池中已經有包含該內容的物件了,所以引用s2直接指向已有的物件。

在來看看第二種建立字串物件的方式:

String s1="osEye.net";
String s2=new String("osEye.net");


如上圖描述了引用物件的關係,以及記憶體的分配。Java實現的步驟如下:

  1. 首先在堆(不是常量池)中建立一個包含指定內容的字串物件,並將字串引用指向該物件。例如上述程式碼中,使用new建立字串s3,其會直接在堆中建立一個內容為“osEye.net”的字串對物件,並將引用s3指向該物件。
  2. 去字串常量池中檢視,是否有包含該內容的物件。
  3. 若有,則將new出來的字串物件與字串常量池中內容相同的物件聯絡起來。例如,本例中s3所指向的物件與s1所指向的聯絡起來。
  4. 若沒有,則在字串常量池再建立一個包含該內容的字串物件,並將堆中的物件與字串常量池中新創建出來的物件聯絡起來。
我們知道,new出來的字串物件和字串常量池中的物件是有聯絡的,可以通過intern方法來檢視,方法簽名:
public String intern()
此方法將指定的字串引用在字串常量池中對應的物件,若其指向的物件本身就在字串常量池中,則直接將自己指向的物件返回;若該字串引用指向的物件在堆中,則返回字串常量池中與其聯絡的物件。例項如下:
package net.oseye;
public class ExceptionTest {
 
	public static void main(String[] args) {
		String s1="osEye.net";
		String s2=new String("osEye.net");
		
		if(s1==s2){
			System.out.println("字串引用s1和字串引用s2所指向的是同一個物件");
		}else{
			System.out.println("字串引用s1和字串引用s2所指向的不是同一個物件");
		}
		if(s1.intern()==s2.intern()){
			System.out.println("字串引用s1和字串引用s2在字串常量池中聯絡的是同一個物件");
		}else{
			System.out.println("字串引用s1和字串引用s2在字串常量池中聯絡的不是同一個物件");
		}
	}
}
輸出結果:
字串引用s1和字串引用s2所指向的不是同一個物件
字串引用s1和字串引用s2在字串常量池中聯絡的是同一個物件




相關推薦

[Java]String記憶體陷阱簡介

String 方法用於文字分析及大量字串處理時會對記憶體效能造成一些影響。可能導致記憶體佔用太大甚至OOM。 一、先介紹一下String物件的記憶體佔用 一般而言,Java 物件在虛擬機器的結構如下: •物件頭(object header):8 個位元組(儲存物件的 class 資訊、ID、在虛擬機

Java記憶體機制(堆和棧)簡單理解

偶然看到一道面試題,Java在例項化一個類的時候,資料在堆和棧中是如何存放的? public class A{ public int i=1; public static A a1

Java記憶體機制詳解(new操作的執行原理)

1.Java的記憶體機制  Java 把記憶體劃分成兩種:一種是棧記憶體,另一種是堆記憶體。在函式中定義的一些基本型別的變數和物件的引用變數都是在函式的棧記憶體中分配,當在一段程式碼塊定義一個變數時,Java 就在棧中為這個變數分配記憶體空間,當超過變數的作用域後(比如,在函式A中呼叫函式B,在函式B中定義變

JAVA堆疊記憶體機制

Java的記憶體機制  Java 把記憶體劃分成兩種:一種是棧記憶體,另一種是堆記憶體。在函式中定義的一些基本型別的變數和物件的引用變數都是在函式的棧記憶體中分配,當在一段程式碼塊定義一個變數時,Java 就在棧中為這個變數分配記憶體空間,當超過變數的作用域後(比如,在函式

Java String記憶體機制

JVM執行時,會將記憶體分為兩個部分:堆和棧。堆中存放的是建立的物件,而棧中存放的方法呼叫過程的區域性變數或引用。而設計Java字串物件記憶體實現的時候,在堆中又開闢了一塊很小的記憶體,稱之為字串常量池,專門用來存放特定的字串物件。 建立Java字串物件有兩種常用的方式

java String 比較問題及jvm記憶體模型

總是被java字串問題給困擾,今天總結一下: 看如下程式碼: public class Main{ public static void main(String[] args) { String i = "abc"; String j = "abc"; St

java記憶體回收機制

如何確定一個物件是否可以被回收? 1、 引用計數演算法:判斷物件的引用數量 2、 可達性分析演算法:判斷物件到GC Root引用鏈是否可達 ps:c++中解決迴圈引用的方法: 1. 當只剩下最後一個引用的時候需要手動打破迴圈引用釋放物件。2. 當A的生存期超過B的生存

Java記憶體管理機制記憶體區域劃分

      各位,好久不見。先做個預告,由於最近主要在做Java服務端開發,最近一段時間會更新Java服務端開發相關的一些知識,包括但不限於一些讀書筆記、框架的學習筆記、和最近一段時間的思考和沉澱。先從Java虛擬機器的記憶體開始吧。 Java虛擬機器在執行Java

Java記憶體模型只是反映了虛擬機器內部的執行緒處理機制

八個月外包公司的工作,是我的第一份 .NET 軟體開發工作,第一次真正進入這個行業之中,這段工作經歷讓我對自己未來的工作有了一定的規劃,明確了找工作時基本不再考慮外包公司,之後選擇入職了一家網際網路創業公司,雖然真的比原來累很多,晚上加班、週末加班也成為常態。可是,也就是這段職場經歷,讓我能夠慢慢跟隨上當前技

Java的clone機制(及String的特殊性)

1. Clone&Copy假設現在有一個Employee物件,Employee tobby =new Employee(“CMTobby”,5000),通常我們會有這樣的賦值Employee cindyelf=tobby,這個時候只是簡單了copy了一下referen

Java記憶體機制以及Android記憶體優化

Java記憶體機制 1. 虛擬機器執行時資料區 基本概念 虛擬機器 模擬某種計算機體系結構,執行特定指令集的軟體。包括程序虛擬機器和系統虛擬機器(VMWare) 程序虛擬機器:JVM、Adobe Flash Player、FC模擬器 高階語言虛擬機器:JVM、.NE

java自動記憶體管理機制

java自動記憶體管理 1.執行時的資料區域          java程式在執行的過程中把它所管理的記憶體劃分為若干個區域分別是:          1. 方法區        2. 虛擬機器棧          3. 本地方法棧          4,堆     

淺析Java中的記憶體機制

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

Java 類載入機制 ClassLoader Class.forName 記憶體管理 垃圾回收GC

類載入是Java程式執行的第一步,研究類的載入有助於瞭解JVM執行過程,並指導開發者採取更有效的措施配合程式執行。 研究類載入機制的第二個目的是讓程式能動態的控制類載入,比如熱部署等,提高程式的靈活性和適應性。 一、簡單過程 Java

java記憶體機制原理

問題的引入:問題一:String str1 = "abc"; String str2 = "abc"; System.out.println(str1==str2); //true 問題二:String str1 =new String ("abc"); String str

Java記憶體分配機制(初步整理)

    Java程式是執行在Java虛擬機器(Java Virtual Machine,JVM)上的,可以把JVM理解為Java程式和作業系統之間的橋樑,JVM實現了Java的跨平臺,Java記憶體分配原理一切都是在JVM中進行的,JVM是記憶體分配原理的基礎與前提。

java基礎之記憶體機制詳解

今天有看到一篇好的關於java記憶體機制的文章,果斷轉載過來,哈哈哈哈哈哈!!!!! 堆區:  1.儲存的全部是物件,每個物件都包含一個與之對應的class的資訊。(class的目的是得到操作指令) 2.jvm只有一個堆區(heap)被所有執行緒共享,堆中不存放基本型

Java 記憶體機制

Java記憶體劃分 暫存器 :屬於硬體部分的內容,是cpu做處理的,程式設計師並不能過多的干涉。 棧記憶體: 儲存執行時的方法,區域性變數。變數運算區域一結束就會被釋放。 區域性變數: 方法

Java Integer和String記憶體儲存

先看程式碼: void foo() { Integer i1 = 2; Integer i2 = 2; Integer i3 = new Integer(2); System.out.println("i1 = i2? "

Java jvm 記憶體回收機制

在Java中,它的記憶體管理包括兩方面:記憶體分配(建立Java物件的時候)和記憶體回收,這兩方面工作都是由JVM自動完成的,降低了Java程式設計師的學習難度,避免了像C/C++直接操作記憶體的危險。但是,也正因為記憶體管理完全由JVM負責,所以也使Java很多程式