了解JVM

一.JVM概述

1.JVM的作用

?把字節碼編譯為機器碼去執行,負責把字節碼裝載到虛擬機中

?現在的 JVM 不僅可以執行 java 字節碼文件,還可以執行其他語言編譯后的字節碼文件,是一個跨語言平臺

2.JVM的組成部分

  1. 類加載器(ClassLoader)
  2. 運行時數據區(Runtime Data Area)
  3. 本地方法庫(Execution Engine)
  4. 執行引擎(Native Interface)

程序在執行過程中需要把java文件轉換為字節碼文件,然后通過類加載器將文件存儲在內存中的運行時數據區,而字節碼文件是JVM的一套指令集規范,并不能直接交給底層系統去執行,因此需要特定命令的解析器執行引擎,將字節碼編譯為底層系統指令載交給cpu去執行,而這個過程中需要調用本地方法接口去實現整個程序的功能.

二.JVM類加載

1.類加載概述

類加載子系統負責從文件系統或網絡中加載字節碼文件,它只負責加載字節碼文件,至于可不可以運行,則有執行引擎決定

2.類加載過程

2.1加載

使用流將硬盤上的字節碼文件加載到內存中的運行時數據區的方法區,并生成對象的class對象

2.2鏈接

鏈接又分為三個步驟:

-驗證:驗證字節碼格式是否正確,對字節碼描述的信息進行語義分析,以保證其描述的信息符合java的語言規范

-準備:為類中的靜態屬性進行賦值(賦的值為0,在初始化階段在進行賦值)

? ? static int a=123; ? 準備階段a的值為0,在初始化階段才賦值為123

-解析:將字節碼中的邏輯引用替換為直接引用

邏輯引用:字節碼中的邏輯符號

符號引用:內存地址

2.3初始化

為類的靜態變量進行正確的賦值

類什么時候會初始化?

類只要被用到了都會被加載

1.new對象

2.加載子類時

3.反射機制

4.運行類中的main方法

5.使用了類的靜態成員(類.靜態變量? 類.靜態方法)

類什么時候不會被加載?

1.只訪問了類的靜態常量

2.創建的數組對象,只是作為類型存在

3.類加載器的分類

jvm角度來說,應該被分為倆類:

1.引導類加載器,使用 C/C++語言實現,嵌套在 JVM 內部.它用來加載 java 核心類庫.

2.其他所有類加載器,這些類加載器全部由java語言實現,獨立存在于jvm外部,并且全部繼承自抽象類 java.lang.ClassLoader

站在java程序員的角度應該被分為三類:

1.引導類加載器

2.擴展類加載器,從 java.ext.dirs 系統屬性所指定的目錄中加載類庫,或從 JDK 系統安裝目錄jre/lib/ext 子目錄(擴展目錄)下加載類庫

3.應用程序類加載器,加載我們自己定義的類,用于加載用戶類路徑(classpath)上所有的類

4.雙親委派機制

java虛擬機對class文件采用的是按需加載的方式,也就是需要用到類時才把他的class文件加載到內存中生成class對象,在加載某個類的字節碼文件時,jvm采用了雙親委派機制,即把請求交給父類處理,是一種任務委派機制.

工作原理:

如果一個類加載器收到了類加載請求,這個類加載器并不會自己先加載,而是將請求委托給父類的加載器去執行,如果父類加載器還存在父類,則繼續向上委托,一次遞歸,直至得到頂層的啟動類加載器,如果父類的加載器可以完成加載任務就成功返回,然后無法完成,子類才會自己嘗試加載,如果均加載失敗,就會拋出 ClassNotFoundException 異常

優點:安全,可以避免自己寫的類替換java的核心類

如何打破雙親委派機制?

可以自定義類加載器

在 ClassLoader 類中涉及類加載的方法有兩個,loadClass(String name), findClass(String name),這兩個方法并沒有被 final 修飾,也就表示其他子類可以重寫.

三.運行時數據區

1.運行時數據區組成概述

2.程序計數器

