HashMap簡介
HashMap 是一個散列表,它存儲的內容是鍵值對(key-value)映射。
HashMap 繼承於AbstractMap,實現了Map、Cloneable、java.io.Serializable接口。
HashMap 的實現不是同步的,這意味着它不是線程安全的,但能夠用 Collections的synchronizedMap方法使HashMap具備線程安全的能力。它的key、value均可覺得null。此外,HashMap中的映射不是有序的。
HashMap 的實例有兩個參數影響其性能:「初始容量」 和 「加載因子」。初始容量默認是16。默認加載因子是 0.75, 這是在時間和空間成本上尋求一種折衷。加載因子太高雖然減小了空間開銷,但同時也增長了查詢成本.
HashMap是數組+鏈表+紅黑樹(JDK1.8增長了紅黑樹部分)實現的,當鏈表長度太長(默認超過8)時,鏈表就轉換爲紅黑樹.java
Java運行時數據區域?
包括程序計數器、JVM棧、本地方法棧、方法區、堆
方法區裏存放什麼?
本地方法棧:和jvm棧所發揮的做用相似,區別是jvm棧爲jvm執行java方法(字節碼)服務,而本地方法棧爲jvm使用的native方法服務。
JVM棧:局部變量表、操做數棧、動態連接、方法出口。
方法區:用於存儲已被虛擬機加載的類信息,常量、靜態變量、即時編譯器編譯後的代碼等。
堆:存放對象實例。redis
Full GC觸發條件:算法
(1)調用System.gc時,系統建議執行Full GC,可是沒必要然執行數組
(2)老年代空間不足緩存
(3)方法去空間不足安全
1.hashMap能夠有null的鍵,concurrentMap不能夠有
2.hashMap是線程不安全的,在多線程的時候須要Collections.synchronizedMap(hashMap),ConcurrentMap使用了重入鎖保證線程安全。
3.在刪除元素時候,二者的算法不同。
ConcurrentHashMap和Hashtable主要區別就是圍繞着鎖的粒度以及如何鎖,能夠簡單理解成把一個大的HashTable分解成多個,造成了鎖分離。數據結構
JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。
類加載的五個過程:加載、驗證、準備、解析、初始化。多線程
一致性(Consistency)
可用性(Availability)
分區容忍性(Partition tolerance)併發
線程池(Thread Pool)對於限制應用程序中同一時刻運行的線程數頗有用。由於每啓動一個新線程都會有相應的性能開銷,每一個線程都須要給棧分配一些內存等等。負載均衡
咱們能夠把併發執行的任務傳遞給一個線程池,來替代爲每一個併發執行的任務都啓動一個新的線程。只要池裏有空閒的線程,任務就會分配給一個線程執行。在線程池的內部,任務被插入一個阻塞隊列(Blocking Queue ),線程池裏的線程會去取這個隊列裏的任務。當一個新任務插入隊列時,一個空閒線程就會成功的從隊列中取出任務而且執行它。
LinkedHashMap是經過哈希表和鏈表實現的,它經過維護一個鏈表來保證對哈希表迭代時的有序性,而這個有序是指鍵值對插入的順序。
RPC主要的重點有:
動態代理,主要是invoke反射原理
序列化,使用Thrift的效率高
通訊方式,使用Netty的NIO能提升效率
服務發現,使用zookeeper能夠實現
Eureka遵照AP zookeeper
ACID 原子性 一致性 獨立性 持久性
CAP 強一致性 可用性 分區容錯
Zookeeper保證CP
Eureka則是AP
HashMap是非線程安全的,Hashtable是線程安全的。
HashMap的鍵值均可覺得null,Hashtable的鍵值都不能夠爲null值。
HashMap繼承自AbstractMap類,Hashtable繼承自Dictionary類。
ps : Properties類繼承自Hashtable類。
引用計數
複製
標記-清除
標記-壓縮
分代(新生代、老年代、永久代)
串行回收器:新生代串行回收器、老年代串行回收器
並行回收器:新生代ParNew回收器、新生代ParallelGC回收器、老年代ParallelGC回收器
CMS回收器:(Concurrent Mark Sweep、併發標記清除)
G1回收器(1.7之後代替CMS回收器)
標準參數:
-client -server模式
-Xmn、-Xms、-Xmx
監控:jps、jstat、jinfo、jmap、jhat、jstack…
JVM 中堆和棧屬於不一樣的內存區域,使用目的也不一樣。
棧經常使用於保存方法幀和局部變量,而對象老是在堆上分配。
棧一般都比堆小,也不會在多個線程之間共享,而堆被整個 JVM 的全部線程共享。
memcache把數據存在內存之中,斷電後會掛掉;Redis部分數據持久化在硬盤上,斷電不會丟失。
memcache存的是key-value對,redis支持更多的數據結構和數據類型
memcache可使用一致性hash作分佈式,redis能夠作主從同步
redis單線程,只使用1個cpu
使用一致性哈希對數據進行映射
實現方式:客戶端分片(每一個客戶端對應一個分片)、代理協助分片、查詢路由分片;
使用redis集羣,如codis(豌豆莢,依賴zookeeper);
zookeeper做爲分佈式應用協調系統,已經用到不少分佈式項目中。
能夠用來完成統一命名服務、狀態同步服務、集羣管理、分佈式應用配置項等管理工做。
zookeeper的主要操做分一下幾種:
建立節點
讀取節點數據
更新節點數據
刪除節點
監控節點變化
應用場景:
統一命名服務,使用create自動建立節點編號;
配置管理,多個節點的共享配置,當配置發生變化時,可利用zookeeper讓使用這些配置的節點得到通知,進行從新加載等操做。如dubbo服務。
集羣管理:集羣選舉主節點,資源定位。
共享鎖
負載均衡
應用項目:
dubbo服務集羣、redis集羣、Hadoop集羣等
Dubbo是一個分佈式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。