JDK、JRE、編譯指令和垃圾回收機制詳解

JDK

  • 全稱 Java SE Development Kit (Java 開發工具包)

  • JVM虛擬機:Java運行的地方

  • 核心類庫:Java提前編好的東西

  • 開發工具: javac,java,jdb,jhat

    • javac:Java編譯器,用于將Java源代碼編譯成Java字節碼文件(.class)。

    • java: java虛擬機,用于運行字節碼文件(.class)

    • jdb: java調試工具,用于debug

    • jhat:java分析工具,用于監測內存

    • ......

JRE

  • JRE全稱 java Runtime Environment (Java運行時環境)。

  • JVM:Java虛擬機

  • 核心類庫:Java提前編寫好的東西

  • 運行工具

    • Java

    • ......

總結

JDK 包含 JER 包含 JVM

編譯指令

# 將srcFile所指向的(.java)文件編譯成字節碼文件(.class) 到destdir指向的文件夾
javac -d destdir srcFile
#java -d . srcFile  (.)表示當前路徑
#destdir 一定是一個文件夾地址( D:/Main.class)默認Main.class為文件夾
?
#java 執行命令后面接的是(Java類名)不是class文件的名稱,也不是 Java 源文件
#名。
java Java類名
java - classpath dirl;dir2;dir3 .. .;dirN Java類
  • .java 源文件通常可以是任何名稱,但是當類中有一個public時,文件名和類名必須相同

  • 所有javac 編譯不需要指定文件名稱只要路徑

  • 默認文件名為源文件所定義的類名 如果一個.java文件有多個類那么就會為每個類創建.class

  • -classpath dirl;dir2;dir3 如果設置了classpath 環境變量 , Java 解釋器將只在 CLASSPATH 環境變量所指定的系列路徑中搜索 Java 類

###

jshell

JDK9 工具的大改進就是提供了 jshell 工具它是 REPL CRead-Eval-Print Loop (交互式的編程環境)工具 該工具是一個交互式的命令行界面,可用于執行 Java 語言的變量聲明、語句 表達式,而且可以立即看 到執行結果 因此,我們可以使用該工具來快速學習 Java 或測試 Java 的新 API

常用命令
  1. /help:顯示關于JShell命令的幫助信息。

  2. /reset:重置JShell,清除所有已輸入的內容。

  3. /reload:重新加載JShell文件,使得最新的更改生效。

  4. /edit:編輯先前輸入的代碼片段。

  5. /list:列出當前定義的所有變量、方法和類。

  6. /vars:列出當前定義的所有變量。

  7. /methods:列出當前定義的所有方法。

  8. /types:列出當前定義的所有類和接口。

  9. /imports:列出當前導入的所有包和類。

  10. /exit:退出JShell。

