1.內存管理-----Java虛擬機

1.簡介

以上個區域只是表示內存模型,並不代表各個區域的大小或者所佔比例

2.程序計數器

3.Java 虛擬機棧

 

StackOverFlowError(棧溢出)

(一般遞歸調用方法時,如果沒有截止條件,就會一直向虛擬棧中壓入方法的棧幀,直到超過虛擬棧的內存,就會拋出該異常)

OutOfMemoryError(內存溢出)

這種異常在單線程運行環境中應該是不會出現的,因爲一般會先拋出StackOverFlowError,多線程的話,因爲總的進程的大小是固定的,所以,如果線程比較多,佔用的內存就比較大,棧深度還沒達到StackOverFlowError,內存已經不夠了,申請不到內存就拋出了OutOfmemoryError

4.本地方法棧

虛擬機棧是爲虛擬機執行java方法服務的,

本地方法棧是爲虛擬機執行native方法服務的.

HotSpot 虛擬機中本地方法棧與虛擬機棧合併在了一起,佔同一塊內存

5.Java堆

作用: 存儲對象實例(所有的實例都存放在堆中)

又分爲新生代,老年代等,這樣劃分主要是爲了垃圾回收,具體在垃圾回收機制中瞭解.

6.方法區

 

垃圾回收很少會出現在這一部分,但是也會有(以後再說),這裏主要是瞭解方法去的作用,主要就是加載類信息,常量,靜態變量等...

7.運行時常量池

是方法區的一塊,用於存放編譯期生成的各種字面量(可以理解爲字符串的值),和符號,

總之:直接通過s1與s2這種形式聲明的字符串是放在運行時常量池中的StringTable(類似hashset結構)中的,在s1聲明之後,運行時常量池已經有了字面量爲abc 了,這時,再聲明s2時,只是將abc的引用賦值給了s2,其實就是s1的值,所以兩者是相等的.

通過new 得到的字符串s3則走的是不同對象實例的創建過程,該實例存儲在堆中,所以其引用肯定是與s1不同的,所以兩者不相等.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章