用來記錄下一條指令的地址,也就是即將要執行的指令,由執行引擎執行

特點:

?它是一塊很小的內存區域,也是運行速度最快的存儲區域

?在JVM規范中,每個線程都有一個計數器,是線程私有的,他的生命周期與線程一致
?會記錄當前線程正在執行的java程序的JVM指令地址
?是唯一一個JVM規范中沒有規定任何OutOfMemoryError情況的區域

3.虛擬機棧

Java 虛擬機棧(Java Virtual Machine Stack),早期也叫 Java 棧.每個線程在創建時都會創建一個虛擬機棧,其內部保存一個個棧幀,對應著一次方法的調用.Java 虛擬機棧是線程私有的.主管 Java 程序的運行,它保存方法的局部變量(8種基本數據類型,對象的引用地址),部分結果,并參與方法的調用和返回.
棧的特點:
棧是一種快速有效的分配存儲方式,訪問速度僅次于程序計數器.
JVM 直接對 java 棧的操作只有兩個:調用方法 入棧 .執行結束后 出棧 .
對于棧來說不存在垃圾回收問題
棧中會出現異常,當 線程請求的棧深度大于虛擬機所允許的深度時, 會出現StackOverflowError.
棧幀的內部結構:
局部變量表:局部變量表是一組變量值存儲空間,用于存放方法參數和方法內部定義的局部變量。
操作數棧: 是用來對表達式求值,程序中的所有計算過程都是在借助于操作數棧來完成的。
方法返回地址:當一個方法執行完畢之后,要返回之前調用它的地方,因此在棧幀中必須保存一個方法返回地址.

4.堆

? 《Java 虛擬機規范》中對 Java 堆的描述是:所有的對象實例都應當在運行時分配在堆上.
? 堆也是 Java 內存管理的核心區域.是 JVM 管理的最大一塊內存空間.
? 堆內存的大小是可以調節. 例如: -Xms:10m(堆起始大小) -Xmx:30m(堆最大內存大小)
? 所有的線程共享 Java 堆
? 堆中的對象不會馬上被移除,僅僅在垃圾收集的時候才會被移除.
? 堆是 GC(Garbage Collection,垃圾收集器)執行垃圾回收的重點區域.

4.1堆內存的劃分

在JDK1.8被分為新生代老年代,新生代又被分為伊甸園區幸存者區

為什么分區(分代)?

根據對象的存活概率進行分區,將存活時間長的放到老年代,減少掃描垃圾的時間和GC頻率,針對分類進行不同的垃圾回收算法,對算法揚長避短。

對象創建內存分配過程

將剛創建的新對象放到伊甸園區,當垃圾回收時將幸存下來的對象放到幸存者0區,再次進行垃圾回收時,將幸存者0區和伊甸園區的對象放到幸存者1中,每次保證有一個幸存者區是空閑的.當一個對象經歷15次垃圾回收(被回收對象默認次數是15,可以通過-XX:MaxTenuringThreshold=<N>設置次數)時依然存活,會被放入老年區,或者如果一個對象比較的,也可以直接存放到老年區中.在老年代,相對悠閑,當老年代內存不足時,觸發 GC,進行老年代的內存清理.?若老年代執行了 GC 之后發現依然無法進行對象存儲,會對整堆進行 GC, 之后依然無法進行對象存儲, 就會產生 OOM 異常. Java.lang.OutOfMemoryError:Java heap space

為什么是15次?

在對象頭中,它由4位數據去對GC年齡進行記錄保存,最大為1111,即15

5.方法區

一個被線程共享的區域,主要存儲加載的類字節碼、class/method/field 等元數據、static final 常量、static 變量、即時編譯器編譯后的代碼等數據。在物理上與堆是屬于同一個空間,但在邏輯上對其進行區分,被稱為元空間

