<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-02 10:01:47

    內存泄漏

    內存泄漏是指程序在申請內存后,無法釋放已申請的內存空間,無用對象(不再使用的對象)持續占有內存或無用對象的內存得不到及時釋放,從而造成內存空間的浪費。

    內存泄漏最終會導致OOM。

    造成內存泄漏典型場景:

    1.單例模式的不正確使用

    單例對象在初始化后將在JVM的整個生命周期中以靜態變量的方式存在。如果單例對象持有對外部對象的引用,那么這個對象將不能被JVM正常回收

    2.數據庫、網絡、IO連接沒有被關閉釋放

    這類連接,一般會提供close方法進行顯式關閉。但如果沒有進行close,是不會自動被gc回收的。

    3.不合適的對象引用

    比如,生命周期長的對象持有生命周期短的對象的引用就很容易造成內存泄漏,盡管生命周期短的對象已經不再需要,但是因為生命周期長的對象持有對它的引用而導致不能被回收。

    內存溢出

    內存溢出即out of memory簡稱OOM。當程序申請內存時,沒有足夠的內存空間供其使用,往往會出現OOM。比如申請了一個Integer,但給它存了Long類型才能存下的數,那就會導致內存溢出。

    堆外內存

    對于堆外內存是指分配的對象直接受操作系統管理的JVM內存堆以外的空間。同時因為這部分區域直接受操作系統的管理,別的進程可以直接通過操作系統對其進行訪問,減少了從JVM中復制數據的過程。

    堆外內存適用生命周期較長的對象,具有以下特點:

    1. 可以很方便的自主開辟很大的內存空間,對于大內存有良好的伸縮性
    2. 減少垃圾回收帶來的系統停頓時間
    3. 在進程間可以共享對象,減少JVM間的復制過程
    4. 適合那些分配次數少,讀寫操作頻繁的場景

    但也存在如下缺點:

    1. 容易出現內存泄漏,并且很難排查
    2. 堆外內存的數據結構不直觀,當存儲結構復雜的對象時,會浪費大量的時間對其進行串行化

    常用JVM配置參數

    -Xms:JVM初始最小堆內存
    -Xmx:JVM允許最大堆內存
    -XX:PermSize:JVM初始非堆內存
    -XX:MaxPermSize:JVM允許最大的非堆內存
    -XX:+UseConcMarkSweepGC:年老代激活CMS收集器,可以盡量減少fullGC
    -XX:+UseParNewGC:設置年輕代為多線程并行收集
    -XX:+UseCMSCompactAtFullCollection:在full gc時,對老年代的壓縮(CMS的時候,會導致內存碎片,使內存空間不連續,可能會影響性能,但是可以消除碎片)
    -XX:CMSInitiatingOccupancyFraction:當老年代被占用空間達到一定比例時觸發CMS垃圾收集
    -Xverify:none:類加載的時候關閉字節碼驗證
    -XX:+DisableExplicitGC:告訴JVM關掉System.gc
    -XX:+CMSParallelRemarkEnabled:再標記算法,降低標記停頓時間
    -XX:+PrintHeapAtGC:打印GC前后的詳細堆棧信息,主要用于生產環境或者壓力測試時候看的信息
    -XX:+PrintGCTimeStamps:輸出GC的時間戳
    -XX:PretenureSizeThreshold:使大對象直接進入老年代
    
    jvm內存溢出
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    內存泄漏最終會導致OOM。造成內存泄漏典型場景:1.單例模式的不正確使用單例對象在初始化后將在JVM的整個生命周期中以靜態變量的方式存在。如果單例對象持有對外部對象的引用,那么這個對象將不能被JVM正常回收2.數據庫、網絡、IO連接沒有被關閉釋放這類連接,一般會提供close方法進行顯式關閉。
    無論對于Java程序員還是大數據研發人員,JVM是必須掌握的技能之一。Java提供的GC功能可以自動監測對象是否超過作用域等從而達到自動回收內存的目的,可以有效防止內存泄露,有效的使用可用內存。
    堆區分為兩大區:Young區和Old區,又稱新生代和老年代。在不同的JVM實現及不同的回收機制中,堆內存的劃分方式是不一樣的。相對于基于寄存器的運行環境來說,JVM是基于棧結構的運行環境。在活動線程中,只有位于棧頂的幀才是有效的,稱為當前棧幀。正在執行的方法稱為當前方法,棧幀是方法運行的基本結構。在執行引擎運行時,所有指令都只能針對當前棧幀進行操作。而StackOverflowError表示請求的棧溢出,導致內存耗盡,通常出現在遞歸方法中。
    Java 8 的內存結構
    2022-03-10 14:37:13
    java8內存結構圖虛擬機內存與本地內存的區別Java虛擬機在執行的時候會把管理的內存分配成不同的區域,這些
    同時例如 jstack、jmap 等工具也是不囿于一個方面的問題的,基本上出問題就是df、free、top 三連,然后依次jstack、jmap伺候,具體問題具體分析即可。CPU 異常往往還是比較好定位的。
    JDK8是近年來Java最重要的一次更新。其引入的一系列函數式編程特性,例如lambda表達式,已經被Java開發者廣泛使用。然而,lambda的使用也存在缺陷漏洞以及兼容性等問題。我們針對這些問題開展了實證研究并獲得了重要發現。
    容器安全工具涵蓋多種任務,包括配置加固和漏洞評估任務。Gartner持續觀察AST市場發展的主要驅動力是支持企業DevSecOps和云原生應用程序的需求。Checkmarx SCA的供應鏈安全執行行為分析,并對給定的開源包添加操作風險指標。這得到了Gartner客戶的積極反饋。Checkmarx一直在簡化軟件許可,將大多數產品與開發人員的數量聯系起來。
    隨著Web應用攻擊手段變得復雜,基于請求特征的防護手段,已經不能滿足企業安全防護需求。在2012年的時候,Gartner引入了“Runtime application self-protection”一詞,簡稱為RASP,屬于一種新型應用安全保護技術,它將防護功能“ 注入”到應用程序中,與應用程序融為一體,使應用程序具備自我防護能力,當應用程序遭受到實際攻擊傷害時,能實時檢測和阻斷安全攻擊,而不需要進行人工干預。實現了在攻擊鏈路最關鍵的地方阻斷攻擊。
    Target用于修飾注解的注解,定義當前注解能夠修飾程序中的哪些元素@Documented. Documented用于指定被該元注解修飾的注解類將被javadoc工具提取成文檔。Inherited被它修飾的Annotation將具有繼承性。如果某個類使用了被@Inherited修飾的Annotation,則其子類將自動具有該注解。是@Before和@AfterReturing 相結合3.3 技術實現根據任務背景,我選擇了返回通知@AfterReturning。使用返回通知一定要注意的是:由于我需要用到返回值,所以會用@AfterReturning注解中的returning屬性來獲取方法的返回值returning指定
    立即隔離被入侵的主機,以控制事態、避免影響擴大,隨后溯源。Webshell文件本身極難檢出,防守隊員很清楚,當發現主機上有Webshell文件時,往往意味著這臺主機即將失陷,十分危險。但是Webshell文件已經被刪除,攻擊者仍能做出攻擊行為,說明主機上還存在另一條控制通道。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类