成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

提升 Java 應用程序的十個優化技巧

開發 前端
程序性能優化是一個復雜的話題。往往需要結合具體場景進行性能分析,找出瓶頸提出優化建議。但是,假設我們平時很少關注細節的性能,那么這種情況下,優化這些細節所帶來的收益也是相當可觀的。接下來,我們就來說說Java代碼細節優化的一些小技巧。

程序性能優化是一個復雜的話題。往往需要結合具體場景進行性能分析,找出瓶頸提出優化建議。但是,假設我們平時很少關注細節的性能,那么這種情況下,優化這些細節所帶來的收益也是相當可觀的。接下來,我們就來說說Java代碼細節優化的一些小技巧。

?復雜的字符串連接操作使用 StringBuilder

職業生涯早期,在做字符串連接操作的時候,肯定會這么寫:String a=c+e+d,這個Java語法糖對于開發者來說太方便了。但是如果你在循環中使用“+”,那就得小心了。

String a=null;
for(int i=0;i<1000;i++) {
a=a+i;
}

我們都知道String 是不可變的,因此循環中對 string 的每一次賦值都會在堆內存中創建一個新的 String 對象。在一個循環體中,反復創建多個無用的對象,不僅會占用內存空間,還會影響GC時間。所以說,如果在循環中遇到字符串拼接,就使用 StringBuilder 而不是“+”。

使用 ThreadPoolExecutor 避免手動創建線程

許多初學者喜歡在編寫代碼時創建線程,這是一種危險的做法。

如果這個線程的創建需要處理大量的請求,很可能導致你的程序頻繁的創建和銷毀線程,頻繁的切換線程上下文,浪費CPU資源,甚至會耗盡內存。

因此,建議使用ThreadPoolExecutor,并配置合適的核心線程數和最大線程數。

為集合預分配適當的容量

我們都知道 ArrayList,HashMap 和 ConcurrentHashMap 等集合類是可以自動擴容的,但是這種自動擴容涉及到底層數組的復制和遷移。如果擴容頻繁,肯定會影響程序的性能。所以如果你能估計出大概的容量,請直接配置初始值。

使用枚舉而不是常量類

很多人特別喜歡在項目中創建一個常量類,如下:

public class Constant {

public static final String TOKEN_HEADER = "x-request-token";

public static final Integer CODE_SUCCESS = 0;

public static final Integer CODE_REQUEST_FAILED = 1;

public static final Integer CODE_REQUEST_RUNNING = 2;
}

為什么不用枚舉呢?Enum 有強制的類型驗證。同時,使用枚舉類的性能更高。并且使用 enum 還有更大的優勢,它可以與策略模式一起使用來提高程序的可擴展性。例如:

public enum FileType {

EXCEL(".xlsx"){
@Override
public void download(String path) {
//do download excel file logic
}
}, CSV(".csv") {
@Override
public void download(String path) {
//do download csv file logic
}
};

private String suffix;

FileType(String suffix) {
this.suffix = suffix;
}

public String getSuffix() {
return suffix;
}

public abstract void download(String path);
}

如代碼所示,你可以根據需要動態選擇一種策略來下載文件,直接調用FileType.EXCEL.download(),無需關心代碼細節。

使用 NIO 代替傳統 IO

傳統的 IO 已經過時了。強烈推薦使用 NIO 代替傳統的 IO。因為傳統IO采用阻塞IO模型,請求數據后,線程從數據準備到數據可讀都是阻塞的。

而且,傳統IO如果要往網卡寫數據,需要先把數據寫到堆內存,然后再把數據拷貝到堆外的一塊內存,再從用戶態拷貝數據到內核狀態緩沖區。最后CPU通知DMA將數據寫入網卡,一共經歷了3次拷貝。NiO不僅采用了multiplex IO模型,還可以使用direct memory來減少數據拷貝次數,從而提高性能。

使用移位操作

如果你看過一些JDK的源代碼,比如HashMap,你會發現代碼中有很多移位操作。因為JDK是比較底層的代碼,對性能的追求也是極致的。在我們日常的編碼中,可以用移位運算來代替一些乘除運算,比如a >> 1 代替 a / 2,a * 16 代替 a << 4。

