原创 JVM的體系架構

    JVM分爲四個部分,分別是類加載器、內存結構、命令解析器、本地接口。  

原创 不同JDK版本的intern( )方法

主要區別: DK1.6及以前,調用String.intern(),如果常量池中沒有,則拷貝一份對象,放到常量池中。 JDK1.7及以後,調用String.intern(),如果常量池中沒有,則拷貝一份引用,放到常量池中。 (1.

原创 從synchronized關鍵字談起的一系列問題

若一個方法存在併發安全問題,用synchronized關鍵字解決最簡單的同步問題: public class Test { public static void lockTest(){ synchroniz

原创 基於NIO的羣聊系統簡單實現

實例要求: (1)編寫一個NIO多人羣聊系統,實現服務器端和客戶端之間的數據簡單通訊(非阻塞) (2)服務器端:可以監測用戶上線、離線,並實現消息轉發功能 (3)客戶端:通過channel可以無阻塞發送消息給其它所有用戶,同時可以

原创 你知道StringBuffer是如何擴容的嗎?

來看一下源碼,在沒有傳參的情況下默認構造初始容量爲16的空字符緩衝區。 public StringBuffer() { super(16); } 有參數的情況下,初始容量是16+字符串的長度,然後用append()方法將

原创 兩分鐘帶你搞定常見垃圾收集器!

(1)JVM的運行模式 Server Client Client的啓動比Server模式快,但是長期運行進入穩定期後Server模式的程序運行速度會比Client快,這是因爲Server模式啓動的是重量級的JVM,對程序進行了更多了優化。

原创 什麼是線程池?如何創建一個Java線程池?

一個線程池管理了一組工作線程,同時它還包括了一個用於放置等待執行的任務的隊列。線程池可以避免線程的頻繁創建與銷燬,降低資源的消耗,提高系統的反應速度。java.util.concurrent.Executors提供了幾個java.util

原创 線程的start和run方法的區別

run方法需要我們進行重寫,裏面就是我們規定線程去執行的邏輯操作,而start方法是用來新建一個線程,使它獲得執行的必備資源,進入就緒狀態,等待CPU的調度,一旦獲得CPU資源後就會進入運行狀態,執行run方法。

原创 秒懂JDK14的幾個重要特性

一、instanceof的模式匹配 Instanceof是java中用於檢查對象引用是否爲給定Type類型的實例,並返回布爾值。在Java 14之前,我們在完成判斷之後,經常需要做一下類型的強制轉換,如下: Java 14增強功能特性:

原创 怎麼對垃圾進行回收?(回收算法)

標記-清除算法(Mark and Sweep) 標記:從根集合進行掃描,對存活的對象進行標記 清除:對堆內存進行遍歷,回收未標記的對象 缺點就是因爲不需要對對象內存位置進行重新排列,會造成很多大量不連續的內存碎片。   複製算法(Cop

原创 如何判斷對象是否爲垃圾?(垃圾標記算法)

(1)對象被判定爲垃圾的標準? 沒有被其他對象引用   (2)怎麼判斷對象是否爲垃圾(垃圾標記算法)? 引用計數算法 通過判斷對象的引用數量來決定對象是否被可回收,每個對象都有一個引用計數器,被引用則+1,完成引用則-1,任何引用計數爲0

原创 強引用、軟引用、弱引用和虛引用有什麼用?

強引用 強引用是最普遍的引用,例如:Object obj=newObject(),當對象爲強引用時,JVM就算拋出OOM終止程序也不會強制回收強引用對象,如果不使用該對象,可以使該對象設置爲null來弱化引用,或者超出生命週期,使其被回收

原创 JDK7和JDK8的JVM內存結構的區別

1、方法區變化 1.8同1.7比,最大的差別就是:元數據區取代了永久代。元空間的本質和永久代類似,都是對JVM規範中方法區的實現。 1)方法區與永久代的區別? 方法區只是JVM規範定義,而永久代爲具體的實現,元空間也是方法區在JDK1.8

原创 堆內存劃分(新生代、老年代)

在 Java 中,堆被劃分成兩個不同的區域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被劃分爲三個區域:Eden、From Survivor、To Survivor。 這樣劃分的目的是爲了使 JVM

原创 秒懂ThreadLocal及其引發的內存泄露!

ThreadLocal是Java中的一種線程綁定機制,可以爲每一個使用該變量的線程都提供一個變量值的副本,並且每一個線程都可以獨立地改變自己的副本,而不會與其它線程的副本發生衝突,解決了變量併發訪問的衝突問題。 每個線程內部有一個 Thr