<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    JVM內存管理和垃圾回收

    VSole2022-08-01 09:55:05

    無論對于Java程序員還是大數據研發人員,JVM是必須掌握的技能之一。既是面試中經常問的問題,也是在實際業務中對程序進行調優、排查類似于內存溢出、棧溢出、內存泄漏等問題的關鍵。筆者將按下圖分多篇文章詳細闡述JVM:

    本篇文章主要敘述JVM內存管理、直接內存、垃圾回收和常見的垃圾回收算法:

    運行時數據區域

    JVM在執行一些基于JVM運行的程序,典型的如Java程序、Scala程序時,會把它所管理的內存劃分為多個不同的數據區域。這些區域有各個的作用、創建和銷毀時間,有的區域生命周期依賴于用戶線程的啟動和結束,有些區域則隨著虛擬機的啟動而存在,下圖展示了JVM在運行時的數據區域劃分:

    1. 方法區

    方法區是各個線程共享的內存區域,主要用于存放一些"自始至終都不會變化"的東西,比如final定義的常量、類的信息(class實例)、靜態變量等、方法信息。因為這些東西一旦被加載,是幾乎不會被GC的,所以方法區又被稱為永久代(注意一點,二者本質并不等價)。

    方法區有一部分叫常量池,用于存儲編譯期生成的一些字面變量、符號引用以及一些運行時產生的常量(如String常量池)。方法區中的靜態區用于存放類變量、靜態塊等。

    方法區又稱非堆,是有大小限制的,如果方法區使用內存超過了分配的大小,就會報類似OutOfMemory: PermGen Space的錯誤。

    2. Java虛擬機棧

    Java 虛擬機棧是線程私有的,它的生命周期與線程相同,為虛擬機執行Java方法即字節碼服務,是描述Java方法執行時的內存模型。

    每個方法執行時都會創建一個棧幀用于存儲局部變量表(比如編譯期可知的基本數據類型、對象引用等)、操作棧、動態鏈接、方法出口等信息。每一個方法被調用至執行完成的過程,對應著一個棧幀在虛擬機棧中從入棧到出棧的過程。

    如果線程請求的棧深度大于虛擬機所允許的深度,將會報StackOverFlowError;如果虛擬機棧無法申請到足夠的內存時會報OutOfMemoryError。

    調整虛擬機棧大小的方式:-Xss。

    3. 本地方法棧

    本地方法棧為使用的到Native方法服務,本地方法接口都會使用某種本地方法棧。

    當線程調用Java方法時,虛擬機會創建一個新的棧幀并壓入Java棧。然而,當它調用的是本地方法時,虛擬機會保持Java棧不變,不會在線程的Java棧中壓入新的棧幀,而是動態連接并直接調用指定的本地方法。

    4. 堆

    堆是JVM管理內存中最大的一塊區域,由Java線程共享,主要用來存儲new出來的對象和數組,并且這塊區域隨著虛擬機的啟動而創建。堆可以處于邏輯上連續但物理上不連續的內存空間中。

    堆是垃圾回收器管理的主要區域,可以細分為新生代和老年代,新生代又劃分為eden區,from survivor區、to survivor區。

    對象在被創建時,首先在新生代進行分配,eden區存放新生成的對象,兩個survivor區用來存放新生代中每次垃圾回收后依然存活下來的對象。但是當創建新創建的對象非常大,該對象會直接進入老年代。

    5. 程序計數器

    程序計數器是線程私有的即每個線程都會有自己的程序計數器,用來記錄線程執行的字節碼位置,是一個沒有OOM的區域。

    直接內存

    直接內存(direct memory)不屬于JVM運行時數據區的一部分,屬于堆外內存,會被頻繁使用,因此在設置各個內存范圍時要留出一部分物理內存,否則也容易拋出OutOfMemoryError。

    垃圾收集

    垃圾收集即GC,是JVM進行內存回收的處理過程。

    開發人員更多的是關注業務需求的實現,而內存管理是交由JVM完成的,如果不進行或者錯誤的進行垃圾回收會導致程序不穩定甚至崩潰。Java提供的GC功能可以自動監測對象是否超過作用域等從而達到自動回收內存的目的,可以有效防止內存泄露,有效的使用可用內存。

    GC主要分為3種:minor GC、major GC和full GC。

    minor GC是發生在新生代的,major GC是發生在老年代的。對于full GC出發的原因則比較多,比如老年代空間不足,它會出發stop world,處理不好往往會影響整個程序的穩定性嚴重會導致系統不可用,需要特別注意。

    常見的垃圾回收算法

    1. 標記清除算法

    首先標記出所有需要回收的對象,在標記完成后統一回收所有被標記的對象。

    存在如下兩個缺點:

    1.效率低

    需要先對要回收的對象進行標記,然后再統一清除,然而標記和清除兩個過程效率都很低下。

    2.內存碎片問題

    標記清除之后會產生大量不連續的內存碎片,空間碎片太多可能會導致以后在程序運行過程中需要分配較大對象時,無法找到足夠的連續內存而不得不提前觸發另一次垃圾收集動作,影響性能。

    2. 復制算法

    先將可用內存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當使用的這一塊的內存用完了,就將還存活著的對象復制到另外一塊上面,然后再把已使用過的內存空間一次清理掉。

    優點:這樣使得每次都是對整個半區進行內存回收,內存分配時也就不用考慮內存碎片等復雜情況,只要移動堆頂指針,按順序分配內存即可,實現簡單,運行高效。

    缺點:不適合對象存活率較高的場景,因為這種場景要進行較多的復制操作影響效率;實際可用內存變為分配內存的一半,因為每次只使用其中的一半內存。

    3. 標記整理算法

    先標記(標記過程與標記清除算法一樣),讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內存。這樣可以解決內存碎片問題。

    4. 分代收集算法

    就是針對Java堆內存中新生代、老年代等采用不同的垃圾回收算法。如在新生代中,往往只有少量對象存活(最后會進入老年代),則適合用復制算法。而老年代中對象存活率較高,沒有額外的空間對它進行分配擔保,就使用標記清除算法。

    當然實際應用中,使用什么算法,要看使用的垃圾回收器。

    虛擬機jvm
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    淺談Java反序列化漏洞
    2022-05-17 17:48:01
    Java序列化與反序列化Java 提供了一種對象序列化的機制,該機制中,一個對象可以被表示為一個字節序列,該字節序列包括該對象的數據、有關對象的類型的信息和存儲在對象中數據的類型。反序列化就是打開字節流并重構對象。對象序列化不僅要將基本數據類型轉換成字節表示,有時還要恢復數據。
    容器安全工具涵蓋多種任務,包括配置加固和漏洞評估任務。Gartner持續觀察AST市場發展的主要驅動力是支持企業DevSecOps和云原生應用程序的需求。Checkmarx SCA的供應鏈安全執行行為分析,并對給定的開源包添加操作風險指標。這得到了Gartner客戶的積極反饋。Checkmarx一直在簡化軟件許可,將大多數產品與開發人員的數量聯系起來。
    堆區分為兩大區:Young區和Old區,又稱新生代和老年代。在不同的JVM實現及不同的回收機制中,堆內存的劃分方式是不一樣的。相對于基于寄存器的運行環境來說,JVM是基于棧結構的運行環境。在活動線程中,只有位于棧頂的幀才是有效的,稱為當前棧幀。正在執行的方法稱為當前方法,棧幀是方法運行的基本結構。在執行引擎運行時,所有指令都只能針對當前棧幀進行操作。而StackOverflowError表示請求的棧溢出,導致內存耗盡,通常出現在遞歸方法中。
    Java 8 的內存結構
    2022-03-10 14:37:13
    java8內存結構圖虛擬機內存與本地內存的區別Java虛擬機在執行的時候會把管理的內存分配成不同的區域,這些
    一、遠程 Debug 原理首先,Java程序的執行過程分為以下幾個步驟:Java的文件 > 編譯生成的類文件
    Rezilion表示,Mi-X能夠先識別和確定已知嚴重CVE的可利用性,并提供詳細的視圖,完整展現可利用性的標準和可利用的范圍。據了解,XDR Ingest已經正式發售,可在一定程度上幫助用戶替代、優化傳統的SIEM產品。Sysdig CDR基于機器學習算法來管理規則,以檢測隱藏和忽視的威脅,并進一步深入了解云上容器的應用可靠性。Syxsense Zero Trust將于2022年9月下旬正式發售。
    2022年8月10日,一年一度的全球性網絡安全盛會——黑帽大會(Black Hat)在拉斯維加斯正式開幕。
    項目介紹 前后端分離架構,分離開發,分離部署,前后端互不影響。 前端技術采用vue + antdvPro + axios。 后端采用spring boot + mybatis-plus + hutool等,開源可靠。 基于spring security(jwt) + 用戶UUID雙重認證。 基于AOP實現的接口粒度的鑒權,最細粒度過濾權限資源。 基于hibernate validator實現的校驗
    WebLogic是由美國Oracle公司出品的一application server,準確的說就是一個基于JAVAEE而開發的一個中間件,類似Tomcat,WebLogic是一個用于開發,集成,部署與管理大型分布式Web應用,網絡應用和數據庫的java應用服務器。將java動態功能與java Enterprise標準的安全性引入大型網絡應用的開發,集成,部署與管理之中。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类