Java進階---JVM

JVM概述

JVM作用

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

JVM整體組成部分

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

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

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

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

????????垃圾回收(重點)

類加載系統

作用

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

類什么時候被加載

????????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);}
}
類加載的過程(了解)

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

????????連接階段:驗證? ?準備? ?解析

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

類加載器

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

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

類加載器的分類:

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

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

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

雙親委派機制

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

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

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

為什么設計雙親委派機制

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

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

如何打破雙親委派機制

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

????????寫一個類? ?繼承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個部分:

程序計數器

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

特點:

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

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

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

虛擬機棧

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

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

特點:

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

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

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

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

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

????????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寫回到局部變量表

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

本地方法棧

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

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

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

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

特點:

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

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

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

概述

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

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

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

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

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

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

堆內存區域劃分

新生代(區):

????????伊甸園區

????????幸存者0(from)

????????幸存者1(to)

?老年代(區):

為什么要分區(代)

根據對象的存活周期,對象的大小放在不同的區域,不同的區域可以采用不同的垃圾回收算法.

會頻繁的回收新生代, 相對較少回收老年代.

可以對回收算法揚長避短.

對象創建內存分配過程

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

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

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

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

堆空間參數

涉及JVM調優面試題

根據實際的需要。來調整JVM中原有的一些參數,如堆的初始化大小,分代年齡

官網地址: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

-XX:+PrintFlagsInitial查看所有參數的默認初始值

-Xms:初始堆空間內存

-Xmx:最大堆空間內存

-Xmn:設置新生代的大小

-XX:MaxTenuringTreshold:設置新生代垃圾的最大年齡

-XX:+PrintGCDetails 輸出詳細的 GC處理日志

方法區

概述

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

也是線程共享的區域,

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

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

方法區大小設置

Java 方法區的大小不必是固定的,JVM可以根據應用的需要動態調整.

????????元數據區大小可以使用參數-XX:MetaspaceSize指定

方法區的垃圾回收

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

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

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

2.該類的Class對象也不再被使用了

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

線程共享:堆,方法

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

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

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

本地方法接口

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

什么是本地方法

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

為什么Java中要調用本地方法

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

執行引擎(黑盒)

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

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

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

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

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

? ? ? ? 解釋執行特點:速度慢,不需要花費時間編譯

編譯執行,先把代碼整體進行編譯,生成另一種文件格式,

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

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

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

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

垃圾回收

Java語言特點

開源,跨平臺,面向對象,自動垃圾回收,線程,網絡...

概述

什么是垃圾?

一個對象沒有被任何引用指向,這個對象就可以被回收,就稱為垃圾對象,

垃圾對象如果不及時清理,導致新對象肯可能沒有空間存儲,進而導致內存溢出(內存不夠用了)

早期垃圾回收

早期是手動的回收 C和C++

????????malloc()

????????free()

給程序員帶來不便,如果忘記釋放,造成內存泄漏(對象不再使用,但是還占用著內存)

現在的語言多數采取了自動垃圾回收,例如java

程序員只需要new對象申請內存,不需要自己去釋放空間,解放了開發人員

應該關心哪些區域的回收?

重點是堆:頻繁回收新生代,較少回收老年代

方法區

內存溢出與內存泄漏

內存溢出:內存空間不足以運行程序,會報出內存錯誤(out of memory OOM)Error

內存泄漏:一些對象已經不再被使用l,但是垃圾回收器卻不能回收的對象,一直悄悄的占用著內存資源。

? ? ? ? 舉例:提供close()方法關閉資源的對象

? ? ? ? ? ? ? ? 數據庫連接對象,

? ? ? ? ? ? ? ? 網絡Socket

? ? ? ? ? ? ? ? IO讀取文件的對象

垃圾回收相關算法

垃圾標記階段算法

標記階段的目的:將堆內存中的對象進行檢查,檢查對象有沒有被引用指向。

標記階段涉及兩個算法:引用計數算法(現在的虛擬機已經不再使用了)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 可達性分析算法

引用計數算法

? ? ? ? 思想:在每個對象中設置一個字段用來記錄引用的數量,有一個引用指向對象,計數器加一,一旦有引用斷開,計數器減一;

? ? ? ? 優缺點:實現思路簡單