方法區在 JVM 啟動時被創建,并且它的實際的物理內存空間中和 Java 堆區一樣都可以是不連續的.
方法區的大小,跟堆空間一樣,可以選擇固定大小或者可擴展.
方法區的大小決定了系統可以保存多少個類,如果系統定義了太多的類,導致方法區溢出, 虛擬機同樣會拋出內存溢出的錯誤
關閉 JVM 就會釋放這個區域的內存

6.本地方法棧

? Java 虛擬機棧管理 java 方法的調用,而本地方法棧用于管理本地方法的調用.
? 本地方法棧也是線程私有的.
? 允許被實現成固定或者是可動態擴展的內存大小.內存溢出方面也是相同的. 如果線程請求分配的棧容量超過本地方法棧允許的最大容量拋出StackOverflowError.
? 本地方法是用 C 語言寫的.
? 它的具體做法是在 Native Method Stack 中登記 native 方法,在 Execution Engine 執行時加載本地方法庫.

四.本地方法接口

1.什么是本地方法?

簡單來說,被native修飾的方法就是本地方法,該類方法底層不是由java語言編寫,例如c

2.為什么使用本地方法?

與java環境外交互,與硬件設備交互,java屬于應用程序語言,沒有與硬件設備直接交互的權限

五.執行引擎

將字節碼解釋/編譯為對應平臺上的本地機器指令

什么是解釋器和編譯器?

解釋器: 當 Java 虛擬機啟動時會根據預定義的規范對字節碼采用逐行解釋的方式執行,將每條字節碼文件中的內容“翻譯”為對應平臺的本地機器指令執行。
JIT(Just In Time Compiler)編譯器: 就是虛擬機將源代碼一次性直接編譯成和本地機器平臺相關的機器語言,但并不是馬上執行。
為什么這樣設計?

解釋執行雖然效率低,但是在程序開始執行后可以立即投入使用,編譯執行雖然將一些熱點代碼編譯后緩存起來,執行效率高,但是需要花費一定時間,所以就采用開始時使用解釋器執行,等編譯器編譯完成后就采用編譯執行

六.垃圾回收機制

1.垃圾回收概述

1.1什么是垃圾?

垃圾是指沒有被任何引用指向的對象,這個對象就是需要被回收的垃圾.

如果垃圾長時間不回收,這些垃圾對象會一直占用內存空間,導致空間無法被其他對象所使用,直到應用程序關閉,甚至導致內存溢出.

1.2垃圾回收概述

早期的 C/C++時代,垃圾回收基本上是手工進行的,開發人員可以使用 new 關鍵字進行內存申請,并使用 delete 關鍵字進行內存釋放。這種方式可以靈活控制內存釋放的時間,但是會給開發人員帶來頻繁申請和釋放內存的管理負擔。倘若有一處內存區間由于程序員編碼的問題忘記被回收,那么 就會產生內存泄漏,垃圾對象永遠無法被清除,隨著系統運行時間的不斷增長,垃圾對象所耗內存可能持續上升,直到出現內存溢出并造成應用程序崩潰。

現在,除了 Java 以外,C#、Python、Ruby 等語言都使用了自動垃圾回收的思想,也是未來發展趨勢,可以說這種自動化的內存分配和來及回收方式已經成為了現代開發語言必備的標準。
垃圾收集器可以對年輕代,也可以對老年代,方法區的回收,其中,Java 堆是垃圾收集器的工作重點
從次數上講:
頻繁收集 Young 區
較少收集 Old 區
基本不收集元空間(方法區)

2.垃圾回收的相關算法

