JVM原理(十):JVM虛擬機調優分析與實戰

1. 大內存硬件上的程序部署策略

這是筆者很久之前處理過的一個案例,但今天仍然具有代表性。一個15萬PV/日左右的在線文檔類型網站最近更換了硬件系統,服務器的硬件為四路志強處理器、16GB物理內存,操作系統為64位CentOS5.4,Resin作為Web服務器。整個服務器暫時沒有部署別的應用,所有硬件資源都可以提供給這訪問量并不算太大的文檔網站使用。軟件版本選用的是64位的JDK5,管理員啟用了一個虛擬機實例,使用-Xmx和-Xms參數將Java堆大小固定在12GB。使用一段時間后發現服務器的運行效果十分不理想,網站經常不定期出現長時間失去響應。


原因:垃圾收集器停頓所導致的。默認使用的是吞吐量優先收集器,回收12GB的Java堆,一次FullGC的停頓時間就高達14秒。


解決方案:

目前單體應用在較大內存的硬件上主要有兩種部署方式

  1. 通過一個單獨的Java虛擬機實例來管理大量的Java堆內存。

  2. 同時使用若干個Java虛擬機,建立邏輯集群來利用硬件資源。

其次:可以在深夜執行定時任務的方式觸發full GC甚至是重新啟動應用服務器來保持內存可用空間在一個穩定水平。

控制Full GC頻率的關鍵是老年代的相對穩定,這主要取決于應用中絕大多數對象能否符合“朝生夕滅”的原則,即大多數對象的生存時間不應當太長,尤其是不能有成批量的、長生存時間的大對象產生,這樣才能保障老年代空間的穩定。

現實生活中:B/S形式的應用里,多數對象的生存周期都應該是請求級或者頁面級的,會話級和全局級的長生命對象相對較少。

2. 集群間同步導致的內存溢出

集群的優點可以均衡并發處理,以及合理利用服務器資源。缺點就是會使用一部分開銷,以及數據冗余。

3. 堆外內存導致的溢出錯誤

直接內存不能像新生代、老年代那樣,發現空間不足了就主動通知收集器進行垃圾回收,它只能等待老年代滿后Full GC出現后,“順便”幫它清理掉內存的廢棄對象。否則就不得不一直等到拋出內存溢出異常時,才進行清理。

從實踐經驗的角度出發,在處理小內存或者32位的應用問題時,除了Java堆和方法區之外,我們注意到下面這些區域還會占用較多的內存,這里所有的內存總和受到操作系統進程最大內存的限制:

直接內存:可通過-XX: M axDirectM emory Size調整大小,內存不足時拋出OutOf-M emory Error或者OutOfMemoryError: Direct buffer memory。

線程堆棧:可通過-Xss調整大小,內存不足時拋出StackOverflowError (如果線程請求的棧深度大于虛擬機所允許的深度)或者OutOfM emory Error (如果Java虛擬機棧容量可以動態擴展,當棧擴展時無法申請到足夠的內存)。

Socket緩存區:每個Socket連接都Receive和Send兩個緩存區,分別占大約37KB和25KB內存,連接多的話這塊內存占用也比較可觀。如果無法分配,可能會拋出IOException: Too many open files 異常。

JNI代碼:如果代碼中使用了JNI調用本地庫,那本地庫使用的內存也不在堆中,而是占用Java虛擬機的本地方法棧和本地內存的。

虛擬機和垃圾收集器:虛擬機、垃圾收集器的工作也是要消耗一定數量的內存的。

4. 外部命令導致系統緩慢

用戶根據建議去掉這個Shell腳本執行的語句,改為使用Java的API去獲取這些信息后,系統很快恢復了正常。

5. 服務器虛擬機進程崩潰

原因:MIS系統的用戶多,待辦事項變化很快,為了不被0A系統速度拖累,使用了異步的方式調用Web服務,但由于兩邊服務速度的完全不對等,時間越長就累積了越多Web服務沒有調用完成,導致在等待的線程和Socket連接越來越多,最終超過虛擬機的承受能力后導致虛擬機進程崩潰。

解決方案:通知OA門戶方修復無法使用的集成接口,并將異步調用改為生產者/消費者模式的消息隊列實現后,系統恢復正常。

6. 不恰當數據結構導致內存占用過大

