原创 使用註解管理spring bean生命週期

Bean生命週期註解大致有這麼多,創建並註冊Bean,bean初始化與銷燬,以及scope、conditional、primary、lazy等註解。 bean的初始化與銷燬 BeanPostProcessor工作原理 我們給自定義的po

原创 Java數組foreach賦值不生效的問題

問題是我在完成LeetCode第23題時遇到的,我採用的是最小堆加上遞歸的解決方式。遞歸中,我對參數數組lists做了foreach,並且賦值,發現lists的值不會改變,結果是棧溢出。 當改成直接修改數組元素時AC。 for (int

原创 徹底搞清楚class常量池、運行時常量池、字符串常量池

徹底搞清楚class常量池、運行時常量池、字符串常量池 常量池-靜態常量池 也叫 class文件常量池,主要存放編譯期生成的各種字面量(Literal)和符號引用(Symbolic References)。 字面量:例如文本字符串、fin

原创 如何查找對應的JVM參數

JVM參數選項 # 查看標準選項 java -help # 查看-X選項 java -X # 查看高級選項 -XX java -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnostic

原创 JVM故障運維工具的使用

JVM故障運維工具 1 jps 查看進程pid jps 2 jmap 查看堆內存 1 用來查看內存信息,實例個數以及佔用內存大小 #查看歷史生成的實例 jmap -histo <pid> > ./log.txt #查看當前存活的實例,執

原创 JDK8打印並分析GC日誌

1 JDK8打印並分析GC日誌 1.1 打印日誌 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+UseSerialGC -Xmx1m -Xlog

原创 Java對象創建流程

1 對象的創建 對象創建的主要流程: 1.類加載檢查 虛擬機遇到一條new指令時,首先將去檢查這個指令的參數是否能在常量池中定位到一個類的符號引用,並且檢查這個符號引用代表的類是否已被加載、解析和初始化過。如果沒有,那必須先執行相應的類加

原创 Java對象內存模型

2 Java對象內存模型 在HotSpot虛擬機中,對象在內存中存儲的佈局可以分爲3塊區域:對象頭(Header)、 實例數據(Instance Data)和對齊填充(Padding)。 在 JVM 中,Java對象保存在堆中時,由以下三

原创 對象內存分配過程

對象內存分配流程圖 3.1 棧上分配 Java對象都是在堆上進行分配,在對象沒有被引用時,依賴GC回收內存。當對象數量過多,便會給GC帶了較大壓力,影響應用性能。JVM提供了棧上分配機制,用於減少臨時對象在堆上的分配數量。 JVM通過逃逸

原创 編譯器優化:方法內聯

方法內聯的思想是,把目標方法的代碼複製代發起調用的方法之中,避免發生真實的方法調用。 public class InlineTest { private static int add1(int x1, int x2, int x3,

原创 編譯器優化機制詳解

編譯器優化機制詳解 1 字節碼是如何執行的? 主要包含解釋執行(由解釋器一行一行翻譯執行)和編譯執行(將字節碼編譯成機器碼,直接執行機器碼)。 解釋執行:優勢在於沒有編譯的等待時間,性能相對編譯執行差。 編譯執行:運行效率高,比解釋執行快

原创 徹底剖析JVM類加載機制

本文仍然基於JDK8版本,從JDK9模塊化器,類加載器有一些變動。 0 javac編譯 java代碼 public class Math { public static final int initData = 666;

原创 JVM垃圾收集器專題

垃圾收集器:利用垃圾收集算法,實現垃圾回收的實踐落地。 1 HotSpot垃圾回收器 HotSpot垃圾回收器有多個,可以配合使用。 1.1 垃圾回收的一些術語 術語: Stop the world 簡寫爲STW,也叫全局停頓,Java代

原创 CPU使用率過高問題定位

1 CPU使用率過高問題定位 1.1 配合使用top+jstack定位(重要) 首先使用top找到CPU使用率最高的進程。 接着查看36032進程的線程情況。 top -Hp 36032 找到36044線程CPU佔用率最高,然後將線程

原创 逃逸分析、標量替換、棧上分配

逃逸分析:分析變量是否逃出它的作用域 全局變量賦值逃逸 方法返回值逃逸 實例引用逃逸 線程逃逸:賦值給類變量或者可以在其他線程中訪問的實例變量 public class EscapeTest { public static So