原创 【JVM】GCRoots和JVM的參數配置

如何理解GCRoots? 爲了解決引用計數法的循環引用問題,Java使用了可達性分析的方法。GC Roots是一組活躍的引用,通過一系列名爲GC Roots的對象作爲起始點,沿着該對象向下搜索,如果一個對象到GC Roots沒有任何引用鏈相

原创 【JVM】如何理解強引用、軟引用、弱引用、虛引用?

整體架構 強引用 強引用是默認支持,當內存不足的時候,JVM開始垃圾回收,對於強引用的對象,就算是出現了OOM也不會回收對象。 強引用是最常見的普通對象引用,只要還有強引用指向對象,對象就存活,垃圾回收器不會處理存活對象。一般把一個對象賦

原创 【JUC】CAS(Compare And Swap)及其ABA問題

CAS和AtomicInteger AtomicInteger用來保證自增原子性,它的實現是基於CAS(比較和交換)的。 CAS(CompareAndSwap):判斷內存某個位置的值是否與預期值一致,如果是則更改爲新值,這個過程是原子的。不

原创 【JUC】手寫多線程的題目小結

簡單的線程池,體現線程的複用 不使用Executors.newFixedThreadPool(int)、Executors.newSingleThreadExecutor()、Executors.newCachedThreadPool(),

原创 【JVM】垃圾回收的四大算法

GC垃圾回收 JVM大部分時候回收的都是新生代(伊甸區+倖存0區+倖存1區)。按照回收的區域可以分成兩種類型:Minor GC和Full GC(MajorGC)。 Minor GC:只針對新生代區域的GC,大多數Java對象的存活率都不高

原创 【Leetcode】560. 和爲K的子數組&974. 和可被 K 整除的子數組(前綴和+哈希表)

    1 public class Solution { 2 public int subarraySum(int[] nums, int k) { 3 int count = 0, pre = 0;

原创 【JUC】實現多線程的第三種方式Callable

實現線程的三種方式比較 1. 繼承Thread類 1 class ExtendsThread extends Thread{ 2 public void run(){ 3 System.out.println

原创 面試中很值得聊的二叉樹遍歷方法——Morris遍歷

Morris遍歷 通過利用空閒指針的方式,來節省空間。時間複雜度O(N),額外空間複雜度O(1)。普通的非遞歸和遞歸方法的額外空間和樹的高度有關,遞歸的過程涉及到系統壓棧,非遞歸需要自己申請棧空間,都具有O(N)的額外空間複雜度。 Morr

原创 【JUC】死鎖的實現及其定位分析

死鎖的概念 兩個或兩個以上的進程在執行過程中,因搶奪資源而造成的一種互相等待的現象,若無外力干涉,它們都無法繼續推進,如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。      

原创 動態規劃的解題思路是如何形成的

機器人走路問題 一個機器人可以在1~N上行走,每一步可以向前或向後走,給定起點S > 1,終點 < N,每一次行走K步,機器人從S走到E一共有多少種方法。 暴力遞歸     暴力遞歸存在大量重複的遞歸過程。可以用空間換取時間,記錄可能出

原创 【JVM】堆體系結構及其內存調優

堆體系結構 一個JVM實例只存在一個堆內存,堆內存的大小是可調節的。類加載器讀取類文件後,需要把類、方法、常量、變量放在堆內存中,保存所有引用類型的真實信息,以方便執行器指向,堆內存分爲三個部分:年輕代、老年代、永久代。 Java7之前,堆

原创 【JUC】如何理解線程池?第四種使用線程的方式

線程池的概念 線程池的主要工作的控制運行的線程的數量,處理過程種將任務放在隊列,線程創建後再啓動折現任務,如果線程數量超過了最大的數量,則超過部分的線程排隊等待,直到其他線程執行完畢後,從隊列種取出任務來執行。 處理流程: 1.線程池判斷核

原创 可憐的實驗鼠和小豬問題

8杯水裏,一杯水中1種毒藥,喝下去馬上就會毒發,需要至少幾隻實驗鼠能測出來哪杯有毒? 3只。 馬上毒發:實驗鼠有兩種狀態,可以視爲0死亡,1存活。 3只鼠,一共就有2^3=8種狀態,通過鼠的8種狀態可以來判斷哪杯水有毒。 000,001,0

原创 【JVM】體系結構及其細節

JVM JVM運行在操作系統之上,與硬件沒有直接的交互。引入Java語言虛擬機後,Java語言在不同平臺上運行時不需要重新編譯。Java語言使用Java虛擬機屏蔽了與具體平臺相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行