[轉載] 弄懂JDK、JRE和JVM到底是什么

參考鏈接: JDK JRE和JVM之間的區別

首先是JDK

?

?

?JDK(Java Development Kit) 是 Java 語言的軟件開發工具包(SDK)。

?在JDK的安裝目錄下有一個jre目錄,里面有兩個文件夾bin和lib,在這里可以認為bin里的就是jvm,lib中則是jvm工作所需要的類庫,而jvm和 lib合起來就稱為jre。

?

?

?然后我們來看JRE

?

?

?JRE(Java Runtime Environment,Java運行環境),包含JVM標準實現及Java核心類庫。JRE是Java運行環境,并不是一個開發環境,所以沒有包含任何開發工具(如編譯器和調試器)?

?

?

?最后JVM也一目了然了

?

?

?JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。

?

?

??

?

?

?由上圖一目了然:

?

?

?JDK是整個Java的核心,包括了Java運行環境JRE、Java工具和Java基礎類庫。JRE是運行JAVA程序所必須的環境的集合,包含JVM標準實現及Java核心類庫。JVM是整個java實現跨平臺的最核心的部分,能夠運行以Java語言寫的程序。?

?

?

?JVM體系結構與運行原理:

?

?

?Java語言寫的源程序通過Java編譯器,編譯成與平臺無關的‘字節碼程序’(.class文件,也就是0,1二進制程序),然后在OS之上的Java解釋器中解釋執行。?

?

?

??

?

?

?JVM整個類加載過程的步驟:?

?

?

??

? 1.? ? ? ?裝載?

? 裝載過程負責找到二進制字節碼并加載至JVM中,JVM通過類名、類所在的包名通過ClassLoader來完成類的加載,同樣,也采用以上三個元素來標識一個被加載了的類:類名+包名+ClassLoader實例ID。?

? ?

? 2.? ? ? ?鏈接?

? 鏈接過程負責對二進制字節碼的格式進行校驗、初始化裝載類中的靜態變量以及解析類中調用的接口、類。?

? 完成校驗后,JVM初始化類中的靜態變量,并將其值賦為默認值。?

? 最后對類中的所有屬性、方法進行驗證,以確保其需要調用的屬性、方法存在,以及具備應的權限(例如public、private域權限等),會造成NoSuchMethodError、NoSuchFieldError等錯誤信息。?

? ?

? 3.? ? ? ?初始化?

? 初始化過程即為執行類中的靜態初始化代碼、構造器代碼以及靜態屬性的初始化,在四種情況下初始化過程會被觸發執行:?

? 調用了new;?

? 反射調用了類中的方法;?

? 子類調用了初始化;?

? JVM啟動過程中指定的初始化類。?

? ??

? ClassLoader抽象類的幾個關鍵方法:?

? (1)? ? ? ?loadClass?

? 此方法負責加載指定名字的類,ClassLoader的實現方法為先從已經加載的類中尋找,如沒有則繼續從parent ClassLoader中尋找,如仍然沒找到,則從System ClassLoader中尋找,最后再調用findClass方法來尋找,如要改變類的加載順序,則可覆蓋此方法?

? (2)? ? ? ?findLoadedClass?

? 此方法負責從當前ClassLoader實例對象的緩存中尋找已加載的類,調用的為native的方法。?

? (3)? ? ? ?findClass?

? 此方法直接拋出ClassNotFoundException,因此需要通過覆蓋loadClass或此方法來以自定義的方式加載相應的類。?

? (4)? ? ? ?findSystemClass?

? 此方法負責從System ClassLoader中尋找類,如未找到,則繼續從Bootstrap ClassLoader中尋找,如仍然為找到,則返回null。?

? (5)? ? ? ?defineClass?

? 此方法負責將二進制的字節碼轉換為Class對象?

? (6)? ? ? ?resolveClass?

? 此方法負責完成Class對象的鏈接,如已鏈接過,則會直接返回。?

? ??

?JVM

?運行時數據區:??

? 第一塊:PC寄存器?

? PC寄存器是用于存儲每個線程下一步將執行的JVM指令,如該方法為native的,則PC寄存器中不存儲任何信息。?

? 第二塊:JVM棧?