2.1垃圾回收標記階段算法
標記階段的目的: 主要是為了判斷對象是否是垃圾對象
2.1.1引用計數算法
引用計數算法(Reference Counting)比較簡單,對每個對象保存一個整型的引用計數器屬性。用于記錄對象被引用的情況。
工作原理:對于一個對象 A,只要有任何一個引用指向了對象 A,則對象 A 的引用計數器 就加 1;當引用失效時,引用計數器就減 1。只要對象 A 的引用計數器的值為 0,即表示對象 A 不可能再被使用,可進行回收
優點: 實現簡單,垃圾對象便于辨識;判定效率高,回收沒有延遲性。
缺點:
1.它需要單獨的字段存儲計數器,這樣的做法 增加了存儲空間的開銷
2.無法解決循環引用問題
多個對象之間相互引用,計數器不為0,但是此時這幾個對象,與外界已經沒有聯系了,使用不到了,他們相互又有引用,垃圾收集器不能回收他們,造成內存泄漏
2.1.2可達性分析算法
可達性分析算法:也可以稱為根搜索算法、追蹤性垃圾收集,這里的可達性分析就是 Java、C#選擇的
相對于引用計數算法而言,可達性分析算法不僅同樣具備實現簡單和執行高效等特點,更重要的是該算法可以有效地解決在引用計數算法中循環引用的問題 ,防止內存泄漏的發生。
工作原理:
可達性分析算法是以根(GCRoots)為起始點,按照從上至下的方式搜索被根對象所連接的目標對象是否可達。使用可達性分析算法后,內存中的存活對象都會被根直接或間接連接著,搜索所走過的路徑稱為引用鏈(Reference Chain)如果目標對象沒有任何引用鏈相連,則是不可達的,就意味著該對象己經死亡,可以標記為垃圾對象。

哪些對象可以稱為活躍對象(GCroots)?
1.虛擬機棧中引用的對象
2.方法區中類靜態屬性引用的對象
3.所有同步鎖synchronized持有的對象
4.java虛擬機內部的引用
基本數據類型對應的class對象,一些常駐的異常對象(nullpointerexception,outofmemoryerror),系統類加載器

2.2垃圾回收階段算法
當成功區分出內存中存活對象和死亡對象后,GC 接下來的任務就是執行垃
圾回收,釋放掉無用對象所占用的內存空間,以便有足夠的可用內存空間為新對
象分配內存。目前在 JVM 中比較常見的三種垃圾收集算法是:
標記-復制算法(Copying)
標記-清除算法(Mark-Sweep)
標記-壓縮算法(Mark-Compact)
2.2.1? 標記-復制算法(Copying)
將可用內存空間分為兩塊,使用是只使用一塊,在垃圾回收時,會將正在使用的內存空間中的存活對象復制到未使用的內存空間中,然后將正在使用的內存空間的所有對象進行回收,交換兩個空間的角色,完成垃圾回收
復制算法適合存活對象少,垃圾對象多,特別適合收新生代。
2.2.2? 標記-清除算法(Mark-Sweep)
清除: 這里所謂的清除并不是真的置空,而是把需要清除的對象地址保存在空閑的地址列表里。下次有新對象需要加載時,判斷垃圾的位置空間是否夠,如果夠,就存放(也就是覆蓋原有的地址)。
2.2.3? 標記-壓縮算法(Mark-Compact)
將所有的存活對象壓縮到內存的一端,按順序排放。之后,清理邊界外所有的空間。
復制算法的高效性是建立在存活對象少、垃圾對象多的前提下的。這種情況在新生代經常發生,但是在老年代,更常見的情況是大部分對象都是存活對象。
如果依然使用復制算法,由于存活對象較多,復制的成本也將很高。因此,基于老年代垃圾回收的特性,需要使用其他的算法。
標記-清除算法的確可以應用在老年代中,但是在執行完內存回收后還會產生內存碎片,所以 JVM 的設計者需要在此基礎之上進行改進。
標記-壓縮算法的最終效果等同于標記-清除算法執行完成后,再進行一次內存碎片整理,因此,也可以把它稱為標記-清除-壓縮(Mark-Sweep-Compact)算法。
二者的本質差異在于標記-清除算法是一種非移動式的回收算法(空閑列表記錄位置),標記-壓縮是移動式的。

3.垃圾回收器

