java性能優化,Java性能優化實戰

本文目錄一覽:

《Java性能優化權威指南豆瓣》pdf下載在線閱讀全文,求百度網盤雲資源

《Java性能優化權威指南豆瓣》百度網盤pdf最新全集下載:

鏈接:

?pwd=vosf 提取碼:vosf

簡介:《Java性能優化權威指南》是Java應用性能調優的聖經,內容通俗易懂,介紹了大量的監控和測量工具,涉及各種硬件架構和操作系統。涵蓋了如何構建實驗、解釋結果以及如何採取行動等技巧。  

如何優化java虛擬機,提高性能

關於性能調優:

1 需要一個性能探測器,找到調用最頻繁的代碼段,優化這部分代碼(優化算法)

2 往往1%的代碼運行時間佔99%。所以優化這些代碼就能事半功倍。

3 最好是能看懂編譯後的代碼,這樣分析最徹底。

Java的性能分析使用JProfiler

堆棧分析使用的Jstack

Java性能調優 SSH框架優化以適應特定的項目

一、JVM調優

1 各種垃圾回收算法及其優劣;

2 針對不同應用類型如何選擇JVM參數

3 常用調優工具的使用(jps/jstat/jmap/jstack/jinfo/jhat)

4 調優案例分析(如何選擇不同內存塊的大小,如何選擇不同的算法來提升性能、響應時間)

二、Java應用中CPU佔用率、使用情況分析,線程死鎖等鎖

系統性能瓶頸的分析定位

1 JStack的深度使用

2 各種Linux監控命令的配合使用(top,vmstat,iostat,sar 不要輕信自己能完全掌控這些命令)、分析

(前一陣Java漏洞通過製造Hash衝突來佔盡CPU資源就可以通過top命令快速定位到,你肯定沒有這麼用過)

3 JProfiler的詳細使用

三、Java內存溢出分析

1 用EMA來分析內存佔用情況

2 通過案例分析來定位內存泄漏

互聯網中的性能主要是兩個方面:

1 吞吐量,就是系統支持的訪問量。

2 延遲,就是一個請求提交後,相應的時間。

一般硬件不變的情況下,兩方面各自優化到極限後,相互會制約,也就是吞吐量增強的話比如需要延遲加大,反之亦然。

Java代碼如何優化?從哪些方面入手?分析

1)盡量指定類、方法的final修飾符。帶有final修飾符的類是不可派生的,Java編譯器會尋找機會內聯所有的final方法,內聯對於提升Java運行效率作用重大,此舉能夠使性能平均提高50%。

2)盡量重用對象。由於Java虛擬機不僅要花時間生成對象,以後可能還需要花時間對這些對象進行垃圾回收和處理,因此生成過多的對象將會給程序的性能帶來很大的影響。

3)儘可能使用局部變量。調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧中速度較快,其他變量,如靜態變量、實例變量等,都在堆中創建速度較慢。

4)慎用異常。異常對性能不利,只要有異常被拋出,Java虛擬機就必須調整調用堆棧,因為在處理過程中創建了一個新的對象。異常只能用於錯誤處理,不應該用來控制程序流程。

5)乘法和除法使用移位操作。用移位操作可以極大地提高性能,因為在計算機底層,對位的操作是最方便、最快的,但是移位操作雖然快,可能會使代碼不太好理解,因此最好加上相應的注釋。

6)盡量使用HashMap、ArrayList、StringBuilder,除非線程安全需要,否則不推薦使用 Hashtable、Vector、StringBuffer,後三者由於使用同步機制而導致了性能開銷。

盡量在合適的場合使用單例。使用單例可以減輕加載的負擔、縮短加載的時間、提高加載的效率,但並不是所有地方都適用於單例。

tomcat 性能調優

java性能優化原則:代碼運算性能 內存回收 應用配置(影響java程序注意原因是垃圾回收)

代碼層優化:避免過多的循環嵌套 調用和複雜邏輯

Tomcat調優主要內容

1.增加最大連接數

2.調整工作模式

3.啟用gzip壓縮

4.調整JVM內存大小

5.作為web服務器時 與Apache整合或Nginx

6.合理選擇垃圾回收算法

7.盡量使用較新版的JDK

生產環境實例

connector p=””

maxThreads=”1000″

minSpareThreads=”100″

maxSpareThreads=”200″

acceptCount=”900″

disableUploadTimeout=”true”

connectionTimeout=”20000″

URIEncoding=”UTF-8″

enableLookups=”false”

redirectPort=”8443″

compression=”on”

compressionMinSize=”1024″

compressableMimeType=”text/html,text/xml,text/css,text/javascript”/

參數說明:

org.apache.coyote.http11.Http11NioProtocol:調整工作模式為Nio

maxThreads:最大線程數,默認150。增大值避免隊列請求過多,導致響應緩慢。

minSpareThreads:最小空閑線程數

maxSpareThreads:最大空閑線程數,如果超過這個值,會關閉無用的線程。

acceptCount:當處理請求超過此值時,將後來請求放到隊列中等待。