我們具體分析一-下HashM ap空間效率,在HashM ap<Long,Long結 構中,只 有Key和Value所存放的兩個長整型數據是有效數據,共16字節(2x8字節)。這兩個長整型數據包裝成java.langLong對象之后,就分別具有8字節的M ark Word、 8字節的Klass指針,再加8字節存儲數據的long值。 然后這2個Long對象組成Map .Entry之后,又多了16字節的對象頭,然后一個8字節的next字段和4字節的int型的hash字段,為了對齊,還必須添加4字節的空白填充,最后還有HashM ap中對這個Entry的8字節的引用,這樣增加兩個長整型數字,實際耗費的內存為( ong(24byte)x 2)+Fntry(32by te)+HashMap Ref(8byte)=88byte,空間效率為有效數據除以全部內存空間,即16字節/88字節=18%,這確實太低了。

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

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

相關文章

js數組方法歸納——concat、join、reverse

1、concat( ) 用途&#xff1a;可以連接兩個或多個數組&#xff0c;并將新的數組返回該方法不會對原數組產生影響 var arr ["孫悟空","豬八戒","沙和尚"];var arr2 ["白骨精","玉兔精","蜘蛛精"];var arr3 [&…

Vue Router的深度解析

引言 在現代Web應用開發中&#xff0c;客戶端路由已成為實現流暢用戶體驗的關鍵技術。與傳統的服務器端路由不同&#xff0c;客戶端路由通過JavaScript在瀏覽器中控制頁面內容的更新&#xff0c;避免了頁面的全量刷新。Vue Router作為Vue.js官方的路由解決方案&#xff0c;以其…

阿里云centos 取消硬盤掛載并重建數據盤信息再次掛載

一、取消掛載 umount [掛載點或設備] 如果要取消掛載/dev/sdb1分區&#xff0c;可以使用以下命令&#xff1a; umount /dev/sdb1 如果要取消掛載在/mnt/mydisk的掛載點&#xff0c;可以使用以下命令&#xff1a; umount /mnt/mydisk 如果設備正忙&#xff0c;無法立即取消…

【Spring Boot】簡單了解spring boot支持的三種服務器

Tomcat 概述&#xff1a;Tomcat 是 Apache 軟件基金會&#xff08;Apache Software Foundation&#xff09;的 Jakarta EE 項目中的一個核心項目&#xff0c;由 Apache、Sun 和其他一些公司及個人共同開發而成。它作為 Java Servlet、JSP、JavaServer Pages Expression Languag…

系統安全及應用(命令)

目錄 一、賬號安全控制 1.1 系統賬號清理 1.2 密碼安全控制 1.3 歷史記錄控制 1.4 終端自動注銷 二、系統引導和登陸控制 2.1 限制su命令用戶 2.2 PAM安全認證 示例一&#xff1a;通過pam 模塊來防止暴力破解ssh 2.3 sudo機制提升權限 2.3.1 sudo命令&#xff08;ro…

Java的日期類常用方法

