日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

浅谈Java虚拟机

發布時間:2023/12/15 java 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈Java虚拟机 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java的體系結構包含四個獨立但相關的技術:

???1,Java程序設計語言

???2,Java class文件格式

???3,Java應用程序編程接口(API)

???4,Java虛擬機


????其中,Java虛擬機就像一臺抽象的計算機,其規范定義了每個Java虛擬機都必須實現的特性,當然也為每個特性的實現留下了許多實現的選擇。Java虛擬機的主要任務是裝載class文件并執行其中的字節碼。


????Java虛擬機主要由兩部分組成,一部分叫“類裝載器”,另一個部分叫“執行引擎”。“類裝載器”用于從程序和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

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的浅谈Java虚拟机的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。