面試記錄

来源:https://www.cnblogs.com/zz01/archive/2022/07/17/16488039.html
-Advertisement-
Play Games

JVM線程屬於用戶態還是內核態 當進程運行在ring3級別時為用戶態,ring0級別時為內核態 有些操作需要有內核許可權才能進行,那麼有三種由用戶態切換到內核態的情況: 系統調用:操作系統封裝內核指令,統一管理硬體資源,然後向用戶程式提供系統服務,用戶程式進行系統調用,操作系統進行檢查確保全全然後再進 ...


JVM線程屬於用戶態還是內核態

當進程運行在ring3級別時為用戶態,ring0級別時為內核態

有些操作需要有內核許可權才能進行,那麼有三種由用戶態切換到內核態的情況:

  1. 系統調用:操作系統封裝內核指令,統一管理硬體資源,然後向用戶程式提供系統服務,用戶程式進行系統調用,操作系統進行檢查確保全全然後再進行相應的資源訪問操作。比如malloc(),print()調用write()系統輸出字元串
  2. 異常事件:當cpu正在運行用戶態程式,發生不可預知的異常事件,就會轉用戶態,比如缺頁中斷。
  3. 外圍設備的中斷:當外圍設備完成請求就會向CPU發出中斷信號,此時cpu暫停下一條要執行的指令,去執行中斷信號所對應的程式

相同點和不同點:都是中斷,但是系統調用是主動,其他都是被動

用戶態和內核態線程的映射關係

一對一(內核線程實現)

程式使用輕量級進程和內核線程產生映射

缺點:輕量級進程的數量有限制,執行效率低

多對一(用戶線程實現)

優點:用戶線程數量幾乎無限制,執行效率高

缺點:一個用戶線程阻塞,其他線程也會阻塞

多對多

UT 用戶態線程 LWP 輕量級線程 KLT 內核態線程

1656470393008

優點:

  1. 一個用戶線程的阻塞不會導致所有線程的阻塞,因為此時還有別的內核線程被調度來執行。
  2. 多對多模型對用戶線程的數量沒有限制。
  3. 在多處理器的操作系統中,多對多模型的線程也能得到一定的性能提升,但提升的幅度不如一對一模型的高。在現在流行的操作系統中,大都採用多對多的模型。

用戶態線程:切換代價小,高併發但是容易阻塞

內核態線程:處理能力高,切換代價大

Java線程的實現

虛擬機規範中並沒有限定java線程需要使用哪種線程模型,要根據不同的平臺來說,但是無論使用哪種線程模型,java程式的編碼和運行都是沒有差異的

Java線程調度

線程調度有兩種:協同調度和搶占調度

協同:自己分配時間,自己切換

搶占:系統分配時間,系統決定線程的切換

java線程採用搶占調度

java線程的6種狀態

新建———-運行———無限期等待——–限期等待———阻塞——結束

操作系統線程的幾種狀態

新建———就緒————等待————運行———–結束

java和操作系統的線程對應關係

1.2之前(綠色線程 1:N),程式員為jvm開發了一個線程調度內核,映射到操作系統層面就是用戶態線程;

1.2(1:1)之後,jvmU型安澤了操作系統原生線程模型,映射到操作系統層面就是內核態線程,通過系統調用,將程式的線程交給了操作系統內核進行調度。

通過創建過程來理解

1656474569799

Java的Thread對象:僅僅是一個Java對象

JVM的JavaThread對象:連接著java的Thread對象與OS對象

JVM的OSThread對象:一個工具類,對OS線程API進行了功能性封裝

流程圖:

1656474707894

JVM_StartThread核心做了兩件事情:

1.創建JavaThread對象

​ (1) 設置jvm執行run方法的跳板

​ (2) 調用os::create_thread創建OSThread對象及操作系統線程完成三者的關聯

​ os::create_thread做了一下這些:

​ 創建OSThread對象,將JavaThread對象與OSThread對象進行關聯

線程庫

為開發人員提供創建和管理線程的一套API

三個主要的線程庫:

1)POSIX Pthreads:可以作為用戶或內核庫提供,作為 POSIX 標準的擴展

2)Win32 線程:用於 Window 操作系統的內核級線程庫

3)Java 線程:Java 線程 API 通常採用宿主系統的線程庫來實現,也就是說在 Win 系統上,Java 線程 API 通常採用 Win API 來實現,在 UNIX 類系統上,採用 Pthread 來實現。

操作系統對於鎖的實現

在硬體層面,CPU提供了原子操作、關中斷(可解決單核情況下兩個線程同時獲得鎖)、鎖記憶體匯流排的機制(解決多核情況下兩個線程同時獲得鎖);OS基於這幾個CPU硬體機制,就能夠實現鎖;再基於鎖,就能夠實現各種各樣的同步機制(信號量、消息、Barrier等等等等)

synchronized的底層實現

是通過對象內部的一個監視器鎖(monitor)實現的,監視器鎖有時通過操作系統的互斥鎖來實現的,而且現在主流的java虛擬機實現中,java的線程是映射到操作系統原生的內核線程中的,那麼線程的阻塞或喚醒,就涉及到用戶態和內核態的轉換中,所以是重量級鎖。