這個技巧也能在一定程度上提高性能,但是如果你不擅長,那就不要強求,因為當代計算機的性能已經非常強大了,沒必要為了一個程序而犧牲代碼的可讀性。

嘗試使用單例模式

如果我們設計一個不需要考慮線程安全的類,請用單例模式來使用這個類,這樣可以節省內存。幸運的是,對于我們使用的spring框架,Java bean默認是單例的。

降低鎖粒度

假設我們有一個共享文檔編輯功能,用戶會同時編輯共享文檔。為了保證文件的正確性,我們需要使用線程安全synchronized來保證。很多初學者可能會這樣寫。

public class Test{
private Object lock = new Object();

public void write(String username, String fileName) {
synchronized(lock) {
//do something
}
}
}

如果采用上述方式,只有一個線程可以進入同步代碼塊執行,其他線程只能掛起等待,即使這些線程可能寫入不同的文件。我們可以通過降低鎖粒度來提高性能。

public class Test{

public void write(String username, String fileName) {
synchronized(fileName.intern()) {
//do something
}
}
}

不要隨意使用靜態變量

如果你熟悉JVM基礎知識,那么就會知道如果一個對象被定義為靜態變量,這個變量的引用就不容易被垃圾回收器回收。

public class Test{
public static A a = new A();
}

靜態變量“a”的生命周期與測試類相同。只要測試類型沒有被卸載,“a”的引用對象就會駐留在內存中,直到程序終止。

使用基本數據類型

在應用程序中使用基本數據類型來減少內存消耗并提高程序性能。如果可以使用 int,請不要使用其 Integer 包裝類型,使用double 而不是 Double。

基本數據類型的包裝類實例存放在堆內存中,每次使用都會在堆內存中創建一個。如果使用基本數據類型,數據存放在棧幀中,棧的訪問速度可比堆快很多。

責任編輯:華軒 來源: 今日頭條
相關推薦

2019-08-16 02:00:46

AndroidGoogle 移動系統

2024-11-18 19:00:29

2024-09-26 15:00:06

2011-09-05 12:58:28

Ubuntu應用程序

2010-06-18 09:17:51

jQuery

2021-07-27 09:00:00

開發Web軟件

2011-08-01 09:20:16

2023-05-24 16:48:47

Jupyter工具技巧

2023-09-05 06:48:46

云計算微服務領導者

2023-10-23 14:14:10

SQL數據庫

2024-08-27 12:21:52

桌面應用開發Python

2021-04-16 08:11:07

程序體積優化

2019-09-26 08:33:51

Nginx技術Java

2024-09-04 14:28:20

Python代碼

2011-05-19 13:15:44

PHP

2023-11-27 18:01:17

MySQL技巧

2024-12-03 14:33:42

Python遞歸編程

2016-10-18 10:22:21

測試移動

2025-04-09 00:01:05

2015-08-24 09:12:00

Redis 技巧
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜小视频在线观看 | 天天久 | 国产91精品久久久久久久网曝门 | 精品久久久久久 | 欧美在线a| 欧美人成在线视频 | 久久小视频 | 亚洲精品日韩精品 | 亚洲天天干 | 五月综合色啪 | 亚洲国产日本 | 亚洲视频免费观看 | 九九热精品在线 | 九九综合 | 户外露出一区二区三区 | 91av大全| 伊人网站在线 | 四虎影院新网址 | 欧美久久久久久久 | 请别相信他免费喜剧电影在线观看 | 久久国产精品-国产精品 | 日韩av一区二区在线观看 | 国产精品中文在线 | 久久久国产一区二区三区 | 欧美夜夜 | 狠狠干av | 午夜天堂精品久久久久 | 91精品国产777在线观看 | 99久久婷婷国产综合精品电影 | 九九热免费视频在线观看 | 日韩电影a | 欧美一区二区在线观看 | 亚洲国产情侣自拍 | 亚洲精品中文字幕在线 | 亚洲精品第一 | 国产精品自产拍在线观看蜜 | 中文字幕国 | 国产精品视频一区二区三区四区国 | 成人免费共享视频 | 亚洲高清av在线 | 国内精品视频一区二区三区 |