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不同的,所以兩者不相等.