讀Java性能權威指南(第2版)筆記12_堆記憶體中

来源:https://www.cnblogs.com/lying7/archive/2023/03/10/17190162.html
-Advertisement-
Play Games

1. 減少記憶體使用 1.1. 減少堆記憶體的使用 1.1.1. 使用更少的記憶體意味著堆被填滿的頻率會降低,需要的GC周期會更少,其效果也可以成倍增強 1.1.2. 更少的新生代回收意味著對象的晉升年齡增加的頻率降低 1.1.3. 對象晉升到老年代的可能性也降低了 1.1.4. Full GC周期(或者 ...


1. 減少記憶體使用

1.1. 減少堆記憶體的使用

1.1.1. 使用更少的記憶體意味著堆被填滿的頻率會降低,需要的GC周期會更少,其效果也可以成倍增強

1.1.2. 更少的新生代回收意味著對象的晉升年齡增加的頻率降低

1.1.3. 對象晉升到老年代的可能性也降低了

1.1.4. Full GC周期(或者併發GC周期)的數量將減少

1.2. 方法

1.2.1. 減小對象大小

1.2.2. 使用對象的延遲初始化

1.2.3. 使用標準化對象

2. 減小對象大小

2.1. 可以提高GC的效率

2.2. 即使實例變數是null,也會消耗對象類內的空間

2.3. 讓對象更小

2.3.1. 不太可能將堆的大小增加10%

2.3.2. 將堆中一半對象的大小減小20%可以達到相同的目標

2.3.2.1. Java 11對String對象進行了這樣的優化

2.3.2.2. Java 11的用戶可以將堆的最大大小設置得比Java 8要求的小25%,而不會對GC或性能產生影響

2.4. 對象對齊和對象大小

2.4.1. 對象的大小總是被填充到8位元組的倍數

2.4.2. 在對象中消除一些實例欄位或減小一些欄位的大小,可能會產生收益,也可能不會,但我們沒有理由不這麼做

2.4.3. jol工具

2.4.3.1. 可以計算對象的大小

2.5. 時間與空間的權衡

2.5.1. 對象欄位存儲的是基於一些數據計算出的結果

2.5.1.1. 使用記憶體(空間)存儲這個值

2.5.1.2. 花費時間(CPU周期)在需要的時候計算這個值

2.5.1.2.1. 如果減少GC是目標,大多數人可能更傾向於重新計算

2.5.2. 適用於CPU時間

2.5.2.1. 使用額外的記憶體會導致GC消耗更多的CPU周期

3. 使用延遲初始化

3.1. 只有在常用路徑不會初始化變數時,才應該使用延遲初始化

3.1.1. 最好只在相關操作使用得不那麼頻繁時使用

3.1.2. 操作很常用,那就不能節省記憶體了

3.1.2.1. 因為記憶體總是會被分配

3.2. 對於使用線程安全對象的代碼,延遲初始化時應該使用雙重檢查鎖

3.3. 同步瓶頸

3.3.1. 通過慣用的雙重檢查鎖來解決

3.3.2. 實例變數必須被聲明為volatile

3.3.3. 將實例變數賦值到局部變數會帶來輕微的性能提升

3.4. 設為null來及早清理

3.4.1. eagerly deinitializing

3.4.2. 在有限的情況下有用

3.4.3. 顯式地將一個對象引用設置為null基本不會給性能帶來什麼好處

3.4.4. 如果一個長期存活的類會緩存並丟棄對象引用,則必須註意避免過時引用

4. 使用不可變對象和標準化對象

4.1. 不可變對象為標準化這種特殊的生命周期管理提供了可能性

4.2. 最常見的Java對象是不可變的String對象

4.2.1. 字元串可以調用intern()方法來找到這個字元串的標準化版本

4.3. 對象的標準化版本

4.3.1. canonical version

4.3.2. 不可變對象的單一表示

4.3.3. 通過標準化消除不可變對象的重覆副本,可以極大地減少應用程式的堆使用量

4.3.4. 使用標準化的值通常也可以節省記憶體


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 好家伙,本篇為做題思考 書接上文 題目如下: 1.請給出下列代碼的輸出結果,並配合"消息隊列"寫出相關解釋 async function foo() { console.log(2); console.log(await Promise.resolve(8)); console.log(9); } ...
  • 一般來說,項目由子模塊組成,拿到後端提供過來的介面,一般也是按照子模塊來分類提供的.請教一下各位,你們前端項目是如何管理api的? 希望各位貼點你們的優秀代碼段上來學習學習. 常見: 各個模塊的api存放到單獨的js文件里,返回一個請求實例promise對象 使用的時候根據需求引入相應的請求方法 / ...
  • 其他章節請看: webgl 系列 變換矩陣和動畫 動畫就是不停地將某個東西變換(transform)。例如將三角形不停地旋轉就是一個動畫 和 CSS transform 類似,變換有三種形式:平移、縮放和旋轉。 簡單的變換用普通表達式容易實現,如果事情複雜,比如旋轉後平移,這時就可以使用變換矩陣。 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 網站效果演示:ashuai.work:8888/#/myLoad GitHub倉庫地址代碼:github.com/shuirongshu… 載入中思路分析 實現載入中效果,一般有兩種方式: 第一種是:搞一個load組件,然後使用Vue.e ...
  • <!-- * @description 表格組件 * @fileName TableList.vue * @authorQ * @date 2021/05/15 15:13:45 --> <template> <div class="table-container"> <el-table v-if= ...
  • 定義 使用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。原型模式是一種對象創建型模式 百科。 通俗的說就是原型模式是一種創建型設計模式,指定某個對象(通過某種方式)得到一個新的對象,在記憶體中擁有新的地址,得到的對象與原對象是是相互獨立的,即得到跟原對象一樣的對象 當我們需要兩個一模一 ...
  • 前端中介者模式(Mediator Pattern),用於將對象之間的通信解耦並集中管理。它通過引入一個中介者對象,將對象之間的交互轉移到中介者對象中,從而避免對象之間直接相互通信。 在前端開發中,中介者模式常常被用於管理複雜的用戶界面或組件之間的交互,比如 GUI 組件、聊天室、游戲等等。通過引入一 ...
  • 這篇文章主要描述如何解決消息重發的問題,目前主流的消息隊列產品都採用了At least once的服務質量,這就導致了很難避免消息重發的情況,我們可以將消費者業務邏輯設計成冪等服務來解決消息重發問題。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...