浅谈Java虚拟机
Java的體系結構包含四個獨立但相關的技術:
???1,Java程序設計語言
???2,Java class文件格式
???3,Java應用程序編程接口(API)
???4,Java虛擬機
????其中,Java虛擬機就像一臺抽象的計算機,其規范定義了每個Java虛擬機都必須實現的特性,當然也為每個特性的實現留下了許多實現的選擇。Java虛擬機的主要任務是裝載class文件并執行其中的字節碼。
????Java虛擬機主要由兩部分組成,一部分叫“類裝載器”,另一個部分叫“執行引擎”?!邦愌b載器”用于從程序和API中裝載class文件(Java API中只有程序執行時需要的那些類才會被裝載),而“執行引擎”則執行裝載的字節碼,在執行的過程中還可能通過JNI來調用操作系統本地方法。
????在虛擬機的內部,虛擬機的行為分別按照 子系統、內存區、數據類型以及指令這幾個術語來描述的,這就組成了虛擬機內部抽象的體系結構。這樣,我們可以將虛擬機近一步抽象的分為“類裝載子系統”、運行時數據區“、”執行引擎“以及”本地方法接口“?!边\行時數據區“是一塊內存區域,用來存儲從已裝載的class文件中得到的其他信息、程序所創建的對象、傳遞給方法的參數、返回值、局部變量、運行的中間結果等。
????運行時數據區大體可分為:方法區、堆、java棧、PC寄存器和本地方法棧。當裝載一個class文件時,會從class文件包含的二進制數據中解析類型信息,然后把這些類型信息放到方法區中,當運行的時候,會把程序創建的對象都放在堆中,所以方法區和堆都是線程共享的。
????當一個線程創建時,該線程會擁有屬于自己的一個PC寄存器(程序計數器)以及一個Java棧,如果線程執行的是一個Java方法(非本地方法),那么寄存器的指總是指向下一條將被指向的指令,而它的棧則總是存儲該線程中Java方法調用的狀態(局部變量、傳進來的參數、返回值以及計算的中間值等)。而本地方法調用的狀態則是存存儲在本地方法棧中,當然根據實現的不同,也有可能是在寄存器或者其他某些與特定實現相關的內存區中。
????通過上面的講解,大家可以想想線程安全的問題。
????那么方法區中到底都存放了些什么信息呢?其實里面存放的都是一些類型信息,包括類變量(靜態變量)也會被存在這里。對每個裝載的類型,虛擬機都會在方法區中存儲一下類型信息:
????????1,這個類型的全限定名
????????2,這個類型的直接超類的全限定名(除非是Object,無超類)
????????3,這個類型是類類型還是接口類型
????????4,這個類型的訪問修飾符(public、abstract或final的某個子集)
????????5,任何直接超接口的權限定名的有序列表
????以上列出的是存儲的基本信息,除了這些信息外,還要存儲以下的信息:
????????6,被載入的類型的常量池
????????7,字段信息
????????8,方法信息
????????9,除了常量以外的所有類變量
????????10,一個到類ClassLoader的引用
????????11,一個大Class類的引用
????“運行時常量池”或者叫“常量池”,它是方法區的一部分,在class文件中,包含了常量池的相關信息,用于存放編譯期生成的各種字面量和符號引用。常量池就是該類型所用常量的一個有序集合,包括直接常量(string、integer、floating point常量)和對其他類型、字段和方法的符號引用。
????
????對于常量池這個概念,也許很多人都會覺得奇怪,搞不清這個的作用到底是啥。這里所指的“常量”可不等同與我們代碼中所謂的常量,這里的常量就是一個類型中包含的固定不變的信息。首先,當我們將java源代碼編譯成一個class文件后,class文件中用字節碼的形式保存了java源文件中所有的信息,例如我們定義的方法、屬性等。??根據所保存的常量類型的不同個,常量池又被分為了不同的區域,這里大家提到最多的莫過于string常量區域。對于在源文件中定義的字符串字面量,例如:String name = "test" , 不論該變量是成員屬性還是在方法中聲明的局部變量,該值都會在class加載的時候保存在常量池的string類型常量區中。
????需要注意區分的是上面的方式和通過new創建的字符串的不同,例如:String name = new String("test") 。 這里其實會涉及到兩個對象,一個是字符串字面量"test",該值同上面一樣會在class文件加載 時候放入到string常量區域中,同時在運行的時候會在堆中創建一個對象(即開辟一個堆內存區域),并且從string常量區域中拷貝一份"test"?指來保存在堆上。?所以,這就是為什么我們在比較兩個字符串相等的時候最好不要用等號“==”而要使用equals方法的原因。
????常量池就像一個詞典,里面記錄中程序運行過程中所需要的全部信息,這也就成為了Java動態鏈接的基礎。
????接下來談談在開發中常常會用到的幾個對JVM的配置。
????????1,堆大小的配置
????????????堆的最小值配置參數:-Xms200M
????????????堆的最大值配置參數:-Xmx300M
????????????注:如果這兩個參數配置一樣大小,則可以避免堆的自動擴展。
????????2,方法區大小的配置
????????????設置方法區的默認大小:-XX:PermSize=200M
????????????設置方法區的最大值:-XX:MaxPermSize=300M
????????
????????????
????????
????暫時就記錄這么多了,以后有必要的時候再添加上來。
????
????
????
????
轉載于:https://blog.51cto.com/dengshuangfu/1420210
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: 股价持续下跌 亚马逊员工薪酬最多缩水五成
- 下一篇: keepalived+lvs(HA+LB