改善Java應用程序性能的快速技巧

曾經遇到過性能問題嗎? 我也是。 如果我的經理再喊一次“ faaaaster”,我一生都會有聽力障礙。 順便說一句,我能聽到所有聲音中的德語發音嗎? ;-)

您可以相信仍然有人無知地在談論垃圾收集器(得到它嗎?)和JVM的性能。

……我將再次返回C語言,因此我不必擔心性能……

*嘆*

JVM一直在不斷改進其收集器算法,并且每個發行版中都將高度復雜的優化功能集成到了編譯器中(并且最近十年來一直在這樣做)。 您是否真的希望比世界上一些最聰明的人有經驗,能力和時間來編寫更好,更優化的C代碼?

Pleeeeease…

如果您像我一樣,其余99.99%的人,則明智的做法是忘記C。克服它。 (向所有核心C程序員致敬,不要被激怒)。

盡管我們的開發人員喜歡抽象,但我們不能否認它們天生就是泄漏的事實。 硬件*確實*很重要。 處理器數量和內存增長的趨勢使共享內存線程并發變得更加困難。 鎖定 ,上下文切換和線程調度可以使您的吞吐量等于糖漿,認為將更多線程倒入閃亮的新超級美容機中將以某種方式神奇地為您提供更多性能。 在某種程度上可能會,但這不是我的意思。

那么該怎么辦? 我并沒有聲稱自己是一名性能專家,但我不是,但我有一些實用建議,至少可以幫助我解決過去一些討厭的性能錯誤。

1.編寫簡潔明了的代碼。 考慮使您的類不可變,它們是線程安全的,因此不需要同步,并且可以放心地對其進行緩存,以確保對象值在創建后不會更改。 不變性還導致代碼更易于理解。 不要嘗試使用過早的優化技巧來超越JVM。

Donald Knuth說: “程序員浪費大量時間來考慮或擔心程序非關鍵部分的速度,而這些效率的嘗試實際上在考慮調試和維護時會產生嚴重的負面影響。 我們應該忘記效率低下的問題,例如大約97%的時間:過早的優化是萬惡之源。 但是我們不應該放棄我們那關鍵的3%的機會。”

2.花一些時間了解不同垃圾收集器的工作方式。 信息有點分散,但是它在那里。 找到垃圾回收和您的應用程序之間的資源共享最有效點。 一般來說,較大的堆意味著垃圾收集器需要更努力地工作(竊取更多的CPU周期),并且暫停時間會更長,但頻率更低。 以我的經驗,即使使用CMS也無法避免世界停頓,因為最終您的堆將像瑞士奶酪一樣碎片化,并且繁榮, 內存碎片化失敗 。 好消息是,JDK7可能會包括一個名為G1的新的低暫停時間收集器,該收集器有可能完全避免世界停頓。 另請參閱Java 7中的垃圾優先收集器(G1) 。

3.在編程時,默認情況下始終使用java.util.concurrency 。 閱讀Java內存模型和線程規范 。 它將幫助您理解為什么您的代碼可能無法正常運行。 關于并發的主題也有很多不錯的書:

  • 實踐中的Java并發
  • 多處理器編程的藝術
  • Java并發編程:設計原理和模式(第二版)

4.您可能正在處理具有粗糙粒度同步的舊代碼(您無法影響),從而導致高線程爭用。 將CPU親和力與同一臺機器上的多個JVM進程一起使用可以幫助減少對熱鎖的爭用。

5.如果您認為通過執行基準測試發現JVM性能問題,請首先確保您“知道”測量結果是準確的 。 如果您嘗試測量某些東西, 請不要測量其他東西 。 忽略此建議可能會使您誤以為是真正的問題所在。 因此,在開始測量之前,請確保正確隔離系統部件。

例如,如果您懷疑線程爭用,請查看ThreadInfo或嘗試jstat并查找sun.rt._sync_ContendedLockAttempts。

jstat -J-Djstat.showUnsupported=true -snap PID | grep _sync_

關于這個主題有太多話要說,但是我現在沒有時間寫更多。 編碼愉快!

參考: Deep Hacks博客上的JCG合作伙伴 Usain Bolt看起來 不錯 。

相關文章 :

  • Java最佳實踐
  • 如何在Java中獲得類似于C的性能
  • 每個程序員應該了解的內存系統知識
  • Java內存模型–快速概述和注意事項

翻譯自: https://www.javacodegeeks.com/2011/09/quick-tips-for-improving-java-apps.html

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

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

相關文章

P1047 [NOIP2005 普及組] 校門外的樹

某校大門外長度為 ll 的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是 11 米。我們可以把馬路看成一個數軸,馬路的一端在數軸 00 的位置,另一端在 ll 的位置;數軸上的每個整數點,即 0,1,2,\dots,l0,1,2,…,l&#xff0…

團隊開發——個人工作總結04

昨天對要用到的SQL語句進行了研究,分別得到了以下結果: 1.這段語句是為用戶登錄服務的,通過JSP的到的用戶名username和密碼passdword作為條件查詢數據庫,如果有查詢結果,則返回true select * from [login] where usern…

Nginx的幾種常見的幾種啟動方式

1.默認方式啟動 直接執行Nginx的二進制文件即可 /usr/local/nginx/sbin/nginx 這時默認讀取配置文件,配置文件目錄 /usr/local/nginx/conf/nginx.conf 2.指定配置文件的啟動方式 /usr/local/nginx/sbin/nginx -c /tmp/nginx.conf轉載于:https://www.cnblogs.com/Leo…

yii2閱讀隨筆14

