JAVA進階--JVM

一.JVM的概述

java語言有跨平臺特點, 寫一次java程序,可以在不同的平臺上運行.(JVM虛擬機的作用)

? ? ? ?前提條件: 在不同的平臺上安裝不同的虛擬機(虛擬機就是一個翻譯)

.java--->.class--->不同的虛擬機--->機器碼

1.jvm作用:

? ? ? ?負責將字節碼翻譯為機器碼, 管理運行時內存

2.jvm的整體組成部分

? 類加載系統: 負責將硬盤上的字節碼文件加載到內存中(重點)

? 運行時數據區: 負責存儲運行時各種數據(重點)

? 執行引擎: 負責將字節碼 轉為機器碼

? 本地方法接口: 負責調用本地方法(非java的方法)

? 垃圾回收(重點)

二.類加載系統

1.作用

? ? ? 負責將硬盤上的字節碼文件加載到內存中(運行時數據區中)

2.類什么時候會被加載

(1).在一個類寫一個main方法,運行main方法

(2).new 某個類對象時

(3).使用類中的靜態成員

(4).使用反射機制時

public class Hello {final static  int num = 10;static  int num1= 10;/*靜態代碼塊在類被加載時自動執行,目前可以看做一個類只被加載一次*/static {System.out.println("類被加載了");}public static void main(String[] args) {System.out.println("111111111");}
}public class TestHello {public static void main(String[] args) throws ClassNotFoundException {//new Hello();//System.out.println(Hello.num);// Class.forName("com.ffyc.javapro.jvm.classloader.Hello");/*創建的是數組對象,數組是Hello類型*/Hello [] hellos = new Hello[10];//只是訪問類中的靜態常量,類是不加載的,直接返回靜態常量值即可System.out.println(Hello.num);//System.out.println(Hello.num1);}
}

3.類加載的過程? (了解)

? ?加載: 以字節流形式讀取文件

? ?鏈接: 驗證 準備 解析

? ?初始化: 主要為靜態成員變量初始化賦值

4.類加載器

? ? ?類加載器就是負責加載類的實踐者

? ? ?不同的類,是否不同的類加載器加載的

? 類加載器分類:

? ? 啟動類加載器(引導類加載器),不是用java語言寫的,是c/c++寫的, 負責加載虛擬機核心的類庫

? ??擴展類加載器 ,是用java語言寫的,負則加載jre/lib/ext目錄下的類

? ? 應用程序類加載器,是用java語言寫的,負責加載程序員寫的項目中的類(target/class)

public static void main(String[] args) {//獲得類的類加載器
System.out.println(String.class.getClassLoader());//類加載器為null,說明是由啟動類加載器加載的String類System.out.println(Hello.class.getClassLoader());//sun.misc.Launcher$AppClassLoader@18b4aac2
System.out.println(Hello.class.getClassLoader().getClass().getClassLoader());//應用程序類加載器的加載器為null}

5.什么是雙親委派機制(重點)

? ?工作原理:

? ? ? 當收到類加載任務時,首先委派給上級的類加載器加載,如果上級類加載器還有父級,依次遞歸,直到最頂級的啟動類加載器, 當父級類加載器找到類時,成功返回,

? ? ? 如果找不到,就委派給子類加載器,如果子類加載器找到后,成功返回,

? ? ? 如果均未找到,那么就拋出ClassNotFoundException.

7.為什么設計雙親委派機制

? ? ? 為了安全, 避免了自己定義的類,替換了系統中的核心類

? ? ? ?例如: 自己創建java.lang.String, 結果還是加載的系統中的String類

8.如何打破雙親委派機制

? ? ? ?自定義類加載重寫方法打破雙親委派機制

? ? ? ? ? ?①可以自定義類加載器

? ? ? ? ? ?②寫一個類 繼承 ClassLoader類,

? ? ? ? ? ?③重寫findClass();

自己用流將字節碼讀入,

Class<?> clazz = defineClass(null, bytes, 0, bytes.length);
Object o = clazz.newInstance();//反射機制創建對象//com.ffyc.javapro.jvm.classloader.MyClassLoader@1b6d3586
System.out.println(clazz.getClassLoader());

三.運行時數據區

? ? ?當類加載系統把類信息加載到內存后,存儲到運行時數據區.

? ? ?運行時數據區,根據不同的功能可以分為5個部分:

1.程序計數器

? ? ?作用:

? ? ? ? ? ? ? 程序計數器用來記錄線程執行的指令集的位置, 因為線程在執行時cpu要進行切換執行,需? ? ? ? ? 要記錄線程執行的位置.

特點:

? (1).是運行時數據區中空間最小的,運行速度最快的區域

? (2).每個線程都有一個屬于自己的程序計數器,是線程私有的,程序計數器生命周期與線程生命? ? ? ? ? ? ? ? ?周期相同.

? (3).程序計數器是運行時數據區中唯一一個不會有內存異常情況的區域,

2.虛擬機棧

? ? ? 虛擬棧是運行單位,管理程序如何執行,調用一個方法,方法入棧執行,運行結束后,出棧.

? ? ? 虛擬機棧主要用來運行java語言寫的方法.

特點:

? ? ?①線程私有的,每個線程中調用的方法都在線程對應的虛擬機棧中執行.

? ? ?②棧中存儲局部變量

? ? ?③虛擬棧中不存在垃圾回收

? ? ? ? ?虛擬機棧中會存在內存溢出問題(遞歸調用太深)

? ? ? ? ?Exception in thread "main" java.lang.StackOverflowError 棧溢出錯誤

? ? ?④不同線程中所包含的棧幀(方法)是不允許存在相互引用的

? ? ? ? ? ? ? (eg:A線程中的方法不能調用B線程中的方法)

? ? ?⑤先進后出

public void test(){   int a = 10;//局部變量int b= 20;String s = new  String(); //s是引用類型,保存的是對象地址
}

棧幀:

? ? ? ? 當一個方法被調用后,被壓入到虛擬機棧中稱為一個棧幀,

棧幀內部結構:

? ? ? ? ①局部變量表(存儲局部變量的區域)

? ? ? ? ②操作數棧? ? ——? ? 操作數棧就是用來計算的區域,

? ? ? ? ? ? 例如? :

int a= 10,int b=20;  //a和b存儲在局部變量表中
int c = a+b ;//計算時,把a和b從局部變量表加載到操作數棧運算,把 運算結果賦給c,把c寫回到局部變量表

? ? ? ? ③方法返回地址: 記錄方法調用的位置,方法執行完成后要回到自己開的位置

3.本地方法棧

? ? ? ?本地方法: 在java程序中,不是用java語言實現的方法, 由底層操作系統提供

? ? ? ? ? ? ? ? ? ? ? ? 使用 native關鍵修飾的方法,沒有方法體

? ?? ?因為java語言屬于上層語言(開發上層應用程序),沒有權限與底層硬件進行交互(如讀取內存數據,讀取硬盤數據)

? ? ? 本地方法棧用來執行本地方法的,當程序中調用了本地方法,那么被加載到本地方法棧中運行.

特點:

? ? ? ? ?①線程私有的,每個線程都有屬于自己的本地方法棧

? ? ? ? ?②本地方法棧也會出現內存溢出情況

? ? ? ? ?③本地方法棧中不會出現垃圾回收

4.堆

(1).概述

? ? ? ?作用:

? ? ? ? ? ? ? ? 堆空間是用來存儲java中創建的對象的

? ? ? ?特點:

? ? ? ? ? ?堆空間是運行時數據區中最大的一塊內存空間,

? ? ? ? ? ? ?還可以根據需要通過參數設置大小: -Xms:10m(堆起始大小) -Xmx:30m(堆最大內大小

? ? ? ? ? ? ?堆空間是所有線程共享的.

? ? ? ? ? ? ?堆空間會出現內存溢出情況的.

? ? ? ? ? ? ?堆空間是垃圾回收的重點區域.

(2).堆內存區域劃分

新生代(區): 伊甸園區? ? 幸存者0(from)? ?幸存者1(to)

老年代(區):

(3).為什么要分區(代)

? ? 根據對象的存活周期,對象的大小放在不同的區域,不同的區域可以采用不同的垃圾回收算法.會頻繁的回收新生代, 相對較少回收老年代.可以對回收算法揚長避短.

(4).對象創建內存分配過程

? ? ? ①.新創建的對象都存儲在伊甸園區(比較大的對象,可以直接分配到老年代)

? ? ? ②.當下次垃圾回收到來時,把伊甸園區存活的對象移動到幸存者0區,清空伊甸園區

? ? ? ③.當下次垃圾回收時,把伊甸園區中存活的對象和幸存者0區的存活對象移動到幸存者1區,清空伊甸園區和幸存者0區.

? ? ? ④.當一個對象經歷過最大上限15次垃圾回收后,依然存活,那么將此對象移動到老年代

5.方法區

(1).概述

? ? ? ? ?方法區主要存放類信息(屬性,方法,靜態常量...)和編譯器編譯后的代碼

? ? ? ? ?是一個被線程共享的內存區域

? ? ? ? ?方法的大小也是可以設置的,方法區的大小決定可以加載多少了類

? ? ? ? ? 方法區也是有可能出現內存溢出的.

(2).方法區大小設置

? ? ? ? ? ? ? 可以使用參數-XX:MetaspaceSize指定

(3).方法區的垃圾回收

? ? ? 方法區也是有垃圾回收的, 方法區的垃圾回收主要回收的是類信息.

? ? ? 類信息回收條件(比較苛刻的):

? ? ? ? ? ? ? ①.該類所創建的對象都已經不再使用,并且被回收了

? ? ? ? ? ? ? ②.該類的Class對象也不在被使用了

? ? ? ? ? ? ? ③.加載該類的類加載器也被回收了

線程共享: 堆,方法

線程私有的: 程序計數器,虛擬機棧,本地方法棧

會出現內存溢出: 堆,方法, 虛擬機棧,本地方法棧

會出現垃圾回收: 堆,方法區

四.本地方法接口 (了解)

? ? ? ?虛擬機中負責調用本地方法的入口, 本地方法運行在本地方法棧中.

什么是本地方法:

? ? ? ?被native修飾的方法, 沒有方法體, 是操作系統提供的方法

為什么java中要調用本地方法:

? ? ? ? java屬于上層應用開發語言,沒有權限直接訪問計算機硬件(硬盤,內存,外設(喇叭)),需要調用本地操作系統提供的方法.

五.執行引擎(黑盒)? (了解)

執行引擎在虛擬機中主要負責將加載到虛擬機中的字節碼 解釋/編譯 為機器碼

.java-----jdk編譯--->.class 在開發階段 (前端編譯)

.class---執行引擎編譯---->機器碼 在運行階段(后端編譯)

什么是解釋器?什么是 JIT 編譯器?

? ?解釋器/解釋執行--->sql,html,css,js ,python 解釋執行 不需要整體編譯,由解釋器一行一行執行

? ?JIT編譯器-->編譯執行,先把代碼整體進行編譯,生成另一種文件格式,但并不是馬上執行

解釋執行特點:

? ? ? ? ? ?速度慢, 不需要花費時間編譯?

編譯執行特點:

? ? ? ? ? ? 編譯后執行快, 但是編譯需要花費一定的時間

jvm中的執行引擎在將字節碼 翻譯為機器碼時,采取半解釋,半編譯機制.

開始時,可以先采用解釋執行,立即投入到翻譯工作中,

等到編譯器編譯完成后,采用編譯執行

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

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

相關文章

基于Alpine構建MySQL鏡像

文章目錄基于Alpine構建MySQL鏡像一、基礎鏡像選擇與初始化1. 基礎鏡像選型2. 系統初始化二、核心配置構建1. 目錄與權限配置2. 配置文件優化三、安全增強配置1. 密碼策略強化2. 非root運行四、數據持久化與啟動配置1. 數據卷聲明2. 入口腳本優化五、完整Dockerfile示例六、關鍵…

Alamofire 網絡請求全流解析,通俗易懂

Alamofire 網絡請求全流程解析&#xff1a;從發起請求到處理響應 一、請求發起階段&#xff1a;準備你的"快遞" 1. 你告訴Alamofire要發什么"快遞" // 就像告訴快遞員&#xff1a;"我要寄一個包裹給https://api.example.com" AF.request("h…

鏈路聚合技術

鏈路聚合技術 鏈路聚合概述及應用場景 概述 鏈路聚合是把多條物理鏈路聚合在一起&#xff0c;形成一條邏輯鏈路。應用在交換機、路由器、服務器間鏈路&#xff0c;注意了&#xff0c;主機上面不能用鏈路聚合技術分為三層鏈路聚合和二層鏈路聚合鏈路聚合的作用 增加鏈路帶寬提供…

SpringCloud之Zuul

SpringCloud之Zuul 推薦參考&#xff1a;https://www.springcloud.cc/spring-cloud-dalston.html#_router_and_filter_zuul 1. 什么是Zuul Spring Cloud Zuul 是 Netflix 提供的微服務網關核心組件&#xff0c;作為統一的 API 入口&#xff0c;承擔請求路由、過濾、安全控制等…

低精度定時器 (timer_list) 和 高精度定時器 (hrtimer)

Linux 內核提供了兩種主要類型的定時器&#xff0c;以滿足不同的時間精度需求&#xff1a;低精度定時器 (timer_list) 和 高精度定時器 (hrtimer)。它們各有特點和適用場景。下面&#xff0c;我將分別提供它們在內核代碼中的簡化使用示例。1. 低精度定時器 (timer_list) 示例ti…

虛擬機VMware的使用方法

虛擬機VMware的使用方法VMware是全球領先的虛擬化技術提供商&#xff0c;其產品&#xff08;如VMware Workstation Pro&#xff09;允許用戶在單一物理機上運行多個操作系統&#xff08;OS&#xff09;&#xff0c;實現資源高效利用、隔離測試和靈活部署。本文將詳細介紹VMware…

冰島人(map)

#include<bits/stdc.h> using namespace std; struct people { string fat; int sex; }; map<string,people>mp; int pan(string s,string m) { string s1; int i0; while(s!“”) { int y0; s1m; while(s1!“”) { if(s1s&&(i<4||y<4)) return 0; s…

MS Azure Eventhub 發送 AD log 到cribl

1: 首先說一下,Cribl 提供了很多第三方的接口: 先看一下cribl 提供的接口界面: 注意到,上面提供的link 地址是 xxxxx:9093, 不鼠標放到撒謊給你嗎的? 上面,就可以看到了。所以要開的port 一定要把9093 開了,關于全部開的port: What ports do I need to open on the f…

電力名詞通俗解析5:計量系統

## 電網計量系統通俗講解&#xff1a;南網視角下的電力“精算師”想象一下&#xff0c;城市電網如同一個龐大而精密的“能量河流”&#xff0c;千家萬戶、工廠企業都在從中取水&#xff08;用電&#xff09;。如何精確計量每家用了多少“水”&#xff1f;如何確保“河流”輸送中…

關于redis各種類型在不同場景下的使用

Redis 提供了多種數據結構類型,每種類型適用于不同的場景。以下是 Redis 主要數據類型及其典型應用場景的詳細說明: 1. String(字符串) 特點:最簡單的鍵值存儲,值可以是字符串、整數或二進制數據(最大 512MB)。 適用場景: 緩存:存儲用戶會話、網頁內容等(如 SET u…

Vue 3 動態ref問題

目錄 1.問題描述 2.示例代碼 3.原因分析 4.解決方案 5.總結 1.問題描述 在Vue 3項目中&#xff0c;當使用動態ref來引用組件時&#xff0c;刪除組件后發現ref對象中對應的key仍然存在&#xff0c;只是值變為null&#xff0c;而不是完全刪除該key。 在一個可拖拽的卡片列表…

lazyvim恢復gt鍵

好的&#xff01;下面是一個完整的 LazyVim 鍵位配置 patch&#xff0c;將 gt / gT 恢復為 “切換標簽頁&#xff08;tab page&#xff09;” 的原始行為&#xff0c;同時保留原本 buffer 切換功能在其他鍵位上&#xff08;比如 / &#xff09;。 ? ? 恢復 gt 為 Tab 切換&a…

React Native 在 Web 前端跨平臺開發中的優勢與實踐

React Native 在 Web 前端跨平臺開發中的優勢與實踐 對于廣大 Web 前端開發者而言&#xff0c;移動端開發似乎總隔著一層“原生”的壁壘。學習 Swift/Kotlin、熟悉 Xcode/Android Studio 的高昂成本&#xff0c;讓許多人望而卻步。然而&#xff0c;“一次編寫&#xff0c;多端運…

QT控件 使用QtServer系統服務實現搭建Aria2下載后臺服務,并使用Http請求訪問Json-RPC接口調用下載退出

前言 最近了解到qt-solutions這個開源項目,仔細研究一番&#xff0c;發現其中的QtServer項目能在Windows系統中創建系統服務&#xff0c;Linux/Unix系統中能作為守護進程使用&#xff0c;之前一直以為編寫服務需要使用Windows api來實現&#xff0c;沒想到這么簡單。 本來之前就…

Python中關于數組的常見操作

Python中關于數組的常見操作 1.創建數組 array []2.添加元素 array.append()3.訪問元素 print(array[2])通過索引進行數組元素的訪問 4.修改元素 array[2] 3直接對想修改的元素位置進行賦值 5.刪除元素 array.remove(2) #刪除元素2del array[2] #刪除索引為2的元素6…

Image 和 IMU 時間戳同步

1 目錄 時間戳同步介紹 時間戳同步初探 時間戳獲取方式 時間戳延遲估計方法 姿態補償 勻速模型在 Bundle Adjustment 中的應用 重投影殘差 視覺特征勻速運動補償特征坐標 重投影殘差 基于特征勻速模型算法的實驗結果 軌跡勻速模型 vs 特征勻速模型 時間戳同步算法擴…

創建linux端口映射連接小網

&#x1f680; 方法 1&#xff1a;在執行機上配置 SSH 服務端轉發 這個做法是在 執行機上配置一個常駐 SSH 隧道&#xff0c;把大網的某個端口長期轉發到小網單板的 22 端口。 &#x1f468;?&#x1f4bb; 操作步驟 1?? 在執行機上創建一個 systemd 服務 假設&#xff1a; …

了解Java21

目前還沒有實操過從java8/java11直接到java17,java21。 先儲備下知識點&#xff0c;寫一些簡單例子&#xff0c;以便后續的實操。 一些新特性&#xff08;java8之后的&#xff09; var變量 和前端js定義變量一樣了&#xff0c;var搞定public static void main(String[] args) {…

【代碼】基于CUDA優化的RANSAC實時激光雷達點云地面分割

基于CUDA優化的RANSAC實時激光雷達點云地面分割 摘要&#xff1a; 本文介紹了一個高性能的激光雷達&#xff08;LiDAR&#xff09;地面分割項目。該項目基于RANSAC平面估計算法&#xff0c;并通過深度CUDA并行優化&#xff0c;將核心處理時間從近100ms縮短至10ms以內&#xff…

vuex原理以及實現

vuex官方文檔 Vuex是什么&#xff1f; Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式。它采用集中式存儲管理應用的所有組件的狀態&#xff0c;并以相應的規則保證狀態以一種可預測的方式發生變化 每一個 Vuex 應用的核心就是 store&#xff08;倉庫&#xff09;。“stor…