JVM垃圾回收篇-垃圾回收算法

JVM垃圾回收篇-垃圾回收算法

標記清除(Mark Sweep)

在這里插入圖片描述

概念

collector指的就是垃圾收集器。
mutator是指除了垃圾收集器之外的部分,比如說我們的應用程序本身。
mutator的職責一般是NEW(分配內存)、READ(從內存中讀取內容)、WRITE(將內容寫入內存),而collector則就是回收不在使用的內存來供mutator進行NEW操作的使用

步驟
  • 在標記階段collector從mutator根對象開始進行遍歷,對從mutator根對象可以訪問到的對象都打上一個標識,一般是
    在對象的header中,將其記錄為可達對象
  • 而在清除階段,collector對堆內存(heap memory)從頭到尾進行線性遍歷,如果發現某個對象沒有被標記為可達對象,通過讀取對象的header信息,將其回收。一種可行的實現是,在標記階段首先通過根節點,標記所有從根節點開始的可達對象。因此,未被標記的對象就是未被引用的垃圾對象。然后在清除階段清除所有未被標記的對象
優缺點

標記清除算法清除階段不會對內存進行置0操作,而是將空閑內存的地址加入空閑內存地址列表中,等下次使用時直接使用,但是由于這些內存是不連續的,總內存大小可能很大,但是實際被分為很多小段

  • 優點是速度較快
  • 缺點是會造成內存碎片

標記整理(Mark Compact)

在這里插入圖片描述

標記操作和 “標記 - 清除” 算法一致,后續操作不只是直接清理對象,而是在清理無用對象完成后讓所有存活的對象都向一端移動,并更新引用其對象的指針

優缺點

優點:沒有內存碎片

缺點:速度慢

復制(Copy)

在這里插入圖片描述

將內存空間分為相等的兩部分,正在使用的區為FROM,空閑區為TO

  • 當from區內存空間不足時,將from區的存活對象先標記然后復制到to區,并清理form區的垃圾
  • 交換from區和to區,即當前的form變為to,當前的to變為form
優缺點

優點:不會有內存碎片

缺點:需要占用雙倍的內存空間

分代垃圾回收

在這里插入圖片描述

  • 對象首先分配在伊甸園區域

  • 新生代空間不足時,觸發 minor gc,伊甸園和 from 存活的對象使用 copy 復制到 to 中,存活的對象年齡加 1并且交換 from to

  • minor gc 會引發 stop the world,暫停其它用戶的線程,等垃圾回收結束,用戶線程才恢復運行

  • 當對象壽命超過閾值時,會晉升至老年代,最大壽命是15(4bit)

  • 當老年代空間不足,會先嘗試觸發minor gc,如果之后空間仍不足,那么觸發 full gc,STW的時間更長

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

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

相關文章

將多個單獨的 Excel 文件合并成一個,并添加標題行

要將多個單獨的 Excel 文件合并成一個,并添加標題行,可以使用 Python 的 pandas 庫。以下是一個示例代碼,假設要合并的 Excel 文件都在同一個文件夾中: import os import pandas as pd # 指定文件夾路徑 folder_path path/to/fo…

vscode搭建c語言環境問題

c語言環境搭建參考文章:【C語言初級階段學習1】使用vscode運行C語言,vscode配置環境超詳細過程(包括安裝vscode和MinGW-W64安裝及后續配置使用的詳細過程,vscode用戶代碼片段的使用)[考研專用]_QAQshift的博客-CSDN博客 問題如下:…

[C++ 網絡協議] 套接字和地址族、數據序列