? ? ? ? ? ? ? ? ? ? ? 計數器字段占用空間,加一,減一是需要開銷的,

? ? ? ? ? ? ? ? ? ? ? 重點是不能解決循環引用問題,A.B.C三個對象之間相互關聯引用,此時計數器都是1,但是可能與外界沒有聯系,外界不可能使用A.B.C這三個對象,垃圾回收器不能回收他們,造成內存泄漏問題。

????????????????????????Hello h1 = new Hello();? ? 引用計數器0

? ? ? ? ? ? ? ? ? ? ? ? Hello h2 = h1;

? ? ? ? ? ? ? ? ? ? ? ? h1 = null;

? ? ? ? ? ? ? ? ? ? ? ? h2 = null;

可達性分析算法(根搜索算法,追蹤性分析算法)

? ? ? ? 思想:從一些活躍對象開始進行搜索,只要跟根對象有聯系的對象,就不是垃圾對象,

? ? ? ? ? ? ? ? ? ?與根對象沒有任何聯系的,即使對象之間存在引用關系,也可以判定為垃圾對象。

? ? ? ? ? ? ? ? ? ?解決了引用計數算法中的循環引用問題。

? ? ? ? 哪些對象可以作為根對象:

? ? ? ? 1.虛擬機中引用的對象? ?運行中的方法中引用的對象

? ? ? ? 2.類中的一些靜態成員變量

? ? ? ? 3.與同步鎖有關的對象

? ? ? ? 4.虛擬機內部的一些類Class類,異常類,類加載器

final finally{ } finalize()

Object類中finalize()

public  class Demo{protected void finalize() throws Throwable { Demo a = this;}
}

finalize()在對象被判定為垃圾后,在對象被真正回收之前由虛擬機自動調用,

在finalize()中執行一些最后要執行的功能,

finalize()只被執行一次

由于finalize()存在,對象可以分為3種狀態:

? ? ? ? 可觸及的:有引用指向的對象

? ? ? ? 可復活的:已經被判定為垃圾對象,但是fianlize()方法還沒執行過,有可能在finalize()中復活

? ? ? ? 不可觸及的:fianlize()已經被執行過了,并且又判定為垃圾了

垃圾回收階段算法

標記-復制算法

? ? ? ? 將內存分為兩塊,把正在使用中的內存塊的存活對象,復制到另一塊內存中,從內存塊的開始位置擺放,然后清除正在使用的內存塊.

????????對象會被移動, 適合存活對象少,垃圾對象多的場景, 適合新生代的回收.

標記-清除算法

????????不移動存活對象的,將垃圾對象中的地址記錄在一個空閑列表,有新對象到來時,可以把新對象分配到空閑列表中的內存地址上,覆蓋垃圾對象.

????????適合老年代回收,因為存活多且大,不需要移動對象.

標記-壓縮算法

????????將存活對象會壓縮到內存的一端,重新排列,將邊界外的空間進行清理,以減少內存碎片.

????????也是適用于老年代

垃圾回收器

標記階段算法和回收階段的算法都是方法論,垃圾回收器是真正回收的實踐者.

不同的jdk版本中提供不同的垃圾回收器, 不同的版本的jdk中可以由不同開發商實現垃圾回收器.

垃圾收集器分類

從線程數量分: 單線程垃圾收集器,只有一個線程進行垃圾回收

多線程垃圾收集器,有多個線程同時進行垃圾回收

從工作模式分: 獨占式垃圾收集器, 當垃圾收集線程執行時,其他程序線程會暫停執行

并發式垃圾收集器, 當垃圾收集線程執行時,可以允許其他程序線程同時執行

從回收的內存空間分: 新生代垃圾收集器

老年代垃圾收集器

jdk8中內置的垃圾回收器

Serial,Serial Old,

ParNew,Parallel Scavenge,Parallel Old,

CMS,

G1

重點了解2款垃圾收集器

CMS(Concurrent Mark Sweep,并發標記清除),這款垃圾收集器首創了垃圾回收線程和其他程序線程同時執行.

初始標記: 垃圾回收線程獨占的

并發標記: 用戶程序線程和垃圾回收線程同時執行的

重新標記: 垃圾回收線程獨占的

并發清理: 用戶程序線程和垃圾回收線程同時執行的