Java的垃圾回收機制

  • Serial收集器:Serial收集器是一種單線程的垃圾回收器,它使用標記-復制算法來回收內存。適用于小型應用或者客戶端應用。

  • Parallel收集器:Parallel收集器是Serial收集器的多線程版本,它也使用標記-復制算法。適用于高吞吐量的服務器應用。

  • CMS收集器:CMS(Concurrent Mark Sweep)收集器是一種并發的垃圾回收器,它使用標記-清除算法。它在應用程序運行期間和應用程序線程并發地進行垃圾回收。適用于對響應時間有較高要求的應用。

  • G1收集器:G1(Garbage First)收集器是一種面向服務器應用的垃圾回收器,它使用分代收集和標記-整理算法。它的特點是將堆內存劃分為多個區域,每個區域可以作為年輕代或老年代,同時進行并發標記和并發整理。適用于大內存應用和低延遲要求的應用。

  • ZGC收集器:ZGC(Z Garbage Collector)收集器是Java 11引入的一種低延遲的垃圾回收器。它使用了柔性的內存布局和無停頓的垃圾回收算法,可以在幾毫秒的時間內處理非常大的堆。適用于對延遲要求非常嚴格的應用。

  1. 標記-復制算法

    • 標記-復制算法是一種用于解決內存碎片問題的垃圾回收算法。它將堆內存分為兩個區域:一個用于存活對象,另一個用于新創建的對象。垃圾回收器首先在存活對象的區域中進行標記,然后將存活對象復制到另一個區域,最后清除原區域中的所有對象。這樣可以解決內存碎片問題,但是會產生內存浪費。

    • 優點:高效,不會產生內存碎片。

    • 缺點:會浪費一部分內存空間。

  2. 標記-清除算法

    • 標記-清除算法是一種較為簡單的垃圾回收算法。它分為兩個階段:標記階段和清除階段。在標記階段,垃圾回收器會標記所有活動對象;在清除階段,垃圾回收器會清除所有未被標記的對象。這種算法會產生內存碎片,并且在清除階段需要暫停應用程序。

    • 優點:簡單,實現相對容易。

    • 缺點:會產生內存碎片,并且在清除階段會暫停應用程序。

  3. 分代收集

    • 分代收集是一種優化垃圾回收效率的方法。根據對象的生命周期將堆內存劃分為不同的代(Generation),通常分為年輕代(Young Generation)和老年代(Old Generation)。年輕代中的對象生命周期較短,老年代中的對象生命周期較長。垃圾回收器會根據各代對象的特性采用不同的垃圾回收算法和策略,如標記-復制算法用于年輕代,標記-清除算法用于老年代。

    • 優點:根據對象的生命周期采用不同的回收策略,提高了垃圾回收效率。

    • 缺點:需要維護多個代,增加了復雜性。

  4. 標記-整理算法

    • 標記-整理算法是一種用于解決內存碎片問題的垃圾回收算法。它首先標記所有活動對象,然后將活動對象向一端移動,然后清理掉不再使用的內存空間。這樣可以使得內存空間連續,避免了內存碎片問題。

    • 優點:解決了內存碎片問題,不會浪費內存空間。

    • 缺點:需要移動對象,可能會導致一定的性能開銷。

  5. 柔性的內存布局和無停頓的垃圾回收算法

    • 柔性的內存布局和無停頓的垃圾回收算法是一種針對低延遲應用的垃圾回收技術。它采用了一系列技術來減少垃圾回收造成的停頓時間,如并發標記、并發清除、并發整理等。這種算法通常用于需要快速響應時間的應用場景,如金融交易、實時游戲等。

    • 優點:減少了垃圾回收造成的停頓時間,提高了應用程序的響應速度。

    • 缺點:實現相對復雜,可能會增加系統的開銷。

運行

.java --> 編譯(Compilation) --(.class)--> 加載(Loading) -->連接(Linking) -->初始化(Initialization) -->執行(Execution) -->卸載(Unloading)

  • 編譯(Compilation): 將源文件編譯成字節碼文件(.class)

  • 加載(Loading): JVM 將字節碼文件(.class)解釋或編譯成特定平臺的機器代碼加載到內存

  • 連接(Linking):Java的鏈接過程與C++的鏈接不同。Java是在運行時進行鏈接的,稱為動態鏈接。

    • 驗證:已經在加載階段提到,確保加載的類的二進制信息的正確性。

    • 準備:同樣已經在加載階段提到。

    • 解析:把類中的符號引用轉換為直接引用。

  • 初始化(Initialization),Java虛擬機(JVM)會對類進行初始化,包括執行靜態變量的賦值和靜態代碼塊的初始化。

  • 執行(Execution) : Java虛擬機開始執行程序。

  • 卸載(Unloading):內存空間會被垃圾回收器回收,從而釋放內存資源。

c++

.c --> 預處理(Pre-processor) --(.i)->編譯(Compiler) -(.s)->匯編(Assmbler) --(.o)->連接(Liniker) -->.exe

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

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

相關文章

[STM32-HAL庫]AS608-指紋識別模塊-STM32CUBEMX開發-HAL庫開發系列-主控STM32F103C8T6