Java_Date 第一代日期類 獲取當前時間 Date date new Date(); System.out.printf("當前時間" date); 格式化時間信息 SimpleDateFormat simpleDateFormat new SimpleDateFormat("yyyy-mm-dd hh:mm:ss E); System.out.printf("格式化后時間" si…

【windows|012】光貓、路由器、交換機詳解

&#x1f341;博主簡介&#xff1a; &#x1f3c5;云計算領域優質創作者 &#x1f3c5;2022年CSDN新星計劃python賽道第一名 &#x1f3c5;2022年CSDN原力計劃優質作者 ? &#x1f3c5;阿里云ACE認證高級工程師 ? &#x1f3c5;阿里云開發者社區專家博主 &#x1f48a;交流社…

windows USB 驅動開發-URB結構

通用串行總線 (USB) 客戶端驅動程序無法直接與其設備通信。 相反&#xff0c;客戶端驅動程序會創建請求并將其提交到 USB 驅動程序堆棧進行處理。 在每個請求中&#xff0c;客戶端驅動程序提供一個可變長度的數據結構&#xff0c;稱為 USB 請求塊 (URB) &#xff0c;URB 結構描…

ctfshow-web入門-命令執行(web75-web77)

目錄 1、web75 2、web76 3、web77 1、web75 使用 glob 協議繞過 open_basedir&#xff0c;讀取根目錄下的文件&#xff0c;payload&#xff1a; c?><?php $anew DirectoryIterator("glob:///*"); foreach($a as $f) {echo($f->__toString(). ); } ex…

讀書筆記-Java并發編程的藝術-第3章(Java內存模型)-第9節(Java內存模型綜述)

3.9 Java內存模型綜述 前面對Java內存模型的基礎知識和內存模型的具體實現進行了說明。下面對Java內存模型的相關知識做一個總結。 3.9.1 處理器的內存模型 順序一致性內存模型是一個理論參考模型&#xff0c;JMM和處理器內存模型在設計時通常會以順序一致性內存模型為參照。…

ORB-SLAM2 安裝編譯運行(非 ROS)

安裝編譯 必備安裝工具 主要包括 cmake 、 git 、 gcc 、 g gcc 的全稱是 GNU Compiler Collection&#xff0c;它是由 GNU 推出的一款功能強大的、性能優越的 多平臺編譯器&#xff0c;是一個能夠編譯多種語言的編譯器。最開始 gcc 是作為 C 語言的編譯器&#xff08;GNU …

如何將等保2.0的要求融入日常安全運維實踐中?

等保2.0的基本要求 等保2.0是中國網絡安全領域的基本國策和基本制度&#xff0c;它要求網絡運營商按照網絡安全等級保護制度的要求&#xff0c;履行相關的安全保護義務。等保2.0的實施得到了《中華人民共和國網絡安全法》等法律法規的支持&#xff0c;要求相關行業和單位必須按…

C#/WPF 自制白板工具

隨著電子屏幕技術的發展&#xff0c;普通的黑板已不再適用現在的教學和演示環境&#xff0c;電子白板應運而生。本篇使用WPF開發了一個電子白板工具&#xff0c;功能豐富&#xff0c;非常使用日常免費使用&#xff0c;或者進行再次開發。 示例代碼如下&#xff1a; Stack<St…

拓撲排序[講課留檔]

拓撲排序 拓撲排序要解決的問題是給一個有向無環圖的所有節點排序。 即在 A O E AOE AOE網中找關鍵路徑。 前置芝士&#xff01; 有向圖&#xff1a;有向圖中的每一個邊都是有向邊&#xff0c;即其中的每一個元素都是有序二元組。在一條有向邊 ( u , v ) (u,v) (u,v)中&…

JavaScript 動態網頁實例 —— 廣告效果

廣告是現代網頁設計中不可或缺的內容。廣告可以有很多種形式,但最終目的都是要吸引觀眾的注意力。盡管廣告少不了畫面、音效和廣告語等效果,但其實現主要還是應用JavaScript 代碼,只要很好掌握了JavaScript程序設計,剩下的就是創意和美工了。本章介紹幾種廣告效果,包括對聯…

ChatGPT 官方發布桌面端,向所有用戶免費開放

Open AI 官方已經發布了適用于 macOS 的 ChatGPT 桌面端應用。 此前&#xff0c;該應用一直處于測試階段&#xff0c;僅 Plus 付費訂閱用戶可以使用。 目前已面向所有用戶開放&#xff0c;所有 Mac 用戶均可免費下載使用。 我們可以訪問官網下載安裝包&#xff1a;https://op…

Java利用poi實現word,excel,ppt,pdf等各類型文檔密碼檢測

介紹 最近工作上需要對word,excel,ppt,pdf等各類型文檔密碼檢測&#xff0c;對文件進行分類&#xff0c;有密碼的和沒密碼的做區分。查了一堆資料和GPT都不是很滿意&#xff0c;最后東拼西湊搞了個相對全面的檢測工具代碼類&#xff0c;希望能給需要的人帶來幫助。 說明 這段…

PHP 爬蟲之使用 Curl庫抓取淘寶商品列表數據網頁的方法

使用 PHP 的 cURL 庫來抓取淘寶商品列表數據網頁需要謹慎&#xff0c;因為淘寶等電商平臺通常會有反爬蟲機制&#xff0c;以防止數據被濫用。然而&#xff0c;如果你只是出于學習目的&#xff0c;并且了解并遵守了淘寶的robots.txt文件和相關的使用條款&#xff0c;你可以嘗試使…

2024 年江西省研究生數學建模競賽題目 B題投標中的競爭策略問題--完整思路、代碼結果分享(僅供學習)

招投標問題是企業運營過程中必須面對的基本問題之一。現有的招投標平臺有國家級的&#xff0c;也有地方性的。在招投標過程中&#xff0c;企業需要全面了解招標公告中的相關信息&#xff0c;在遵守招投標各種規范和制度的基礎上&#xff0c;選擇有效的競爭策略和技巧&#xff0…

基于JSP技術的校園餐廳管理系統

開頭語&#xff1a; 你好呀&#xff0c;我是計算機學長貓哥&#xff01;如果您對校園餐廳管理系統感興趣或有相關需求&#xff0c;歡迎隨時聯系我。我的聯系方式在文末&#xff0c;期待與您交流&#xff01; 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#x…