JAVA面試匯總(四)JVM(一)

久違的重新寫了一篇面試匯總的,關于JVM的一篇,一共三篇,今天寫了第一篇,繼續重新學習,重新卷起來,come on baby
1.什么情況下會觸發類的初始化?

(1)首先是類未被初始化時,創建類的實例(new 的方式),訪問某個類或接口的靜態變量,或者對該靜態變量賦值,調用類的靜態方法。
(2)對類進行反射調用的時候,如果類沒有進行過初始化,則需要先觸發其初始化。
(3)如果在初始化某一個類時候,其父類沒有被初始化時候,則會觸發父類的初始化。
(4)當咱們打的jar包,在執行完java -jar命令后,用戶需要指定一個要執行的主類(包含 main() 方法的那個類,例如SpringBoot的那個啟動類的main方法,非SpringBoot的,咱們自己手動打包的一般在MANIFEST.MF文件中指定),虛擬機會先初始化這個主類。
(5)JDK 1.7新增了一種反射方式java.lang.invoke.MethodHandle,通過實MethodHandle同樣是訪問靜態變量,對該靜態變量賦值,調用類的靜態方法,前提仍然是該類未被初始化。

2.談談你對解析與分派的認識。

(1)解析調用是將那些在編譯期就完全確定,在類加載的解析階段就將涉及的符號引用全部轉變為可以確定的直接引用,不會延遲到運行期再去完成。
(2)分派又分為靜態分派和動態分派
(3)靜態分派:同樣是將編譯期確定的調用,重載(Oveload)就是這種類型,在編譯期通過參數的靜態類型(注意不是實際類型)作為判斷依據,找到具體的調用的方法。