目錄 1. 套接字 1.1 在Linux平臺下構建套接字 1.1.1 用于接聽的套接字(服務器端套接字) 1.1.2 用于發送請求的套接字(客戶端套接字) 1.2 在Windows平臺下構建套接字 1.2.1 Winsock的初始化 1.2.2 用于接聽的套接字(服務器端套接字) 1.2.3 用于發送請求的套接字(客戶端套…

pytest框架快速進階篇-pytest前置和pytest后置,skipif跳過用例

一、Pytest的前置和后置方法 1.Pytest可以集成unittest實現前置和后置 importunittestimportpytestclassTestCase(unittest.TestCase):defsetUp(self)->None:print(unittest每個用例前置)deftearDown(self)->None:print(unittest每個用例后置)classmethoddefsetUpClass…

jmeter中用戶參數和用戶定義的變量的區別

如果使用jmeter做過參數化的人都知道,參數化的方式有多種,其中一種就是使用用戶定義的變量,還有一種是使用用戶參數。那么,這兩個有什么異同呢? 一、先說相同的點: 1、都可以參數化,以供sample…

allure測試報告

使用pytest結合Allure進行測試報告生成的簡單教程 allure測試報告 Allure基于Java開發,因此我們需要提前安裝Java 8或以上版本的環境。 ◆安裝allure-pytest插件在DOS窗口輸入命令“pip3 install allure-pytest”,然后按“Enter”鍵。 下載安裝Allure…

使用 Docker 部署 canal 服務實現MySQL和ES實時同步

文章目錄 0. 環境介紹0. 前置步驟1. 安裝Kibana和Elasticsearch2. 安裝Canal和Canal Adapter2.1 修改數據庫配置2.1.1 修改配置2.1.2 驗證mysql binlog配置2.1.3 查看日志文件2.1.4 用JDBC代碼插入數據庫 2.2 安裝Canal Server2.3 安裝Canal Adapter修改兩處配置文件配置文件取…

Linux 命令篇

一、啟動網絡命令 ip addr 查看網卡信息 service network start 啟動網卡 service network stop 關閉網卡 service network restart 重啟網絡 二、pwd 命令 查看當前目錄的路徑 linux 下所有的絕對路徑都是從根目錄 "/" 開始 root:是linux下root用戶的根目…

初識mysql數據庫之引入mysql客戶端庫

目錄 一、下載第三方庫 1. 準備工作 1. 使用mysql官網提供的庫 2. yum源安裝 二、測試第三方庫是否可用 三、mysql常用接口介紹 1. 查看官方文檔 2. 初始化 3. 關閉mysql 4. 連接mysql 5. 下達sql指令 四、一個簡單的C客戶端庫連接mysql程序 1. 頭文件 2. 初始化…

FFmpeg接收UDP碼流

一、FFmpeg參數初始化: //在打開碼流前指定各種參數比如:探測時間/超時時間/最大延時等//設置緩存大小,1080p可將值調大av_dict_set(&options, "buffer_size", "8192000", 0);//以tcp方式打開,如果以udp方式打開將tcp替換為udpav_dict_set(…

Could not resolve host: mirrorlist.centos.org; Unknown error解決方法

今天服務器安裝完CentOS系統后,安裝網絡的時候,出現無法聯網yum yum -y install net-tools 以上代碼無法運行并報錯,這里我要提醒大家,如果在初始安裝的時候選中安裝網絡工具模塊就不用在安裝net-tools了,因為我選中…

Angular 性能優化實戰

Angular 性能優化實戰 Angular 是一個非常強大的前端框架,但是如果不注意性能優化,應用程序可能會變得非常慢并增加加載時間。 以下是一些Angular性能優化經驗的實戰建議: 1. 使用 OnPush 變更檢測策略 默認情況下,Angular檢查…

vite跨域配置踩坑,postman鏈接后端接口正常,但是前端就是不能正常訪問

問題一:怎么都鏈接不了后端地址 根據以下配置,發現怎么都鏈接不了后端地址,proxy對了呀。 仔細看,才發現host有問題 // 本地運行配置,及反向代理配置server: {host: 0,0,0,0,port: 80,// cors: true, // 默認啟用并允…

爆肝整理,性能測試方法與關鍵指標以及瓶頸定位思路,一篇貫通...

目錄:導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結(尾部小驚喜) 前言 性能測試方法 1、…

Python編程實現百度AI開放平臺的接口對接方法,詳解和實踐指南

Python編程實現百度AI開放平臺的接口對接方法,詳解和實踐指南 引言 百度AI開放平臺提供了豐富的人工智能接口,包括語音識別、圖像識別、自然語言處理等功能。本文將通過Python編程,詳解如何對接百度AI開放平臺的接口,并提供實際代碼示例。準備工作 在開始之前,我們需要先完…

智能家居(1)---工廠模式實現燈光控制(繼電器組)以及火災報警模組的封裝

采用工廠模式以面向對象的方式來封裝各種設備模塊&#xff0c;方便整合項目以及后期的維護和擴展 mainPro.c&#xff08;主函數&#xff09; #include <stdio.h> #include "controlDevice.h"struct Devices *pdeviceHead NULL; //設備工廠鏈…

抓包工具Fiddler下載與安裝

一、Fiddler介紹 1.Fiddler簡介 Fiddler 是一款免費、靈活、操作簡單、功能強大的 HTTP 代理工具&#xff0c;是目前最常用的 HTTP 抓包工具之一。可以抓取所有的 HTTP/HTTPS 包、過濾會話、分析請求詳細內容、偽造客戶端請求、篡改服務器響應、重定向、網絡限速、斷點調試等…

數據結構刷題訓練:隊列實現棧

目錄 前言 1. 題目&#xff1a;使用隊列實現棧 2. 思路 3. 分析 3.1 創建棧 3.2入棧 3.3 出棧 3.4 棧頂數據 3.5 判空和 “ 棧 ” 的銷毀 4. 題解 總結 前言 我們已經學習了棧和隊列&#xff0c;也都實現了它們各自的底層接口&#xff0c;那么接下我們就要開始棧和隊列的專項刷…

go內存管理機制

golang內存管理基本是參考tcmalloc來進行的。go內存管理本質上是一個內存池&#xff0c;只不過內部做了很多優化&#xff1a;自動伸縮內存池大小&#xff0c;合理切割內存塊。 基本概念&#xff1a; Page&#xff1a;頁&#xff0c;一塊 8 K大小的內存空間。Go向操作系統申請和…

2.Model、ModelMap和ModelAndView的使用詳解

1.前言 最近SSM框架開發web項目&#xff0c;用得比較火熱。spring-MVC肯定用過&#xff0c;在請求處理方法可出現和返回的參數類型中&#xff0c;最重要就是Model和ModelAndView了&#xff0c;對于MVC框架&#xff0c;控制器Controller執行業務邏輯&#xff0c;用于產生模型數據…