如果說垃圾收集算法是內存回收的方法論,那么收集器就是內存回收的實踐者.
垃圾收集器沒有在 java 虛擬機規范中進行過多的規定,可以由不同的廠商、不同版本的 JVM 來實現。
由于 JDK 的版本處于高速迭代過程中,因此 Java 發展至今已經衍生了眾多的垃圾回收器。從不同角度分析垃圾收集器,可以將 GC 分為不同的類型。
3.1垃圾回收器分類
按線程數可以分為 單線程(串行) 垃圾回收器和 多線程(并行) 垃圾回收器
按照工作模式分,可以分為 獨占式 并發式 垃圾回收器。
按工作的內存區間分,又可分為 年輕代垃圾回收器 老年代垃圾回收器。
3.2垃圾回收器的性能指標
吞吐量:運行用戶代碼的時間占總運行時間的比例 (總運行時間:程序的運行時間+ 內存回收的時間)
垃圾收集開銷:垃圾收集所用時間與總運行時間的比例。
暫停時間:執行垃圾收集時,程序的工作線程被暫停的時間。
內存占用: Java 堆區所占的內存大小。
3.3CMS回收器
CMS(Concurrent Mark Sweep,并發標記清除)收集器是以獲取最短回收停頓時間為目標的收集器( 追求低停頓 ),它在垃圾收集時使得用戶線程和 GC 線程并發執行,因此在垃圾收集過程中用戶也不會感到明顯的卡頓。
垃圾回收過程
初始標記:Stop The World,僅使用一條初始標記線程對所有與 GC Roots 直接關聯的對象進行標記。
并發標記:垃圾回收線程,與用戶線程并發執行。此過程進行可達性分析,標記出所有廢棄對象。
重新標記:Stop The World,使用多條標記線程并發執行,將剛才并發標記過程中新出現的廢棄對象標記出來。
并發清除:只使用一條 GC 線程,與用戶線程并發執行,清除剛才標記的對象。這個過程非常耗時。
并發標記與并發清除過程耗時最長,且可以與用戶線程一起工作,因此,總體上說,CMS 收集器的內存回收過程是與用戶線程一起并發執行的。
3.4G1回收器
G1(Garbage-First)垃圾回收器是在 Java7 update 4 之后引入的一個新的垃圾回收器,是當今收集器技術發展的最前沿成果之一.是一款面向服務端應用的垃圾收集器。
G1 是一個并行回收器,它把堆內存分割為很多不相關的區域(Region)(物理上不連續的邏輯上連續的)。使用不同的 Region 來表示 Eden、幸存者0 區,幸存者 1 區,老年代等。
G1 GC 有計劃地避免在整個 Java 堆中進行全區域的垃圾收集。G1 跟蹤各個 Region 里面的垃圾堆積的價值大小(回收所獲得的空間大小以及回收所需時間的經驗值),在后臺維護一個優先列表,每次根據允許的收集時間,優先回收價值最大的 Region.
由于這種方式的側重點在于回收垃圾最大量的區間(Region),所以我們給 G1 一個名字:垃圾優先(Garbage First)。
① 初始標記:標記出 GC Roots 直接關聯的對象,這個階段速度較快,需要停止用戶線程,單線程執行。
② 并發標記:從 GC Root 開始對堆中的對象進行可達新分析,找出存活對象,這個階段耗時較長,但可以和用戶線程并發執行。
③ 最終標記:修正在并發標記階段引用戶程序執行而產生變動的標記記錄。

④ 篩選回收:篩選回收階段會對各個 Region 的回收價值和成本進行排序,根據用戶所期望的 GC 停頓時間來指定回收計劃(用最少的時間來回收包含垃圾最多的區域.這就是 Garbage First 的由來——第一時間清理垃圾最多的區塊),這里為了提高回收效率,并沒有采用和用戶線程并發執行的方式,而是停頓用戶線程。
適用場景:要求盡可能可控 GC 停頓時間;內存占用較大的應用。

?

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

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

相關文章

LeetCode LCR157 套餐內商品的排列順序

生成字符串的全部排列&#xff08;去重&#xff09;&#xff1a;從問題到解決方案的完整解析 問題背景 在編程和算法設計中&#xff0c;生成字符串的所有排列是一個經典問題。它不僅出現在算法競賽中&#xff0c;也在實際開發中有著廣泛的應用&#xff0c;比如生成所有可能的…