? JVM棧是線程私有的,每個線程創建的同時都會創建JVM棧,JVM棧中存放的為當前線程中局部基本類型的變量(java中定義的八種基本類型:boolean、char、byte、short、int、long、float、double)、部分的返回結果以及Stack Frame,非基本類型的對象在JVM棧上僅存放一個指向堆上的地址?

? 第三塊:堆(Heap)?

? 它是JVM用來存儲對象實例以及數組值的區域,可以認為Java中所有通過new創建的對象的內存都在此分配,Heap中的對象的內存需要等待GC進行回收。?

? 第四塊:方法區域(Method Area)?

? (1)在Sun JDK中這塊區域對應的為PermanetGeneration,又稱為持久代。?

? (2)方法區域存放了所加載的類的信息(名稱、修飾符等)、類中的靜態變量、類中定義為final類型的常量、類中的Field信息、類中的方法信息,當開發人員在程序中通過Class對象中的getName、isInterface等方法來獲取信息時,這些數據都來源于方法區域,同時方法區域也是全局共享的,在一定的條件下它也會被GC,當方法區域需要使用的內存超過其允許的大小時,會拋出OutOfMemory的錯誤信息。?

? 第五塊:運行時常量池(Runtime Constant Pool)?

? 存放的為類中的固定的常量信息、方法和Field的引用信息等,其空間從方法區域中分配。?

? 第六塊:本地方法堆棧(Native Method Stacks)?

? JVM采用本地方法堆棧來支持native方法的執行,此區域用于存儲每個native方法調用的狀態。 參考資料:?

? http://www.open-open.com/lib/view/open1408453806147.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540430.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540430.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540430.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mcq 隊列_人工智能搜索問題能力問題解答(MCQ)

mcq 隊列1) The main Aim of the AI system is to provide a solution for real-life problems by acting and thinking humanly. Whenever an agent is confronted by a problem, what is the first step that it follows towards searching a solution to the problem? Sear…

JavaOne大事紀:IBM談OpenJ9和Open Liberty

JavaOne大會以IBM陳述其最近對開源社區的貢獻作為開場:OpenJ9、Open Liberty和MicroProfile。IBM杰出工程師John Duimovich做了“IBM和Java:助力下一代創新”的開場演講。\\讀者可以回看演講視頻。\\Duimovich說IBM之所以致力于推動Java生態系統的創新&a…

[轉載] JVM中對象的回收過程

參考鏈接: JVM是否創建Main類(具有main()的類)的對象 當我們的程序開啟運行之后就,就會在我們的java堆中不斷的產生新的對象,而這是需要占用我們的存儲空間的,因為創建一個新的對象需要分配對應的內存空間,顯然我的內…

c語言格式對齊填充_C ++中類的大小 課堂上的填充和對齊| 派生類的大小

c語言格式對齊填充Prerequisite: 先決條件: sizeof() operator in C/C C / C 中的sizeof()運算符 Size of struct in C C中的struct大小 We know that a struct size is not only the summation of all the data members, rather its the minimum sum guaranteed. …

ELK系列~對fluentd參數的理解

