java 基础知识部分提炼
1.new 對象和 聲明對象區(qū)別
People p = new?People (); 和 Poeple p;?
前者是在堆上面創(chuàng)建了內(nèi)存空間而且p指向了該空間。后者只是一個空指針,沒有指向任何存儲地址。
如果 將上述的p = man;那么前者和后者就都一樣了,只是第一種方式聲明的對象空間被丟棄,在垃圾回收的時候被釋放回收。
2.static修飾類
對于內(nèi)部類,為了將其對于其他類可見,而且不用先聲明父類,再調(diào)用這個子類。那么這樣就可以將這個內(nèi)部類聲明稱static。
3.private、protected 和public都可以聲明構(gòu)造方法,對于單例模式一般構(gòu)造方法為private,而newinstance為public static類型,防止使用者直接使用構(gòu)造方法構(gòu)造對象。
4.Java目前有9對應(yīng)jdk是1.9,那么jdk1.5,1.6,1.7,1.8,對應(yīng)Java分別是5,6,7,8。
5.Java幾種垃圾回收器
這四種垃圾收集器每一種都有自己的優(yōu)點與不足。最重要的是,我們開發(fā)人員可以選擇Java虛擬機使用的垃圾收集器的類型。我們可以通過傳從參數(shù)的形式,來選擇它們。每一種垃圾收集器都有非常大的特點,都可以提供完全不同的性能。必須嚴謹而準確地理解這集中垃圾收集器,然后基于應(yīng)用的使用情況正確選擇。
1. Serial Garbage Collector
Serial Garbage Collector通過暫停所有應(yīng)用的線程來工作。它是為單線程工作環(huán)境而設(shè)計的。它中使用一個線程來進行垃圾回收。這種暫停應(yīng)用線程來進行垃圾回收的方式可能不太適應(yīng)服務(wù)器環(huán)境。它最適合簡單的命令行程序。
通過?-XX:+UseSerialGC?參數(shù)來選用Serial Garbage Collector。
2. Parallel Garbage Collector
Parallel Garbage Collector也被稱為吞吐量收集器(throughput collector)。它是Java虛擬機的默認垃圾收集器。與Serial Garbage Collector不同,Parallel Garbage Collector使用多個線程進行垃圾回收。與Serial Garbage Collector相似的地方時,它也是暫停所有的應(yīng)用線程來進行垃圾回收。
3. CMS Garbage Collector
Concurrent Mark Sweep (CMS) Garbage Collector使用多個線程來掃描堆內(nèi)存來標記需要回收的實例,然后再清除被標記的實例。CMS Garbage Collector只有在如下兩種情景才會暫停所有的應(yīng)用線程:
相比Parallel Garbage Collector,CMS Garbage Collector使用更多的CPU資源來確保應(yīng)用有一個更好的吞吐量。如果分配更多的CPU資源可以獲得更好的性能,那么CMS Garbage Collector是一個更好的選擇,相比Parallel Garbage Collector。
通過?XX:+USeParNewGC?參數(shù)來選用CMS Garbage Collector。
4. G1 Garbage Collector
G1 Garbage Collector用于大的堆內(nèi)存區(qū)域。它將堆內(nèi)存分割成多個獨立區(qū)域(Region),然后并發(fā)地對它們進行垃圾回收。在釋放內(nèi)存后,G1還可以壓縮空閑的堆內(nèi)存。但是,CMS Garbage Collector是通過“Stop The World (STW)”來進行內(nèi)存壓縮的。G1優(yōu)先收集可回收更多內(nèi)存的區(qū)域。
通過?–XX:+UseG1GC?參數(shù)來選用G1 Garbage Collector。
Java 8 的改進
在用G1 Garbage Collector時,可以開啟?-XX:+UseStringDeduplication?參數(shù)。它通過將重復(fù)的字符串移動到同一個?char?數(shù)組中來優(yōu)化堆內(nèi)存的使用。該選項在Java 8u20時引用進來。
上面給出了四種垃圾收集器的介紹,至于選用哪個垃圾收集器,這個要根據(jù)應(yīng)用場景、可用的硬件資源以及吞吐量的要求來確定。
Java虛擬機中的垃圾回收選項
下面是與Java收集器相關(guān)的Java虛擬機選項。
垃圾收集器選擇
| -XX:+UseSerialGC | Serial Garbage Collector |
| -XX:+UseParallelGC | Parallel Garbage Collector |
| -XX:+UseConcMarkSweepGC | CMS Garbage Collector |
| -XX:ParallelCMSThreads= | CMS Collector – 使用的線程數(shù) |
| -XX:+UseG1GC | G1 Gargbage Collector |
垃圾回收優(yōu)化選項
| -Xms | 堆內(nèi)存初始化尺寸 |
| -Xmx | 堆內(nèi)存最大尺寸 |
| -Xmn | 新生代(Young Generation)的尺寸 |
| -XX:PermSize | 永久代(Permanent Generation)初始化尺寸 |
| -XX:MaxPermSize | 永久代(Permanent Generation)最大尺寸 |
Java虛擬機垃圾回收選項的使用示例
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar 對于內(nèi)存的劃分和管理,一般是操作系統(tǒng)(不管是什么編譯器編譯的程序)。但是對于Java虛擬機需要管理自己的內(nèi)存堆,那么必然對內(nèi)存堆有自己的分區(qū),而且不同版本 的jvm對內(nèi)存的劃分不一樣。6.Java 對象數(shù)組
?Object[] objArr = new?Object[1000]; ?
String[] strarry = new String[10]; String[] strarry = {"","","","","",""};
7.java 中四大引用 -- 強引用,軟引用,弱引用和虛引用。
強引用:無論內(nèi)存是否足夠,不會回收,即使爆出來oom也不會回收。
軟引用:內(nèi)存不足時,回收該引用關(guān)聯(lián)的對象。
弱引用:垃圾回收時,無論內(nèi)存是否足夠,都會回收。
虛引用:任何時候都可能被垃圾回收器回收。
強引用只要有指針指向該堆,那么GC就不會回收,即使拋出來oom。這個指針變量可以是局部變量,在所在的方法執(zhí)行完,已經(jīng)出棧,那么局部指針就不存在了,那么GC可以回收。但是一個方法內(nèi)創(chuàng)建很多的局部對象,或者對象數(shù)組,那么方法還沒有出棧,那么GC就算oom也不會回收。除非每執(zhí)行完一個局部指針將指針置為空。 run() { Object obarr = new Object[10000]; Object obarr1 = new Object[10000]; ... }
軟引用(內(nèi)存不夠即回收),弱引用(垃圾回收即回收)和虛引用(隨時可能回收)在回收的時候首先GC會判斷能不能使用到,有沒有指向到,指向到肯定不會被回收。沒有指向或者調(diào)用,那么就被回收。一般使用這三種引用是在創(chuàng)建較大的存儲空間,如圖片,文件緩存對象,或者較大的對象數(shù)組。
8.transient 和 volatile 關(guān)鍵字 ?-- 線程安全和防止序列化
transient
transient是類型修飾符,只能用來修飾字段。在對象序列化的過程中,標記為transient的變量不會被序列化。
示例:
class Test {transient int a; // 不會被持久化
int b; // 持久化
}
當類Test的實例對象被序列化(比如將Test類的實例對象 t 寫入硬盤的文本文件t.txt中),變量 a 的內(nèi)容不會被保存,變量 b 的內(nèi)容則會被保存。
參考:
把一個對象的表示轉(zhuǎn)化為字節(jié)流的過程稱為串行化(也稱為序列化,serialization),從字節(jié)流中把對象重建出來稱為反串行化(也稱為為反序列化,deserialization)。transient 為不應(yīng)被串行化的數(shù)據(jù)提供了一個語言級的標記數(shù)據(jù)方法。
volatile
volatile也是變量修飾符,只能用來修飾變量。volatile修飾的成員變量在每次被線程訪問時,都強迫從共享內(nèi)存中重讀該成員變量的值。而且,當成員變量發(fā)生變化時,強迫線程將變化值回寫到共享內(nèi)存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。
在此解釋一下Java的內(nèi)存機制:
Java使用一個主內(nèi)存來保存變量當前值,而每個線程則有其獨立的工作內(nèi)存。線程訪問變量的時候會將變量的值拷貝到自己的工作內(nèi)存中,這樣,當線程對自己工作內(nèi)存中的變量進行操作之后,就造成了工作內(nèi)存中的變量拷貝的值與主內(nèi)存中的變量值不同。
9.Java 并發(fā)與并發(fā)容器 -- ConcurrentCopyOnWriteArrayList與Copy-On-Write策略
Copy-On-Write簡稱COW,是一種用于程序設(shè)計中的優(yōu)化策略。其基本思路是,從一開始大家都在共享同一個內(nèi)容,當某個人想要修改這個內(nèi)容的時候,才會真正把內(nèi)容Copy出去形成一個新的內(nèi)容然后再改,這是一種延時懶惰策略。從JDK1.5開始Java并發(fā)包里提供了兩個使用CopyOnWrite機制實現(xiàn)的并發(fā)容器,它們是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并發(fā)場景中使用到。
CopyOnWrite容器即寫時復(fù)制的容器。通俗的理解是當我們往一個容器添加元素的時候,不直接往當前容器添加,而是先將當前容器進行Copy,復(fù)制出一個新的容器,然后新的容器里添加元素,添加完元素之后,再將原容器的引用指向新的容器。這樣做的好處是我們可以對CopyOnWrite容器進行并發(fā)的讀,而不需要加鎖,因為當前容器不會添加任何元素。所以CopyOnWrite容器也是一種讀寫分離的思想,讀和寫不同的容器。
CopyOnWrite容器只能保證數(shù)據(jù)的最終一致性,不能保證數(shù)據(jù)的實時一致性。所以如果你希望寫入的的數(shù)據(jù),馬上能讀到,請不要使用CopyOnWrite容器。
ConcurrentLinkedQueue
在并發(fā)編程中,有時候需要使用線程安全的隊列或列表。通常實現(xiàn)線程安全有兩種方式,一種是使用阻塞算法,一種是使用非阻塞算法。非阻塞算法實現(xiàn)基礎(chǔ)為循環(huán)CAS(Compare and Swipe 比較和交換)。
ConcurrentLinkedQueue技術(shù)上的實現(xiàn)與CopyOnWriteArrayList與Copy類似,但是容器只有部分內(nèi)容而不是整個容器可以被復(fù)制和修改。ConcurrentLinkedQueue有head節(jié)點和tail節(jié)點組成,每個節(jié)點由節(jié)點元素(item)和指向下一個結(jié)點(next)的引用組成。節(jié)點之間通過next關(guān)聯(lián)起來,形成一張鏈表結(jié)構(gòu)的隊列。
ConcurrentHashMap與鎖分段技術(shù)
ConcurrentHashMap是線程安全且高效的HashMap。多線程環(huán)境下,使用非線程安全的HashMap會導(dǎo)致死循環(huán),而如文章中建議的那樣,HashTable這種過時容器效率低下(使用synchronized來保證線程安全)。ConcurrentHashMap使用鎖分段技術(shù),大大提高了并發(fā)使用的效率。
鎖分段技術(shù): 假設(shè)容器有多把鎖,每一把鎖用于鎖容器其中一部分數(shù)據(jù),當多線程訪問容器不同數(shù)據(jù)段數(shù)據(jù)時,線程間就不存在鎖競爭,從而提高并發(fā)訪問效率。
方法重寫:它是指子類和父類的關(guān)系,子類重寫了父類的方法,但方法名、參數(shù)類型、參數(shù)個數(shù)必須相同!
總結(jié)
以上是生活随笔為你收集整理的java 基础知识部分提炼的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 格式格式:YYYYMM
- 下一篇: toolbar + DrawerLayo