pgsql:關聯查詢union(并集)、except(差集)、intersect(交集)

pgsql:關聯查詢union(并集)、except(差集)、intersect(交集)_pgsql except-CSDN博客

微信小程序中使用ECharts 并且動態設置數據

項目下載地址 GitHub 地址 https://github.com/ecomfe/echarts-for-weixin 將當前文件夾里的內容拷貝到項目中 目錄&#xff1a; json: {"usingComponents": {"ec-canvas": "../components/ec-canvas/ec-canvas"} }wxml&#xff1a; <ec…

RV1126 人臉識別門禁系統解決方案

1. 方案簡介 本方案為類人臉門禁機的產品級解決方案,已為用戶構建一個帶調度框架的UI應用工程;準備好我司的easyeai-api鏈接調用;準備好UI的開發環境。具備低模塊耦合度的特點。其目的在于方便用戶快速拓展自定義的業務功能模塊,以及快速更換UI皮膚。 2. 快速上手 2.1 開…

深度學習ResNet模型提取影響特征

大家好&#xff0c;我是帶我去滑雪&#xff01; 影像組學作為近年來醫學影像分析領域的重要研究方向&#xff0c;致力于通過從醫學圖像中高通量提取大量定量特征&#xff0c;以輔助疾病診斷、分型、預后評估及治療反應預測。這些影像特征涵蓋了形狀、紋理、灰度統計及波形變換等…

DeepSeek 接入 Word 完整教程

一、前期準備 1.1 注冊并獲取 API 密鑰 訪問 DeepSeek 平臺&#xff1a; 打開瀏覽器&#xff0c;訪問 DeepSeek 官方網站&#xff08;或您使用的相應平臺&#xff09;。注冊并登錄您的賬戶。 創建 API 密鑰&#xff1a; 在用戶控制面板中&#xff0c;找到“API Keys”或“API…

驅動開發硬核特訓 · Day 7:深入掌握 Linux 驅動資源管理機制(Resource Management)

&#x1f50d; B站相應的視屏教程&#xff1a; &#x1f4cc; 內核&#xff1a;博文視頻 - 總線驅動模型實戰全解析 —— 以 PCA9450 PMIC 為例 敬請關注&#xff0c;記得標為原始粉絲。 &#x1f6a9; 在 Linux 驅動開發中&#xff0c;資源管理機制決定了驅動的穩定性與可靠性…

什么是TensorFlow?

TensorFlow 是由 Google Brain 團隊開發的開源機器學習框架&#xff0c;被廣泛應用于深度學習和人工智能領域。它的基本概念包括&#xff1a; 1. 張量&#xff08;Tensor&#xff09;&#xff1a;在 TensorFlow 中&#xff0c;數據以張量的形式進行處理。張量是多維數組的泛化…

【ChCore Lab 01】Bomb Lab 拆炸彈實驗(ARM匯編逆向工程)

文章目錄 1. 前言2. 實驗代碼版本問題3. 關于使用問題4. 宏觀分析5. read_line 函數介紹6. phase_0 函數6.1. read_int 函數6.2. 回到 phase_0 函數繼續分析6.3. 驗證結果 7. phase_1 函數7.2. 驗證結果 8. phase_2 函數8.1. read_8_numbers 函數8.2. 回到 phase_2 函數繼續分析…

《Vue Router實戰教程》20.路由懶加載

歡迎觀看《Vue Router 實戰&#xff08;第4版&#xff09;》視頻課程 路由懶加載 當打包構建應用時&#xff0c;JavaScript 包會變得非常大&#xff0c;影響頁面加載。如果我們能把不同路由對應的組件分割成不同的代碼塊&#xff0c;然后當路由被訪問的時候才加載對應組件&am…

docker 多主機容器組網

