search
java 知識點 - qq

java 知識點 - qq

java中equals和==的區別

1)對於==,如果作用於基本數據類型的變數,則直接比較其存儲的 「值」是否相等;

如果作用於引用類型的變數,則比較的是所指向的對象的地址

2)對於equals方法,注意:equals方法不能作用於基本數據類型的變數

如果沒有對equals方法進行重寫,則比較的是引用類型的變數所指向的對象的地址;

諸如String、Date等類對equals方法進行了重寫的話,比較的是所指向的對象的內容。

++i 與 i++的區別

(1)如果只是看i++和++i,這兩個是等價的,都等同於i=i+1,都是變數自身加1。
(2)在一般情況下,它們都是跟賦值聯繫在一起。
比如:
int a;
a=i++;//將i的值賦值給a,即a=i;然後再執行i=i+1;
也就是【a=i++;】與【a=i; i=i+1;】等價。
a=++i;//將i+1的值賦給a,即a=i+1;然後再執行i=i+1;
也就是【a=++i;】與【a=i+1;i=i+1;】等價。

(3)【總結一下】

①前置++是將自身加1的值賦值給新變數,同時自身也加1;

②後置++是將自身的值賦給新變數,然後才自身加1.java異常體系

1、Error與Exception

Error是程序無法處理的錯誤,比如OutOfMemoryError、ThreadDeath等。這些異常發生時,
Java虛擬機(JVM)一般會選擇線程終止。

Exception是程序本身可以處理的異常,這種異常分兩大類運行時異常和非運行時異常。
程序中應當儘可能去處理這些異常。

2、運行時異常和非運行時異常

運行時異常都是RuntimeException類及其子類異常,如NullPointerException、IndexOutOfBoundsException等,
這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,
程序應該從邏輯角度儘可能避免這類異常的發生。

非運行時異常是RuntimeException以外的異常,類型上都屬於Exception類及其子類。
從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。
如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。

3、throw、throws關鍵字
throw關鍵字是用於方法體內部,用來拋出一個Throwable類型的異常。

throws關鍵字用於方法體外部的方法聲明部分,用來聲明方法可能會拋出某些異常。

jvm內存模型

1、棧
Java棧是與每一個線程關聯的,JVM在創建每一個線程的時候,會分配一定的棧空間給線程。存儲局部變數、引用、方法、返回值等。

StackOverflowError:如果在線程執行的過程中,棧空間不夠用,那麼JVM就會拋出此異常,這種情況一般是死遞歸造成的。

2、堆

Java中堆是由所有的線程共享的一塊內存區域,堆用來保存各種JAVA對象,比如數組,線程對象等。

2.1堆的分代

JVM堆一般分為三個部分:

Young:年輕代

Young區被劃分為三部分,Eden區和兩個大小嚴格相同的Survivor區,其中Survivor區間中,某一時刻只有其中一個是被使用的,另外一個留做垃圾收集時複製對象用,在Young區間變滿的時候,minor GC就會將存活的對象移到空閑的Survivor區間中,根據JVM的策略,在經過幾次垃圾收集后,任然存活於Survivor的對象將被移動到Tenured區間。

Tenured:年老代

Tenured區主要保存生命周期長的對象,一般是一些老的對象,當一些對象在Young複製轉移一定的次數以後,對象就會被轉移到Tenured區,一般如果系統中用了application級別的緩存,緩存中的對象往往會被轉移到這一區間。

Perm:持久代

Perm代主要保存class,method,filed等對象,這部門的空間一般不會溢出。

java.lang.OutOfMemoryError : PermGen space 的錯誤,造成這個錯誤的很大原因就有可能是每次都重新部署,但是重新部署后,類的class沒有被卸載掉,這樣就造成了大量的class對象保存在了perm中,這種情況下,一般重新啟動應用伺服器可以解決問題。

2.2堆的大小

-Xmx:指定JVM堆得最大內存,在JVM啟動以後,會分配-Xmx參數指定大小的內存給JVM,但是不一定全部使用,JVM會根據-Xms參數來調節真正用於JVM的內存

-Xms :指定了JVM初始啟動以後初始化內存

-Xmx -Xms之差就是三個Virtual空間的總大小(年輕代、年老代、持久代)

3、棧與堆的比較:

棧是運行時的單位,而堆是存儲的單位。

棧解決程序的運行問題,即程序如何執行,或者說如何處理數據;堆解決的是數據存儲的問題,即數據怎麼放、放在哪兒。在Java中一個線程就會相應有一個線程棧與之對應,這點很容易理解,因為不同的線程執行邏輯有所不同,因此需要一個獨立的線程棧。而堆則是所有線程共享的。

對象存放在堆中,對象引用和基本類型存放在棧中;對象的屬性存放在堆中,對象的方法存在棧中。