是一種塊結構的同步語法,經過javac反編譯之後,會在同步塊的前後分別生成monitorenter和monitorexit兩個位元組碼指令,這兩個指令都需要一個reference類型的參數來指明加鎖解鎖的對象,如果synchronized明確了對象參數。就以這個對象的引用作為reference,如果沒有指定,那就根據修飾的方法類型,來決定是區代碼所在的對象實例還是相應的class對象。

反射的性能優化

兩個地方導致性能差:getMethod和invoke,反射是一個解釋操作,臨時告訴jvm應該做什麼

優化思路1:緩存Method,不重覆調用getMethod
優化思路2:藉助ASM框架,使用reflectAsm,讓invoke變成直接調用

借反射的getDeclaredMethods獲取目標類的所有方法,然後動態生成一個繼承於MethodAccess 的子類SimpleBeanMethodAccess,動態生成一個Class文件並load到JVM中。

SimpleBeanMethodAccess中所有方法名建立index索引,index跟方法名是映射的,根據方法名獲得index,SimpleBeanMethodAccess內部建立的switch直接分發執行相應的代碼,這樣methodAccess.invoke的時候,實際上是直接調用。

hashmap在jdk1.7的死迴圈

多線程頭插法造成的,線程2已經完成擴容散列,鏈表變成了倒序,線程1再進行擴容,將倒序鏈表變成了一個正序鏈表,從而形成環形鏈表,在使用get方法時造成死迴圈。

常用集合

ArrayList

首先有三種構造方法(有參,無參,指定集合參數組成的列表)

主要就是三個方法:

1.ensureCapacityInternal得到最小擴容量,併進行擴容

2.ensureExplicitCapacity//判斷是否需要擴容,如果最小擴容量大於數組現在的長度就調用grow方法

3.grow 進行位運算,擴容1.5倍,併進行判斷是否超出數組的最大容量。

始化數據量為0,add時變為10,當 要 add 進第 1 個元素時,minCapacity 為 1,在 ensureCapacityInternal的Math.max()方法比較後,minCapacity 為 10 ,

最好在 add 大量元素之前用 ensureCapacity 方法(因為是public修飾),以減少增量重新分配的次數

Set Map


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 很多開發同學對SQL優化如數家珍,卻對MySQL架構一知半解。豈不是只見樹葉,不見森林,終將陷入細節中不能自拔。 今天就一塊學習MySQL分層架構,深入瞭解MySQL底層實現原理,以及每層的作用,我們常見的SQL優化到底在哪一層做了優化? ...
  • 整體流程分析 SpringBoot的配置文件有兩種 ,一種是 properties文件,一種是yml文件。在SpringBoot啟動過程中會對這些文件進行解析載入。在SpringBoot啟動的過程中,配置文件查找和解析的邏輯在listeners.environmentPrepared(environ ...
  • 1、一些C++基礎知識 模板類string的設計屬於底層,其中運用到了很多C++的編程技巧,比如模板、迭代器、友元、函數和運算符重載、內聯等等,為了便於後續理解string類,這裡先對涉及到的概念做個簡單的介紹。C++基礎比較扎實的童鞋可以直接跳到第三節。 1.1 typedef 1.1.1 四種常 ...
  • [] 在運行代碼時,我們常常想要知道代碼運行記憶體占用情況。很多情況下我們想知道是不是自己哪個迴圈寫的太繁瑣了,或者是在哪一步可以用更小的記憶體來實現等。所以需要我們對程式整體、某一部分代碼、某一變數運行記憶體使用有更直觀的瞭解。 在本地運行代碼如PyCharm和遠程運行代碼如VScode中都是如何查看內 ...
  • JVM
    JVM 一、什麼是JVM 定義 Java Virtual Machine,JAVA程式的運行環境(JAVA二進位位元組碼的運行環境) 好處 一次編寫,到處運行 自動記憶體管理,垃圾回收機制 數組下標越界檢查 比較 JVM JRE JDK的區別 二、記憶體結構 整體架構 1、程式計數器 作用 用於保存JVM ...
  • 常用的JVM配置參數: -Xms2g:初始化堆大小為 2g; -Xmx2g:堆最大記憶體為 2g; -XX:NewRatio=4:設置年輕的和老年代的記憶體比例為 1:4; -XX:SurvivorRatio=8:設置新生代 Eden 和 Survivor 比例為 8:2; –XX:+UseParNew ...
  • 先認識java的基礎知識 1.變數命名規則 :1)變數名由數字字母下劃線組成,2)不能使用java的關鍵字,比如public這種,3)遵循小駝峰命名法 2.數據類型 2.1基本數據類型有8種 其中分為四種:1)整數型:byte short int long;2)浮點型:float double;3) ...
  • 設計協議 相對於 HTTP 的用處,RPC 更多的是負責應用間的通信,所以性能要求相對更高。但 HTTP 協議的數據包大小相對請求數據本身要大很多,又需要加入很多無用的內容,比如換行符號、回車符等; 還有一個更重要的原因是,HTTP 協議屬於無狀態協議,客戶端無法對請求和響應進行關聯,每次請求都需要 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...