一、服務器A 1、初始化Swarm集群&#xff08;管理節點&#xff09; docker swarm init --advertise-addr 主節點ip 2、獲取工作節點??加入Swarm集群所需的Token 和完整命令 docker swarm join-token worker 3、創建Overlay網絡 docker network create -d overlay --subnet…

rancher 解決拉取dashboard-shell鏡像失敗的問題

問題背景 在 Kubernetes 集群中部署 Rancher 后&#xff0c;點擊右上角的 "Shell" 按鈕時&#xff0c;Rancher 會動態創建一個 dashboard-shell-xxxxx Pod&#xff0c;用于提供 Web 終端功能。然而&#xff0c;由于默認鏡像 rancher/shell:v0.1.21 托管在 Docker Hu…

OpenCV day2

Matplotlib相關知識 Matplotlib相關操作&#xff1a; import numpy as np from matplotlib import pyplot as pltx np.linspace(0, 2 * np.pi, 100) y1 np.sin(x) y2 np.cos(x)# 使用紅色虛線&#xff0c;圓點標記&#xff0c;線寬1.5&#xff0c;標記大小為6繪制sin plt.p…

【網絡安全】通過 JS 尋找接口實現權限突破

未經許可,不得轉載。 本文所述所有風險點均已修復。 文章目錄 引言正文引言 以下些漏洞已被起亞方面修復;起亞方面確認,這些漏洞從未被惡意利用過。 2024年6月11日,我們發現起亞汽車存在一系列嚴重安全漏洞,攻擊者僅憑車牌號即可遠程控制車輛的核心功能。該攻擊不需要接觸…

LabVIEW 發電機勵磁系統監測與診斷

在現代工業體系中&#xff0c;發電機作為關鍵的電能轉換設備&#xff0c;其穩定運行對于電力供應的可靠性起著決定性作用。而勵磁系統作為發電機的核心控制部分&#xff0c;直接影響著發電機的性能和電力系統的穩定性。一旦勵磁系統出現故障&#xff0c;可能引發發電機電壓波動…

MacOS紅隊常用攻擊命令

MacOS紅隊常用攻擊命令 1.自動化武器2.系統信息3.服務 & 內核信息4.快捷命令5.網絡相關6.brew相關 / 軟件包相關7.高權限命令8.創建一個管理員權限的后門用戶 1.自動化武器 1、linPEAS LinPEAS 是一個腳本&#xff0c;用于在 Linux/Unix/MacOS 主機上搜索提權路徑 2、me…

【數據結構_8】棧和隊列

一、反向輸出鏈表元素 Ⅰ使用遞歸進行反向輸出 package stack; public class Test2 {static class Node{public String val;public Node next;//構造方法public Node(String val) {this.val val;this.next null;}}//利用遞歸來反向輸出鏈表public static void reverse(Nod…

Java 正則表達式綜合實戰:URL 匹配與源碼解析

在 Web 應用開發中&#xff0c;我們經常需要對 URL 進行格式驗證。今天我們結合 Java 的 Pattern 和 Matcher 類&#xff0c;深入理解正則表達式在實際應用中的強大功能&#xff0c;并剖析一段實際的 Java 示例源碼。 package com.RegExpInfo;import java.util.regex.Matcher; …

蝦分發平臺平臺優勢

平臺優勢 高效與成本優化 一鍵分發與自動化工具減少人工操作&#xff0c;加速測試周期&#xff1b;免費分發流量和透明價格套餐降低中小團隊開支。 安全與合規 自研CDN與封裝技術平衡性能與安全性&#xff0c;適配復雜分發場景&#xff1b;全球CDN網絡加速保障極速下載。 服務…

c語言學習16——內存函數

內存函數 一、memcpy使用和模擬實現1.1參數1.2 使用1.3 模擬實現 二、memmove使用和模擬實現2.1 參數2.2 使用2.3 模擬實現 三、memset使用3.1 參數3.2 使用 四、memcmp使用4.1 參數4.2 使用 一、memcpy使用和模擬實現 1.1參數 因為內存中不知道存的是什么類型的地址&#xff…