目錄 一、前言 二、詳細步驟 1.光學指紋模塊 2.配置STM32CUBEMX 3.程序設計 3.1 輸出重定向 3.2 導入AS608庫 3.3 更改端口宏定義 3.4 添加中斷處理部分 3.5 初始化AS608 3.6 函數總覽 3.7 錄入指紋 3.8 驗證指紋 3.9 刪除指紋 3.10 清空指紋庫 三、總結及資源 一、前言 …

[力扣題解] 797. 所有可能的路徑

題目&#xff1a;797. 所有可能的路徑 思路 深度搜索 代碼 // 圖論哦!class Solution { private:vector<vector<int>> result;vector<int> path;// x : 當前節點void function(vector<vector<int>>& graph, int x){int i;// cout <&l…

解決鼠標滾動時element-ui日期選擇器錯位的問題

解決方案&#xff1a;監聽鼠標滾動事件&#xff0c;在鼠標滾動時隱藏element-ui日期選擇器下拉框 1、先在util文件夾下創建個hidePicker.js文件&#xff0c;代碼如下&#xff1a; let el nullconst fakeClickOutSide () > {const SELECTWRAP_BODY document.body // bod…

Day37 貪心算法part04

LC860檸檬水找零(未掌握) 未掌握分析&#xff1a;20的時候找零卡住&#xff0c;同時貪心思路就想了很久 當bill[i]20的時候&#xff0c;我們有兩種找零范式&#xff0c;找零10、5和找零三個5&#xff0c;優先找零10、5&#xff0c;因為三個5是可以替代10、5的情況的&#xff0…

Nebula街機模擬器 Mac移植版(400+游戲roms)漢化版

nebula星云模擬器是電腦上最熱門的街機游戲模擬器之一&#xff0c;玩家可以通過這個小巧的模擬器軟件進行多款經典街機游戲啟動和暢玩&#xff0c;本次移植的包含400多款游戲roms&#xff0c;經典的三國志、三國戰紀、拳皇、街霸、合金彈頭、1941都包含在內。 下載地址&#xf…

CompletableFuture的主要用途是什么?

CompletableFuture 的主要用途是為復雜的異步編程模型提供一種更簡單&#xff0c;更具可讀性的方式。它主要用于以下幾個方面&#xff1a; 非阻塞計算&#xff1a;CompletableFuture 為處理高延遲的計算任務提供了非阻塞的解決方案。你可以啟動一個計算任務&#xff0c;而不需要…

前端 CSS 經典:好看的標題動畫

前言&#xff1a;好看的標題動畫實現。 效果&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><…

YOLOv5 AssertionError: “XXX” acceptable suffix is [‘.pt‘]

使用終端訓練YOLOv5模型報錯&#xff0c;原命令為&#xff1a; “python train.py --img 640 --batch 1 --epochs 25 --data "C:\Users\GRT\PycharmProjects\yolov5-7.0\animal_training\dataset.yaml " --weights “C:\Users\GRT\PycharmProjects\yolov5-7.0\MyFunc…

組播協議簡介

一、組播協議介紹 組播協議是一種網絡通信協議&#xff0c;它允許一個發送者同時向多個接收者發送數據。以下是組播協議的一些特點&#xff1a; 高效性&#xff1a;組播協議可以有效地利用網絡帶寬&#xff0c;因為它只需要發送一份數據副本&#xff0c;就可以被多個接收者同…

藍橋樓賽第30期-Python-第三天賽題 從參數中提取信息題解

樓賽 第30期 Python 模塊大比拼 提取用戶輸入信息 介紹 正則表達式&#xff08;英文為 Regular Expression&#xff0c;常簡寫為regex、regexp 或 RE&#xff09;&#xff0c;也叫規則表達式、正規表達式&#xff0c;是計算機科學的一個概念。 所謂“正則”&#xff0c;可以…

docker swarm多主機之間的端口無法訪問,但能ping通 問題排查及解決