disableUploadTimeout:禁用上傳超時時間

connectionTimeout:連接超時,單位毫秒,0代表不限制

URIEncoding:URI地址編碼使用UTF-8

enableLookups:關閉dns解析,提高響應時間

compression:啟用壓縮功能

compressionMinSize:最小壓縮大小,單位Byte

compressableMimeType:壓縮的文件類型

Tomcat的三種工作模式: Bio、Nio和Apr 工作原理分別為

Bio(Blocking I/O):默認工作模式 阻塞式I/O操作 沒有任何優化技術處理 性能比較低

Nio(New I/O or Non-Blocking):非阻塞式I/O操作 有BIO更好的並發處理性能

Apr(apache portable runtime,apache可移植運行庫):首選工作模式 主要為上層的應用程序提供一個可以跨越多操作系統平台使用的底層支持接口庫

Tomcat利用基於APR庫Tomcat-native來實現操作系統級別控制 提供一種優化技術和非阻塞式I/O操作 大大提高並發處理能力

但是需要安裝APR和Tomcat-native庫

Java性能問題主要來自於jvm jvm GC也比較複雜

1、jvm內存劃分為年輕代(Young Generation)、年老代 Old Generation)、永久代(Permanent Generation)

2、年輕代又分為Eden和Survivor區。Survivor區由FromSpace和ToSpace組成。Eden區佔大容量,Survivor兩個區佔小容量,默認8:2

3、堆內存Heap=年輕代+年老代 非堆內存=永久代

4、堆內存用途:存放的是對象 垃圾收集器就是收集這些對象的 然後根據GC算法回收

5、非堆內存用途:JVM本身使用 存放一些類型 方法 常量 屬性等

6、年輕代:新生成的對象首選放到年輕代的E區中 當E區滿時 經過GC後 還存活的對象被複制到Survivor區的FromSpace中 如果survivor區滿

會再被複制到survivor區的ToSpace區 如果還有存活的對象 會再被複制到老年代

7、老年代:在年輕代中經過GC後還存活的對象會被複制到老年代中 當老年代空間不足時 jvm會對老年代進行完全的垃圾回收(Full GC)

如果GC後 還是無法存放從survivor區複製過來的對象 就會出現OOM

8、永久代:也稱為方法區 存放靜態類型數據 比如類 方法 屬性等

垃圾回收算法

1、標記 清除

2、複製

3、標記 整理

垃圾收集器

單線程/多線程收集器

GMS收集器

JAVA_OPTS=”-server -Xms1024m -Xmx1536m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParallelGCThreads=8 XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:-PrintGC -XX:-PrintGCDetails -XX:-PrintGCTimeStamps -Xloggc:../logs/gc.log”

參數 描述

-Xms 堆內存初始大小 單位M、G

-Xmx 堆內存最大允許大小 一般不要大於物理內存的80%

-XX:PermSize 非堆內存初始大小 一般應用設置初始化200M 最大1024M就夠了

-XX:MaxPermSize 非堆內存最大允許值

-XX:+UseParallelGCThreads=8 並行收集器線程數 同時有多少個線程進行垃圾回收 一般與CPU數量相等

-XX:+UseParalle101dGC 指定老年代為並行收集

-XX:+UseConcMarkSweepGC CSM收集器

-XX:+UseCMSCCompactAtFullCollection 開啟內存空間壓縮和整理 防止過多內存碎片

-XX:CMSFullGCsBeforeCompaction=0 表示多少次Full GC後開始壓縮和整理 0表示每次Full GC後立即執行壓縮和整理

-XX:CMSInitiatingOccupancyFracetion=80% 表示老年代內存空間使用80%時開始執行CMS收集 防止過多的Full GC

注意:不是jvm內存設置越大越好 具體還是根據項目對象實際占內存大小而定 可以通過java自帶的分析工具來查看

如果設置過大 會增加回收實際 從而增加暫停應用時間

gzip壓縮作用:節省服務器流量和提高網站訪問速度 客戶端請求服務器資源後 服務器將資源文件壓縮 再返回給客戶端 有客戶端的瀏覽器負責壓縮並瀏覽

Apache和Tomcat結合

由於Tomcat處理靜態文件能力遠遠不足Apache 所有用Apache處理靜態文件 Tomcat負責處理jsp

session會話的保持

TomcatSessionID持久化三種方法

session粘性:通過瀏覽器cookie綁定sessionID 通過sticky模式將同一session請求分片到同一Tomcat上

session複製:tomcat通過廣播形式將session同步到其它Tomcat節點 並且Linux下要手動開啟開放廣播地址 不宜後端節點過多

session保持數據庫(memcache redis):將sessionID保存在共享的數據庫中

OOM異常的幾個原因

老年代內存不足:java.lang.OutOfMemoryError:Javaheapspace

永久代內存不足:java.lang.OutOfMemoryError:PermGenspace

代碼bug 佔用內存無法及時回收

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/181687.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-23 06:44
下一篇 2024-11-23 06:44

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論