程序運行永遠都是在棧中進行的,因而參數傳遞時,只存在傳遞基本類型和對象引用的問題。不會直接傳對象本身。

在JVM中,靜態屬性保存在Stack指令內存區,動態屬性保存在Heap數據內存區

JVM垃圾回收機制
分代垃圾回收
不同的對象生命周期不同。與業務信息有關的對象生命周期較長,如Http請求中的session對象、線程、socket連接。程序運行過程中的臨時變數生命周期較短,如String對象。
把不同生命周期的對象放在不同代上,不同代上採用最合適它的垃圾回收方式進行回收。JVM中共劃分為三個代:年輕代、年老代和持久代,其中持久代主要存放Java類的類信息,與垃圾收集要收集的Java對象關係不大,年輕代和年老代的劃分是對垃圾收集影響較大的。
年輕代:存放所有新生成的對象;
年老代:在年輕代中經歷了N次垃圾回收仍然存活的對象,將被放到年老代中,故都是一些生命周期較長的對象;
持久代:用於存放靜態文件,如Java類、方法等。(持久代對垃圾回收沒有顯著影響,但是有些應用可能動態生成或者調用一些class,例如Hibernate等,在這種時候需要設置一個比較大的持久代空間來存放這些運行過程中新增的類。)

新生代的垃圾收集器命名為「minor gc」,老生代的GC命名為"Full Gc 或者Major GC".其中用System.gc強制執行的是Full Gc.

判斷對象是否需要回收的方法有兩種:

1.引用計數
引用計數存儲對特定對象的所有引用數,也就是說,當應用程序創建引用以及引用超出範圍時,jvm必須適當增減引用數。當某對象的引用數為0時,便可以進行垃圾收集。
2.對象引用遍歷
早期的jvm使用引用計數,現在大多數jvm採用對象引用遍歷。對象引用遍歷從一組對象開始,沿著整個對象圖上的每條鏈接,遞歸確定可到達(reachable)的對象。如果某對象不能從這些根對象的一個(至少一個)到達,則將它作為垃圾收集。在對象遍歷階段,gc必須記住哪些對象可以到達,以便刪除不可到達的對象,這稱為標記(marking)對象。
下一步,gc要刪除不可到達的對象。刪除時,有些gc只是簡單的掃描堆棧,刪除未標記的未標記的對象,並釋放它們的內存以生成新的對象,這叫做清除(sweeping)。這種方法的問題在於內存會分成好多小段,而它們不足以用於新的對象,但是組合起來卻很大。因此,許多gc可以重新組織內存中的對象,並進行壓縮(compact),形成可利用的空間。
為此,gc需要停止其他的活動活動。這種方法意味著所有與應用程序相關的工作停止,只有gc運行。結果,在響應期間增減了許多混雜請求。另外,更複雜的gc不斷增加或同時運行以減少或者清除應用程序的中斷。有的gc使用單線程完成這項工作,有的則採用多線程以增加效率。幾種垃圾回收機制
1.標記-清除收集器
這種收集器首先遍歷對象圖並標記可到達的對象,然後掃描堆棧以尋找未標記對象並釋放它們的內存。這種收集器一般使用單線程工作並停止其他操作。
2.標記-壓縮收集器
有時也叫標記-清除-壓縮收集器,與標記-清除收集器有相同的標記階段。在第二階段,則把標記對象複製到堆棧的新域中以便壓縮堆棧。這種收集器也停止其他操作。
3.複製收集器
這種收集器將堆棧分為兩個域,常稱為半空間。每次僅使用一半的空間,jvm生成的新對象則放在另一半空間中。gc運行時,它把可到達對象複製到另一半空間,從而壓縮了堆棧。這種方法適用於短生存期的對象,持續複製長生存期的對象則導致效率降低。
4.增量收集器
增量收集器把堆棧分為多個域,每次僅從一個域收集垃圾。這會造成較小的應用程序中斷。
5.分代收集器
這種收集器把堆棧分為兩個或多個域,用以存放不同壽命的對象。jvm生成的新對象一般放在其中的某個域中。過一段時間,繼續存在的對象將獲得使用期並轉入更長壽命的域中。分代收集器對不同的域使用不同的演算法以優化性能。
6.併發收集器
併發收集器與應用程序同時運行。這些收集器在某點上(比如壓縮時)一般都不得不停止其他操作以完成特定的任務,但是因為其他應用程序可進行其他的後台操作,所以中斷其他處理的實際時間大大降低。
7.并行收集器
并行收集器使用某種傳統的演算法並使用多線程并行的執行它們的工作。在多cpu機器上使用多線程技術可以顯著的提高java應用程序的可擴展性。

熱門推薦

本文由 一點資訊 提供 原文連結

一點資訊
寫了5860316篇文章,獲得23271次喜歡
留言回覆
回覆
精彩推薦