已排查&#xff1a;1.ufw status 防火墻已關閉 2.selinux已關閉 3.netstat -ntpl :::8088 未限制ip 問題&#xff1a;docker swarm多主機之間的端口無法訪問&#xff0c;但能ping通&#xff0c;同一主機下的端口也可以訪問。 原因&#xff1a;docker overlay網絡內部使用…

【Linux取經路】初識線程——線程控制

文章目錄 一、什么是線程&#xff1f;1.1 Linux 中線程該如何理解&#xff1f;1.2 如何理解把資源分配給線程&#xff1f;1.2.1 虛擬地址到物理地址的轉換 1.3 線程 VS 進程1.3.1 線程為什么比進程更輕量化&#xff1f;1.3.2 線程的優點1.3.3 線程缺點1.3.4 線程異常1.3.5 線程…

關于基礎的流量分析(1)

1.對于流量分析基本認識 1&#xff09;簡介&#xff1a;網絡流量分析是指捕捉網絡中流動的數據包&#xff0c;并通過查看包內部數據以及進行相關的協議、流量分析、統計等來發現網絡運行過程中出現的問題。 2&#xff09;在我們平時的考核和CTF比賽中&#xff0c;基本每次都有…

MySQL用戶管理操作

用戶權限管理操作 DCL語句 一.用戶管理操作 MySQL軟件內部完整的用戶格式&#xff1a; 用戶名客戶端地址 admin1.1.1.1這個用戶只能從1.1.1.1的客服端來連接服務器 admin1.1.1.2這個用戶只能從1.1.1.2的客服端來連接服務器 rootlocal host這個用戶只能從服務器本地進行連…

Prompt - 流行的10個框架

轉載自&#xff1a;https://juejin.cn/post/7287412759050289212 文章目錄 1、ICIO框架2、CRISPE框架3、BROKE框架4、CREATE框架5、TAG框架6、RTF框架7、ROSES框架8、APE框架9、RACE框架10、TRACE框架 測試用例 為了看到不同的Prompt框架效果&#xff0c;本文定義一個統一的測…

ACM實訓

【碎碎念】繼續搞習題學習&#xff0c;今天完成第四套的ABCD&#xff0c;為下一周擠出時間復習&#xff0c;加油 Digit Counting 問題 法希姆喜歡解決數學問題。但有時解決所有的數學問題對他來說是一個挑戰。所以有時候他會為了解決數學難題而生氣。他拿起一支粉筆&#xff…

Java面試八股之進程和線程的區別

Java進程和線程的區別 定義與作用&#xff1a; 進程&#xff1a;在操作系統中&#xff0c;進程是程序執行的一個實例&#xff0c;是資源分配的最小單位。每個進程都擁有獨立的內存空間&#xff0c;包括代碼段、數據段、堆空間和棧空間&#xff0c;以及操作系統分配的其他資源…

工廠模式(簡單工廠模式+工廠模式)

工廠模式的目的就是將對象的創建過程隱藏起來&#xff0c;從而達到很高的靈活性&#xff0c;工廠模式分為三類&#xff1a; 簡單工廠模式工廠方法模式抽象工廠模式 在沒有工廠模式的時候就是&#xff0c;客戶需要一輛馬車&#xff0c;需要客戶親自去創建一輛馬車&#xff0c;…

PDF之Blend Mode(混合模式)BM(對應OFD的BlendMode)

Blend Mode&#xff08;混合模式&#xff09;用于定義對象與背景或其他對象之間的顏色混合方式。PDF支持多種混合模式&#xff0c;常見的混合模式包括&#xff1a; Normal&#xff1a;正常混合模式&#xff0c;將對象顏色直接疊加在背景上。 Multiply&#xff1a;乘法混合模式…

經驗分享:C++ error:‘syscall’ was not declared in this scope

明明已經加了頭文件 #include <sys/syscall.h>#define gettid() syscall(__NR_gettid)但是依舊不能使用 syscall() 函數&#xff0c; 檢查源碼后&#xff1a; sys/syscall.h 內部表示&#xff0c;他封裝了 打開對應的 syscall.h 文件內部依舊沒有 syscall()函數的聲明…