public class TestOverLoad {public static void main(String[] args) {//靜態類型都是Parent,實際類型分別是Sun和DaughterParent sun = new Sun();Parent daughter = new Daughter();TestOverLoad test = new TestOverLoad();//輸出結果按照靜態類型執行test.testMethod(sun);test.testMethod(daughter);}static abstract class Parent { }static class Sun extends Parent { }static class Daughter extends Parent { }public void testMethod(Parent parent) {System.out.println("hello, Parent");}public void testMethod(Sun sun) {System.out.println("hello, Sun");}public void testMethod(Daughter daughter) {System.out.println("hello, Daughter");}
}//輸出
hello, Parent
hello, Parent

(4)動態分派:運行期根據實際類型確定方法執行版本的分派過程稱為動態分派。重寫(Override),在運行時期,通過判斷實體的真實類型,判斷具體執行哪一個方法。

public class TestOverride {public static void main(String[] args) {//靜態類型都是Parent,實際類型分別是Sun和DaughterParent sun = new Sun();Parent daughter = new Daughter();//這時候輸出結果按照實際類型找到方法sun.testMethod();daughter.testMethod();}static abstract class Parent {public void testMethod() {System.out.println("hello, Parent");}}static class Sun extends Parent {@Overridepublic void testMethod() {System.out.println("hello, Sun");}}static class Daughter extends Parent {@Overridepublic void testMethod() {System.out.println("hello, Daughter");}}
}
//輸出
hello, Sun
hello, Daughter
3.Java類加載器包括?種?它們之間的??關系是怎么樣的?雙親委派機制是什么意思?有什么好處?

(1)啟動類加載器(Bootstrap ClassLoader),由C語言編寫的。負責把<JAVA_HOME>\lib目錄中的類庫加載到虛擬機內存中。
(2)擴展類加載器(Extension ClassLoader):這個加載器由sun.misc.LauncherExtClassLoader實現,它負責加載<JAVA_HOME>\lib\ext目錄中的,或者被java.ext.dirs系統變量所指定的路徑中的所有類庫,開發者可以直接使用擴展類加載器。 (3)應用程序類加載器(Application ClassLoader):這個類加載器由sun.misc.LauncherApp-ClassLoader實現。由于這個類加載器是ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也稱它為系統類加載器。它負責加載用戶類路徑(ClassPath)上所指定的類庫,開發者可以直接使用這個類加載器,如果應用程序中沒有自定義過自己的類加載器,一般情況下這個就是程序中默認的類加載器。
(4)自定義類加載器。下面是自定義類加載器的方式,這個有幾點注意,TestDemo編譯出來class,把class復制到idea或者eclipse生成target目錄之外,因為需要刪除掉TestDemo.java,這樣target下的class可能也自動沒有了,另外如果不刪除TestDemo.java會導致一直輸出默認的應用程序加載器,因為你運行環境里有,雙親委派的應用程序加載器能找TestDemo,所以默認用父類的了,所以必須刪除掉。

package test;public class TestDemo {private String name;public TestDemo(){}public TestDemo(String name){this.name = name;}public String getName(){return name;}public void setName(String name){this.name = name;}public String toString(){return "Demo name is " + name;}
}
package test;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;public class TestMyClassLoader extends ClassLoader
{public TestMyClassLoader(){}public TestMyClassLoader(ClassLoader parent){super(parent);}protected Class<?> findClass(String name) throws ClassNotFoundException{File file = getClassFile(name);try{byte[] bytes = getClassBytes(file);Class<?> c = this.defineClass(name, bytes, 0, bytes.length);return c;}catch (Exception e){e.printStackTrace();}return super.findClass(name);}private File getClassFile(String name){//重點是這個路徑,在本地編譯好TestDemo后,把class放在一個其他路徑下//不要默認用idea或者eclipse的target路徑//注意運行這個類之前把代碼的TestDemo.java刪除掉或者注釋掉//否則怎么運行都是默認的加載器AppClassLoaderFile file = new File("/Users/buxuesong/TestDemo.class");return file;}private byte[] getClassBytes(File file) throws Exception{// 這里要讀入.class的字節,因此要使用字節流FileInputStream fis = new FileInputStream(file);FileChannel fc = fis.getChannel();ByteArrayOutputStream baos = new ByteArrayOutputStream();WritableByteChannel wbc = Channels.newChannel(baos);ByteBuffer by = ByteBuffer.allocate(1024);while (true){int i = fc.read(by);if (i == 0 || i == -1)break;by.flip();wbc.write(by);by.clear();}fis.close();return baos.toByteArray();}public static void main(String[] args) throws Exception{TestMyClassLoader mcl = new TestMyClassLoader();Class<?> c1 = Class.forName("test.TestDemo", true, mcl);Object obj = c1.newInstance();System.out.println(obj);System.out.println(obj.getClass().getClassLoader());}
}
//輸出
Demo name is null
test.TestMyClassLoader@5cad8086
//如果沒刪除TestDemo.java輸出
Demo name is null
sun.misc.Launcher$AppClassLoader@18b4aac2

(5)擴展類加載器的父類是啟動類加載器,應用程序類加載器的父類是擴展類加載器,自定義類加載器的父類是應用程序類加載器。
(6)雙親委派機制:除了啟動類加載器,其余加載器都應該有自己的父類加載器,當一個類加載器需要加載某個類時,默認把這個累交給自己的父類去加載,只有當父類無法加載這個類時候(它的搜索范圍中沒有找到所需的類),自己才去加載,按照這個規則,所有的累加載最終都會到啟動類加載器過一遍。
(7)雙親委派實際上保障了Java程序的穩定運作,因為隨著這種父類關系自帶了一種層級關系,按照層級關系來分別加載,如果不按照順序各個加載器自行加載,用戶如果自己寫了一個java. lang.Object的類,系統會出現多個Object類,導致整個java體系無法運轉。

4.如何?定義?個類加載器?你使?過哪些或者你在什么場景下需要?個?定義的類加載器嗎?

(1)這問題問了我上面的,我在寫一遍,自定義類加載器,有幾點注意,TestDemo編譯出來class,把class復制到idea或者eclipse生成target目錄之外,因為需要刪除掉TestDemo.java,這樣target下的class可能也自動沒有了,另外如果不刪除TestDemo.java會導致一直輸出默認的應用程序加載器,因為你運行環境里有,雙親委派的應用程序加載器能找TestDemo,所以默認用父類的了,所以必須刪除掉。

package test;public class TestDemo {private String name;public TestDemo(){}public TestDemo(String name){this.name = name;}public String getName(){return name;}public void setName(String name){this.name = name;}public String toString(){return "Demo name is " + name;}
}
package test;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;public class TestMyClassLoader extends ClassLoader
{public TestMyClassLoader(){}public TestMyClassLoader(ClassLoader parent){super(parent);}protected Class<?> findClass(String name) throws ClassNotFoundException{File file = getClassFile(name);try{byte[] bytes = getClassBytes(file);Class<?> c = this.defineClass(name, bytes, 0, bytes.length);return c;}catch (Exception e){e.printStackTrace();}return super.findClass(name);}private File getClassFile(String name){//重點是這個路徑,在本地編譯好TestDemo后,把class放在一個其他路徑下//不要默認用idea或者eclipse的target路徑//注意運行這個類之前把代碼的TestDemo.java刪除掉或者注釋掉//否則怎么運行都是默認的加載器AppClassLoaderFile file = new File("/Users/buxuesong/TestDemo.class");return file;}private byte[] getClassBytes(File file) throws Exception{// 這里要讀入.class的字節,因此要使用字節流FileInputStream fis = new FileInputStream(file);FileChannel fc = fis.getChannel();ByteArrayOutputStream baos = new ByteArrayOutputStream();WritableByteChannel wbc = Channels.newChannel(baos);ByteBuffer by = ByteBuffer.allocate(1024);while (true){int i = fc.read(by);if (i == 0 || i == -1)break;by.flip();wbc.write(by);by.clear();}fis.close();return baos.toByteArray();}public static void main(String[] args) throws Exception{TestMyClassLoader mcl = new TestMyClassLoader();Class<?> c1 = Class.forName("test.TestDemo", true, mcl);Object obj = c1.newInstance();System.out.println(obj);System.out.println(obj.getClass().getClassLoader());}
}
//輸出
Demo name is null
test.TestMyClassLoader@5cad8086
//如果沒刪除TestDemo.java輸出
Demo name is null
sun.misc.Launcher$AppClassLoader@18b4aac2

(2)我們之前寫的獲取數據庫連接,通過class.forname去加載數據庫驅動。以及熱加載這種方式,咱們修改了java文件,但是tomcat沒有手動重啟,這個時候有一個能夠監控到java有變化重新編譯了的情況,通過線程出發tomcat重啟,就達到了熱加載的機制。還有就是apk加密的方式,打包時候,源碼-》class-》加密-》打成jar包-》安裝-》運行-》classLoader解密-》classLoader加載-》用戶使用app,這樣只有實現解密方法的classloader才能正常加載,其他的classLoader無法運行。

5.堆內存設置的參數是什么?

(1)-Xms初始堆內存大小
(2)-Xmx最大堆內存大小,生產環境中,JVM的Xms和Xmx建議設置成一樣的,能夠避免GC時還要調整堆大小。
(3)-XX:NewSize=n,設置年輕代大小-XX:NewRatio=n設置年輕代和年老代的比值。如:-XX:NewRatio=3,表示年輕代與年老代比值為1:3,年輕代占整個年輕代年老代和的1/4,默認新生代和老年代的比例=1:2
(4)-XX:SurvivorRatio=n,設置年輕代中Eden區與兩個Survivor區的比值。注意Survivor區有兩個,默認是8,表示Eden:S0:S1=8:1:1如:-XX:SurvivorRatio=3,表示Eden:Survivor=3:2,一個Survivor區占整個年輕代的1/5。
(5)-XX:+HeapDumpOnOutOfMemoryError,-XX:HeapDumpPath,這兩個是設置但程序OOM后,輸出Dump文件以供分析原因的,但是對于目前的K8s的情況,這倆沒什么用,OOM之后,K8s發現服務沒響應,直接kill了,然后重啟一個新的,OOM根本就來不及生成,因為生成文件耗時較多,K8s殺的很快。
(6)-Xss128k 設置每個線程的堆棧大小。
(7)-XX:+PrintGCDetails,輸出GC日志。

感謝各位的閱讀,幫忙點贊,感謝各位。
最后編輯于:2025-06-22 10:05:52


喜歡的朋友記得點贊、收藏、關注哦!!!

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

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

相關文章

Agent中的memory

rag系列文章目錄 文章目錄rag系列文章目錄前言一、Memory機制作用二、memory分類三、langgraph實踐總結前言 眾所周知&#xff0c;大模型是無狀態的。但是基于大模型的agent一般是有狀態的&#xff0c;也就是它有記憶功能。在AI Agent框架中&#xff0c;Memory機制是核心組件之…

AI與IT從業者的未來:替代焦慮還是協作革命?

??引言&#xff1a;技術滲透與核心命題??2025年&#xff0c;人工智能技術已從實驗室走向產業核心。國務院《關于深入實施“人工智能”行動的意見》推動AI在醫療、制造、金融等領域的規模化落地&#xff0c;全球AI應用用戶規模突破2.3億&#xff0c;生成式AI工具滲透率達16.…

手機版碰一碰發視頻系統批量剪輯功能開發,支持OEM貼牌

引言在當今短視頻盛行的時代&#xff0c;視頻內容的快速生產與分享變得愈發重要。手機版碰一碰發視頻系統&#xff0c;借助 NFC 等近場通信技術&#xff0c;實現了便捷的數據交互與視頻分享&#xff0c;而在此基礎上集成的批量剪輯功能&#xff0c;更是為內容創作者和商家帶來了…

Spring AMQP如何通過配置文件避免硬編碼實現解耦

在使用Spring AMQP基于注解聲明監聽者時&#xff0c;可通過抽取常量來避免硬編碼&#xff1a;RabbitListener(bindings QueueBinding(exchange Exchange(MQConstant.USER_EXCHANGE),value Queue(MQConstant.USER_QUEUE),key MQConstant.USER_REDIS_BINDING))public void de…

解決zabbix圖片中文亂碼

要把 Zabbix 前端字體替換為 simkai.ttf&#xff08;楷體&#xff0c;解決亂碼常用&#xff09;&#xff0c;按以下步驟操作&#xff1a;1. 確認 simkai.ttf 路徑 先找到系統里 simkai.ttf 字體文件&#xff0c;若沒有&#xff0c;可從 Windows 系統&#xff08;C:\Windows\Fon…

實例分割-動手學計算機視覺13

介紹 實例分割(instance segmentation)的目的是從圖像中分割出每個目標實例的掩模(mask)。與語義分割相比&#xff0c;實例分割不但要區分不同的類別&#xff0c;還要區分出同一種類別下的不同目標實例。如圖13-1所示 語義分割的結果中&#xff0c;不同的羊對應的標簽是一樣的…

水環境遙感分析!R語言編程+多源遙感數據預處理;水體指數計算、水深回歸分析、水溫SVM預測、水質神經網絡建模及科研級可視化制圖

系統性地整合R語言編程、遙感數據處理及機器學習建模&#xff0c;涵蓋水線提取&#xff08;水體指數與閾值法&#xff09;、水深反演&#xff08;多元回歸&#xff09;、水溫預測&#xff08;支持向量機&#xff09;、水質評估&#xff08;神經網絡&#xff09;等核心內容&…

微信公眾號/小程序百萬級OpenID自動化獲取工具

摘要 本報告詳細闡述了微信用戶列表數據獲取與處理工具的設計思路,包括分頁處理機制、頻率控制策略、斷點續傳功能和分布式存儲方案。針對微信API調用限制和用戶數據規模特點,該工具旨在高效、安全地獲取和存儲微信用戶列表數據,同時嚴格遵守微信API調用頻率限制,確保系統…

物聯網系統中傳感器到網關到物聯網平臺的傳輸路徑、協議、原理、用途與架構詳解

摘要物聯網&#xff08;IoT&#xff09;系統通過傳感器、網關和物聯網平臺實現數據的采集、傳輸、處理和應用。本文詳細分析了傳感器到網關再到物聯網平臺的傳輸路徑&#xff0c;涵蓋直接連接、網關中繼、邊緣計算、多級網關和混合路徑五種方式&#xff1b;介紹了短距離&#x…

SpringBoot自動注入配置類初步實現

一.SpringBoot自動裝配SpringBoot 的 自動裝配&#xff08;Auto-Configuration&#xff09; 是它的核心特性之一&#xff0c;它讓開發者可以 "開箱即用"&#xff0c;避免手動配置大量的 XML 或 Java Config。它的核心思想是&#xff1a;"約定優于配置"&…

直播預告|鴻蒙生態中的AI新玩法

想知道鴻蒙生態里 AI 能玩出啥新花樣&#xff1f; 8 月 14 日&#xff08;周四&#xff09;20:00 &#xff0c;「開發者?面對面 堅果派特輯 —— 鴻蒙生態中的 AI 新玩法」直播來襲&#xff01; &#x1f50d; 直播亮點搶先看 AI賦能鴻蒙產品開發&#xff1a;將分享如何利用AI…

智能合約:區塊鏈時代的“數字契約革命”

一、技術原理與核心特征1. 定義與本質智能合約是運行在區塊鏈上的自動化程序&#xff0c;通過代碼定義業務規則&#xff0c;在預設條件滿足時自動執行操作&#xff08;如資金轉移、信息更新&#xff09;&#xff0c;無需人工干預。其核心特性包括&#xff1a;自動執行&#xff…

【數據分析】比較SparCC、Pearson和Spearman相關性估計方法在合成組學數據上的表現

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹 加載R包 模擬數據 構建網絡 RMSE指數計算 畫圖 總結 系統信息 介紹 在生物信息學和生態學研究中,組學數據的分析越來越依賴于對微生物群落或基因表達數據中物種或基因間相關性的…

Google C++ 風格指南

文章目錄背景介紹風格指南的目標C 版本頭文件自包含頭文件#define 防護包含所需內容前置聲明在頭文件中定義函數頭文件包含順序與命名規范作用域命名空間內部鏈接非成員函數、靜態成員函數與全局函數局部變量靜態與全局變量關于析構的決策關于初始化的決策常見模式thread_local…

安裝部署_WVP流媒體

文章目錄一、DEV_WVP流媒體開發手冊1、搭建流媒體服務clone代碼&#xff1a;安裝編譯器cmake構建和編譯項目修改配置文件啟動項目2、搭建GB28181協議視頻平臺安裝 jdk, nodejs, maven, git安裝redis安裝postgresqlclone代碼編譯前端代碼編譯后端代碼配置文件修改3、設備接入測測…

軟件I2C實現(2):I2C協議實現

0 參考資料 I2C 總線規范.pdf 1 I2C協議實現 1.1 SCL、SDA引腳初始化 將SCL、SDA初始化為開漏輸出,電平設置為高電平(使用外部上拉電阻拉高)。 /*** @brief 軟件I2C初始化** @param sw_i2c_cfg 軟件I2C配置指針*/ int sw_i2c_init(sw_i2c_cfg_t *sw_i2c_cfg) {GPIO_InitT…

瘋狂星期四文案網第40天運營日記

網站運營第40天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 今日訪問量 今日搜索引擎收錄情況 必應秒發秒收 百度收錄很慢 網站優化點 優化seo 修復已知bug

【大語言模型 01】注意力機制數學推導:從零實現Self-Attention

注意力機制數學推導&#xff1a;從零實現Self-Attention - 開啟大語言模型的核心密碼 關鍵詞&#xff1a;注意力機制、Self-Attention、Transformer、數學推導、PyTorch實現、大語言模型、深度學習 摘要&#xff1a;本文從數學原理出發&#xff0c;詳細推導Self-Attention的完整…

2025 環法戰車科技對決!維樂 Angel Glide定義舒適新標

環法賽場不僅是頂尖車手的競技舞臺&#xff0c;更是自行車科技的時尚秀場。然而經常騎行的朋友都知道&#xff0c;當頂級戰車遇上專業坐墊&#xff0c;方能成就完美騎行體驗。2025 年環法賽場上的新戰車們各展神通&#xff0c;而維樂 Angel Glide 坐墊以其獨特的科技與設計&…

VS Code配置MinGW64編譯ALGLIB庫

VS Code用MinGW64編譯C代碼安裝MSYS2軟件并配置ALGLIB庫和測試引用庫代碼的完整具體步驟。 1. 安裝 MSYS2 下載 MSYS2&#xff1a; 訪問 MSYS2 官網下載最新安裝包&#xff08;如 msys2-x86_64-latest.exe&#xff09; 安裝&#xff1a; 運行安裝程序&#xff0c;默認路徑為 C…