繼續來看Event.php /*** Triggers a class-level event.* 觸發類級別事件。* This method will cause invocation of event handlers that are attached to the named event* for the specified class and all its parent classes.* 觸發某個類或者對象的某個事件* param strin…

P1059 [NOIP2006 普及組] 明明的隨機數

題目描述 明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了N個1到1000之間的隨機整數(N≤100),對于其中重復的數字,只保留一個,把其余相同的數去掉,不同的數對應著不同的學…

基本的EJB參考,注入和查找

在本系列的第一部分中 ,我們介紹了Enterprise JavaBeans v。3.0規范提供的機制,用于定義EJB組件,聲明對EJB的引用并通過依賴項注入或程序化JNDI查找將它們連接起來。 在此博客文章中,我們將研究一些基本示例以了解如何使用EJB API…

ViewPager使用筆記

1.ViewPager.setCurrentItem(position),即使已設置動畫,但是沒有動畫效果 原因:因為ViewPager滑動之前的時間間隔太短,可以通過反射,去修改ViewPager自動滑動時間,代碼實現如下 1 public class ViewPagerSc…

IOS開發之Swift學習筆記

1.因為存儲屬性要求初始化,我們可以使用lazy修飾符來延遲初始化。轉載于:https://www.cnblogs.com/luntai/p/5430223.html

力扣1兩數之和

給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案里不能重復出現。 你可以按任意順序返回…

C ++或Java,高頻交易哪個更快?

總覽 關于什么是高頻交易的最佳解決方案,存在不同意見。 問題的一部分是高頻交易的變化超出您的預期,另一部分是更快的含義。 我的看法 如果您有一個典型的Java程序員和一個典型的C 程序員,并且每個人都有幾年編寫典型的面向對象程序的經驗…

iOS 8 Xcode6 設置Launch Image 啟動圖片

本人apem http://www.mamicode.com/info-detail-494411.html 如何設置App的啟動圖,也就是Launch Image? Step1 1.點擊Image.xcassets 進入圖片管理,然后右擊,彈出"New Launch Image"2.如圖,右側的勾選可以讓你選擇是否要對ipad,橫屏,豎屏,以及低版本的ios系統做支持…

代碼分享h5-sessionStorage,提示app下載代碼塊

1.html <div class"down-app">    <span id"dowm-close">x</span>    <dl>      <dt>logo</dt>      <dd>        <h3>某某公司</h3>        <p>某某公…

Apache CXF負載平衡和故障轉移

前一段時間&#xff0c;我們已經面臨基于Apache CXF的負載平衡Web服務客戶端的需求。 此外&#xff0c;當某些服務器關閉時&#xff0c;客戶端應自動進行故障轉移。 更糟糕的是&#xff0c;服務器目標地址列表要從外部服務獲取并在運行時更新。 最終&#xff0c;我們最終獲得了…

Java局部變量一定要賦初值

根據大佬文章https://blog.csdn.net/wjw521wjw521/article/details/79243596的理解而寫的 1.類成員變量在 類加載 時會被系統賦初值&#xff0c;比如定義一個整型變量int num 系統默認num值為0 2.但是方法內的局部變量執行進棧操作&#xff0c;這個過程中系統不會賦初值&…

隱式的類類型轉換

如果構造函數只接受一個實參&#xff0c;則它實際上定義了轉換為此類類型的隱式轉換機制。將這種構造函數稱為轉換構造函數。 #ifndef MAIN_H_INCLUDED#define MAIN_H_INCLUDED#include<iostream>usingnamespace std;classClassTest{public:ClassTest(){ cout <<&q…

負數的 %求余和取模

1.求余和取模是不同的 2.‘%’ 在C/C&#xff0c;Java等語言中意為 求余 &#xff0c;在python 中意為 取模 3.a%b c 求余: c的符號和a一致 取模&#xff1a;c的符號和b一致 比如&#xff0c;一個小李子&#xff1a; public class Solution{public static void main(String…

PAT-BASIC-1038-統計同成績學生

本題要求讀入N名學生的成績&#xff0c;將獲得某一給定分數的學生人數輸出。 輸入格式&#xff1a; 輸入在第1行給出不超過105的正整數N&#xff0c;即學生總人數。隨后1行給出N名學生的百分制整數成績&#xff0c;中間以空格分隔。最后1行給出要查詢的分數個數K&#xff08;不…

JavaScript事件處理的三種方式(轉)

一、什么是JavaScript事件&#xff1f;事件(Event)是JavaScript應用跳動的心臟&#xff0c;也是把所有東西粘在一起的膠水&#xff0c;當我們與瀏覽器中Web頁面進行某些類型的交互時&#xff0c;事件就發生了。 事件可能是用戶在某些內容上的點擊、鼠標經過某個特定元素或按下鍵…

Erlang與Java內存架構

我讀了一篇關于Erlang VM的內存管理策略的非常非常有趣的文章。 它是Jesper Wilhelmsson撰寫的論文 &#xff0c;我認為討論Erlang的內存設置和Oracle的Java VM之間的差異可能會很好。 作為對從未聽說過Erlang的人的真正的簡短介紹; 它是一種功能語言&#xff0c;使用異步消息傳…

Xuggler教程:轉碼和媒體修改

注意&#xff1a;這是我們的“ Xuggler開發教程 ”系列的一部分。 在之前的教程中&#xff0c;我對視頻處理Xuggler進行了簡短介紹 。 在這一部分中&#xff0c;我們將看到Xuggler和FFmpeg提供的一些更令人興奮的功能&#xff0c;例如視頻轉碼和媒體修改。 不要忘記Xuggler是一…