JVM深入淺出(二)

Java代碼的執行流程以及字節碼

對於碼農來說,寫的都是一個一個的xxx.java文件,只有碼農認識,機器是不認識這些文件的。這一堆的java文件必須要經過一個編譯的過程,變成一堆的xxx.class文件,這個class文件是放在方法區裏面(jdk1.8是MetaSpace)。
這一堆的xxx.class文件要通過ClassLoader加載到運行時數據區。
在這裏插入圖片描述

代碼舉例說明:
編寫一個java文件,
在這裏插入圖片描述
編寫之後編譯一下,可以到相應的目錄看到.class文件
在這裏插入圖片描述
那麼如何通過這個class文件拿到字節碼呢?可以用javap這個命令(看幫助)
可以通過javap -c JVMDemo.class,顯示的就是字節碼
在這裏插入圖片描述
從上面可以看出,public class JVM.JVMDemo這個類裏面有兩大部分組成,一個是構造器,一個是main方法。
看詳細信息,可以這樣執行:javap -verbose -c JVMDemo.class
可以看到很多很多字節碼信息,從這些信息可以一步一步推斷出java代碼是怎樣的,很多反編譯工具就是這樣做的。這個地方以後有時間慢慢學習,這裏不講了。

https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.3

JVM運行時數據區

JVM是支持多線程執行的。每個線程都會有一個它自己的計數器,也都會一個它自己的JVM虛擬機棧。程序計數器、虛擬機棧、本地方法棧都是線程私有的,不存在線程安全問題,而堆和方法區是線程公有的。

計數器:指向當前線程正在執行的字節碼指令的地址(行號)。
虛擬機棧:存儲當前線程運行方法時所需要的數據,指令和返回地址。
本地方法棧(native):本地方法運行時所需要的數據,指令和返回地址。
方法區:類信息、常量,如運行時常量池、字段和方法數據,以及方法和構造函數的代碼。
堆(heap):對象、數組。

虛擬機棧:你寫一個代碼,裏面會有很多方法,這個JVM虛擬機棧的作用就是調用執行任何方法的時候,都會給對應的方法創建棧幀,然後入棧,當某個方法被執行完了之後就會從虛擬機棧裏面移走。個人理解就是:有一個棧,會把代碼裏的方法都做一個序號,放裏面,哪個先執行哪個後執行,先執行的執行完之後被移走,然後執行下一個方法。
有個經典的異常:StackOverflowError
在這裏插入圖片描述
堆(heap):

通過字節碼深度分析使用加號進行字符串拼接的低性能

java中用於處理字符串常用的有三個類:
1、java.lang.String
2、java.lang.StringBuffer
3、java.lang.StrungBuilder
String、StringBuffer和StringBuilder的區別

  1. 對象的可變與不可變
    String對象不可變,StringBuffer和StringBuilder對象可變。

  2. 線程是否安全
    String中的對象是不可變的,也就可以理解爲常量,所以線程安全。
    StringBuffer中的方法大都採用了synchronized關鍵字修飾,所以是線程安全的。
    StringBuilder沒有對方法進行加同步鎖,所以是非線程安全的。

  3. 字符串追加速度比較
    StringBuilder > StringBuffer > String

  4. StringBuffer和StringBuilder的共同點

StringBuffer和StringBuilder有公共的抽象父類AbstractStringBuilder
抽象類與一個接口的區別是:抽象類中可以定義一些子類的公共方法,子類只需要增加新的功能,不需要重複寫已經存在的方法;而接口中只是對方法的申明和常量的定義。
StringBuilder和StringBuffer的方法都會調用AbstractStringBuilder中的公共方法,如super.append(…)。只是StringBuffer會在方法上加上synchronized關鍵字,進行同步。
如果程序不是多線程的,那麼使用StringBuilder效率高於StringBuffer。
總結一下:
String:適用於少量的字符串操作的情況
StringBuilder:適用於單線程下在字符緩衝區進行大量操作的情況
StringBuffer:適用於多線程下在字符緩衝區進行大量操作的情況

參考:
https://blog.csdn.net/bug_moving/article/details/80101136
https://www.cnblogs.com/haofuqi/p/4826262.html
https://www.cnblogs.com/weibanggang/p/9455926.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章