重置線程: 用戶程序線程和垃圾回收線程同時執行的

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

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

相關文章

數據類型檢測有哪些方式?

typeof 其中數組 對象 null都會判斷為Object,其他正確 typeof 2 // number typeof true //bolean typeof str //string typeof [] //Object typeof function (){} // function typeof {} //object typeof undefined //undefined typeof null // nullinstanceof 判斷…

NodeJS全棧開發面試題講解——P6安全與鑒權

? 6.1 如何防止 SQL 注入 / XSS / CSRF&#xff1f; 面試官您好&#xff0c;Web 安全三大經典問題分別從不同層面入手&#xff1a; &#x1f538; SQL 注入&#xff08;Server端&#xff09; 原理&#xff1a;惡意用戶將 SQL 注入查詢語句拼接&#xff0c;導致數據泄露或破壞…

npm error Cannot find module ‘negotiator‘ 的處理

本想運行npm create vuelatest&#xff0c;但提示&#xff1a; npm error code MODULE_NOT_FOUND npm error Cannot find module negotiator npm error Require stack: npm error - C:\Users\Administrator\AppData\Roaming\nvm\v18.16.1\node_modules\npm\node_modules\tuf-j…

Python爬蟲:AutoScraper 庫詳細使用大全(一個智能、自動、輕量級的網絡爬蟲)

更多內容請見: 爬蟲和逆向教程-專欄介紹和目錄 文章目錄 一、AutoScraper概述1.1 AutoScraper介紹1.2 安裝1.3 注意事項二、基本使用方法2.1 創建 AutoScraper 實例2.2 訓練模型2.3 保存和加載模型2.4 數據提取方法2.5 自定義規則三、高級功能3.1 多規則抓取3.2 分頁抓取3.3 代…

【Netty系列】解決TCP粘包和拆包:LengthFieldBasedFrameDecoder

目錄 如何使用&#xff1f; 1. 示例代碼&#xff08;基于Netty&#xff09; 2. 關鍵參數解釋 3. 協議格式示例 4. 常見配置場景 場景1&#xff1a;長度字段包含自身 場景2&#xff1a;長度字段在消息中間 5. 注意事項 舉個例子 完整示例&#xff1a;客戶端與服務端交互…

哈爾濱工業大學提出ADSUNet—紅外暗弱小目標鄰幀檢測新框架

ADSUNet: Accumulation-Difference-Based Siamese U-Net for inter-frame Infrared Dim and Small Target Detection 作者單位&#xff1a;哈爾濱工業大學空間光學工程研究中心 引用: Liuwei Zhang, Yuyang Xi, Zhipeng Wang, Wang Zhang, Fanjiao Tan, Qingyu Hou, ADSUNet: A…

Linux開發追蹤(IMX6ULL篇_第一部分)

前言 參數&#xff1a;cortex-A7 698Mhz flash 8GB RAM 512M DDR3 2個100M網口 單核 初期&#xff1a; 一、安裝完虛擬機之后&#xff0c;第一步先設置文件之間可以相互拷貝復制&#xff0c;以及通過CRT連接到虛擬機等 折磨死人了啊啊啊啊啊啊 1、關于SSH怎么安裝…

【萌筆趣棋】網頁五子棋項目測試報告

目錄 一.項目介紹 &#xff08;一&#xff09;項目簡介 &#xff08;二&#xff09;功能介紹 &#xff08;三&#xff09;頁面展示 1.注冊頁面 2.登錄頁面 3.游戲大廳頁面 4.游戲房間頁面&#xff08;對戰&#xff09; 二.功能測試 &#xff08;一&#xff09;出現的…

知識圖譜增強的大型語言模型編輯

https://arxiv.org/pdf/2402.13593 摘要 大型語言模型&#xff08;LLM&#xff09;是推進自然語言處理&#xff08;NLP&#xff09;任務的關鍵&#xff0c;但其效率受到不準確和過時知識的阻礙。模型編輯是解決這些挑戰的一個有前途的解決方案。然而&#xff0c;現有的編輯方法…

數據庫,Spring Boot,數據源