這段時候一直在研究ELK框架,主要集成在對fluentd和nxlog的研究上,國內文章不多,主要看了一下官方的API,配合自己的理解,總結了一下,希望可以幫到剛入行的朋友們! Fluentd(日志收集與…

[轉載] Java中的50個關鍵字

參考鏈接: Java平臺如何獨立 Java中的50個關鍵字 關鍵字也稱為保留字,是指java語言中規定了特定含義的標示符。對于保留字,用戶只能按照系統規定的方式使用,不能自行定義。Java中有50個常用關鍵字: 與數據類型相關…

MySQL 直接存儲圖片并在 html 頁面中展示,點擊下載

數據庫實體類: package com.easy.kotlin.picturecrawler.entityimport java.util.* import javax.persistence.*Entity Table(indexes arrayOf(Index(name "idx_url", unique true, columnList "url"),Index(name "idx_category"…

css 文本背景色透明_如何使用CSS將文本或圖像的背景設置為透明?

css 文本背景色透明Introduction: 介紹: In web development, there are numerous ways by which we can style our websites or web pages. You can make use of lots of properties for creating attractive and responsive websites. 在Web開發中,我…

[轉載] 1.1Java使用JDBC原生方式連接MySql數據庫

參考鏈接: Java數據庫連接JDBC驅動程序 前言:今天有朋友問我原生的java連接數據庫,因為框架的使用,如果基礎不牢固的人,是很容易遺忘原生的連接方式。今天正好趁此做一下回顧: 這里只考慮原生方式&#x…

maven安裝及集成myeclipse

第一步:下載和安裝 1、官網下載Maven:http://maven.apache.org/download.cgi 2、解壓到一個文件夾2、設置環境變量:如:M2_HOME:D:\JAVA\apache-maven-3.0.5在path中添加;%M2_HOME%\bin;第二步:和MyEclipse集…

[轉載] Java泛型詳解:<T>和Class<T>的使用。泛型類,泛型方法的詳細使用實例

參考鏈接&#xff1a; Java中的main()函數是強制性的嗎 一、引入 1、泛型是什么 首先告訴大家ArrayList就是泛型。那ArrayList能完成哪些想不到的功能呢&#xff1f;先看看下面這段代碼&#xff1a; [java] view plain copy ArrayList<String> strList new ArrayL…

數字和數字根的總和_使用8086微處理器查找8位數字的數字總和

數字和數字根的總和Problem statement: 問題陳述&#xff1a; Write an assembly language program in 8086 microprocessor to find sum of digit of an 8 bits number using 8 bits operation. 在8086微處理器中編寫匯編語言程序&#xff0c;以使用8位運算找到8位數字的位數…

[轉載] Java筆試題集錦

參考鏈接&#xff1a; 關于Java中文件名和類名的誤解 Java筆試題集錦 1.MVC的各個部分都有那些技術來實現?如何實現? 答&#xff1a;MVC是Model&#xff0d;View&#xff0d;Controller的簡寫。"Model" 代表的是應用的業務邏輯&#xff08;通過JavaBean&#xff…

gcc -pthread_錯誤-在GCC Linux中使用C程序未定義對'pthread_create'的引用

gcc -pthread在Linux中修復對pthread_create的未定義引用 (Fixing undefined reference to pthread_create in Linux) This is a common error while compiling C program in GCC/G Linux. This error occurs when you are using pthread_create function to create threads in…

[轉載] Java面試題全集(上)

參考鏈接&#xff1a; 如何運行不同目錄中的Java類文件 2013年年底的時候&#xff0c;我看到了網上流傳的一個叫做《Java面試題大全》的東西&#xff0c;認真的閱讀了以后發現里面的很多題目是重復且沒有價值的題目&#xff0c;還有不少的參考答案也是錯誤的&#xff0c;于是我…

python重載運算符乘法_Python | 使用乘法運算符創建一個字符串的多個副本

python重載運算符乘法Given a string and we have to create its multiple copies by using multiplication operator in Python? 給定一個字符串&#xff0c;我們必須通過在Python中使用乘法運算符來創建其多個副本&#xff1f; If you want to create multiple copies of …

一次前端筆試總結

1.有一個長度未知的數組a&#xff0c;如果它的長度為0就把數字1添加到數組里面&#xff0c;否則按照先進先出的隊列規則讓第一個元素出隊。 分析&#xff1a;這道題主要是考核了數組的隊列方法和棧方法。另外&#xff0c;原題還有字數限制的&#xff0c;只有在字數小于30并且結…

Java文件類boolean setLastModified(long set_new_time)方法,包含示例

文件類boolean setLastModified(long set_new_time) (File Class boolean setLastModified(long set_new_time)) This method is available in package java.io.File.setLastModified(long set_new_time). 軟件包java.io.File.setLastModified(long set_new_time)中提供了此方法…

[轉載] Linux里面的文件目錄類指令

參考鏈接&#xff1a; 如何運行不同目錄中的Java類文件 引用&#xff1a;尚硅谷韓老師的《尚硅谷-Linux-經典升級》 日常總結 pwd 指令 &#xff08;顯示當前工作目錄的絕對路徑&#xff09; 基本語法 pwd (功能描述&#xff1a;顯示當前工作目錄的絕對路徑) …

[轉載] 微服務安全和治理

參考鏈接&#xff1a; 微服務介紹 在整體式架構中&#xff0c;由于運行應用程序的運行時環境相對隔離&#xff0c;所以治理和安全保護很簡單。微服務架構具有典型的革新特征&#xff0c;給活動的治理和應用程序的安全威脅保護帶來了更多挑戰。 微服務架構中的安全性 微服務…