原创 jvm原理(1)類加載器深入解析與階段分解

類加載 在Java代碼中,類型(class 、interface、 enum etc)的加載(將字節碼從磁盤加載到內存),連接(類與類之間的關係的連接)與初始化過程都是在程序運行期間完成的,加載,連接,初始化順序不是固定的,不同

原创 jvm原理(28)synchronized關鍵字所生成的字節碼詳細分析&&複雜字節碼文件的分析過程

前邊我們解析了一個字節碼文件,現在我們做一個比較複雜的字節碼文件的解析,程序如下: package com.twodragonlake.jvm.bytecode; public class MyTest2 { Stri

原创 jvm原理(25)Java字節碼文件結構剖析

編寫java文件: public class MyTest1 { private int a = 1; public int getA() { return a; } publi

原创 jvm原理(15)類加載器命名空間實戰剖析與透徹理解

新建類MyTest17_1: public class MyTest17_1 { public static void main(String[] args) throws Exception{ MyTe

原创 jvm原理(7)類加載器與類初始化深度剖析

exampleA: 打印結果是3 ,並且靜態代碼塊不會執行,原因是x是常量,在編譯期就會放到MyTest8的常量池當中,然後FinalTest和MyTest8就沒有任何關係了,可以通過反編譯的結果看到。 把x的final去

原创 jvm原理(5)類加載器深入解析及重要特性剖析

類進入內存的過程: 類的加載的最終產品是位於內存中的Class對象。 Class對象封裝了類在方法區內的數據結構,並且向Java程序員提供了訪問方法區的數據的接口。類是反射的入口。 有兩種類型的類加載器: Java虛擬機自

原创 jvm原理(6)類加載器雙親委託機制詳解

類加載器層級: 類加載器的父類委託機制 在父類委託機制中,各個加載器按照按照父子關係形成樹形結構(邏輯意義的樹形結構),除了根類加載器之外,其餘的類加載器都有且只有一個父加載器。 加載過程舉例: loader1

原创 jvm原理(3)編譯期常量與運行期常量的區別及數組創建本質分析

上一個例子我們用的final是一個字面量“hello world”,這次我們改一下使用UUID爲常量賦值,注意:UUID是多少隻有在運行期間纔會被確定。 public class MyTest3 { public stat

原创 jvm原理(4)接口初始化規則與類加載器準備階段和初始化階段的重要意義

先看一段代碼: public class MyTest5 { public static void main(String[] args) { System.out.println(MyChild5.b

原创 jvm原理(2)常量的本質含義與反編譯及助記符詳解

先運行一段程序: public class MyTest2 { public static void main(String[] args) { System.out.println(MyParent2.

原创 netty源碼分析(二十五)Netty自定義協議與TCP粘包拆包問題解決之道

上一節說了TCP的粘包和拆包,用一個實例的方式做了說明,那麼在netty裏面是怎麼解決粘包和拆包問題呢,這就需要編解碼器,我們寫一個簡單的自動以協議的demo,說明一下編解碼器在解決tcp粘包和拆包的解決方式。 先羅列一下服務端

原创 jvm原理(37)JVM內存空間劃分與作用詳解

JVM內存區域分了如下幾個區域: 虛擬機棧(Stack Frame) 在執行一個方法的時候,會有一個棧幀,用來存儲,方法裏邊的操作數的出棧入棧,當java文件編譯完成的時候,max_stack(棧最大的深度),max_local(最大

原创 jvm原理(35)基於棧的指令集與基於寄存器的指令集詳細比對&執行棧指令集實例剖析

基於棧的指令集與基於寄存器的指令集詳細比對 現代JVM在執行Java代碼的時候,通常都會將解釋執行與編譯執行二者結合起來進行。 所謂解釋之行,就是通過解釋器來讀取字節碼,遇到相應的指令就去執行該指令。 所謂編譯執行,就是通過即時編譯器

原创 jvm原理(36)透過字節碼生成審視Java動態代理運作機制

我們在使用spring這類框架的時候,基於動態代理的使用,比如AOP,會使得開發更加靈活,那麼在字節碼的層面動態代理是什麼樣子的呢,生成出來的代理類結構是什麼,本次我們首先寫一個動態代理的例子,然後得到生成的動態代理類。 定義接口:

原创 jvm原理(33)通過字節碼分析Java方法的靜態分派與動態分派機制(invokevirtual 指令)

編寫代碼: public class MyTest6 { public static void main(String[] args) { Fruit apple = new Apple();