您是對的&#xff0c;我之前的回答解釋了Spring Boot在操作MySQL時不一定需要顯式配置指定的數據源類型&#xff0c;因為它有自動配置機制&#xff0c;但沒有直接點明在自動配置情況下“數據源是什么”。 在Spring Boot自動配置機制下&#xff0c;這個“數據源”指的是一個連接…

數據結構測試模擬題(3)

1、兩個有序鏈表序列的合并 #include<bits/stdc.h> using namespace std;struct node{int num;node* next; };// 創建鏈表 node* CreatList(){int x;node *head new node(); // 創建頭節點head->next NULL;node *tail head; // 尾指針初始指向頭節點while…

LabVIEW Val (Sgnl) 屬性

在 LabVIEW 事件驅動架構中&#xff0c;Val (Sgnl) 屬性&#xff08;Value (Signaling)&#xff09;是實現編程觸發與用戶交互行為一致性的關鍵技術。與普通 Value 屬性不同&#xff0c;Val (Sgnl) 在修改控件值的同時強制生成值改變事件&#xff0c;確保程序邏輯與 UI 交互保持…

04.MySQL數據類型詳解

MySQL數據類型詳解 文章目錄 MySQL數據類型數據類型分類數值類型 tinyint類型bit類型float類型decimal類型 字符串類型 char類型varchar類型char和varchar比較 時間日期類型enum和set類型數據類型選擇的進階技巧常見誤區與解決方案性能優化與最佳實踐 MySQL數據類型 數據類型…

Spring AI 之對話記憶(Chat Memory)

大型語言模型&#xff08;LLMs&#xff09;是無狀態的&#xff0c;這意味著它們不會保留關于之前交互的信息。當想在多次交互中保持上下文或狀態時&#xff0c;這可能會成為一個限制。為了解決這一問題&#xff0c;Spring AI 提供了對話記憶功能&#xff0c;允許你在與大型語言…

H?lder Statistical Pseudo Divergence Proper H?lder Divergence

目錄 Hlder Statistical Pseudo DivergenceProper Hlder Divergence Hlder Statistical Pseudo Divergence Hlder Statistical Pseudo Divergence是一種度量兩個概率分布 p p p 和 q q q差異的方法&#xff0c;它基于Hlder不等式。定義如下&#xff1a; D α H ( p : q ) 1 …

時序數據庫IoTDB基于云原生的創新與實踐

概述 Apache IoTDB 是一款獨立自研的物聯網時序數據庫&#xff0c;作為 Apache 基金會的頂級項目&#xff0c;它融合了產學研的優勢&#xff0c;擁有深厚的科研基底。IoTDB 采用了端邊云協同的架構&#xff0c;專為物聯網設計&#xff0c;致力于提供極致的性能。 數據模型 I…

git 如何解決分支合并沖突(VS code可視化解決+gitLab網頁解決)

1、定義&#xff1a;兩個分支修改了同一文件的同一行代碼&#xff0c;無法自動決定如何合并代碼&#xff0c;需要人工干預的情況。&#xff08;假設A提交了文件a,此時B在未拉取代碼的情況下&#xff0c;直接提交是會報錯的&#xff0c;此時需要拉取之后再提交才會成功&#xff…

系統架構設計師(一):計算機系統基礎知識

系統架構設計師&#xff08;一&#xff09;&#xff1a;計算機系統基礎知識 引言計算機系統概述計算機硬件處理器處理器指令集常見處理器 存儲器總線總線性能指標總線分類按照總線在計算機中所處的位置劃分按照連接方式分類按照功能分類 接口接口分類 計算機軟件文件系統文件類…

聊一聊接口測試中緩存處理策略

目錄 一、強制繞過緩存 添加時間戳參數 修改請求頭 二、主動清除緩存 清除本地緩存 清除服務端緩存&#xff08;需權限&#xff09; 清除CDN緩存 三、測試緩存邏輯 首次請求獲取數據 記錄響應頭中的緩存標識????? 驗證緩存生效 測試緩存過期??????? 四…

機器學習算法-邏輯回歸

今天我們用 「預測考試是否及格」 的例子來講解邏輯回歸&#xff0c;從原理到實現一步步拆解&#xff0c;保證零基礎也能懂&#xff01; &#x1f3af; 例子背景 假設你是班主任&#xff0c;要根據學生的「學習時間」預測「是否及格」&#xff0c;手上有以下數據&#xff1a;…