資深Java工程師的面試題目(四)性能優化

以下是針對Java性能優化的面試題,涵蓋前后端技術棧的常見優化方式,適合評估候選人對性能調優的理解和實際應用能力:


1. JVM性能調優

題目:

  • 請說明JVM垃圾回收(GC)的常見類型及其適用場景,并描述如何通過JVM參數優化GC性能。
  • 編寫一個代碼示例,模擬內存泄漏場景,并說明如何通過工具定位和修復該問題。

參考答案:

  • GC類型與適用場景:

    • Serial GC:單線程,適用于單核CPU的小型應用。
    • Parallel GC(吞吐量優先):多線程,適用于注重吞吐量的批處理任務。
    • CMS(低延遲):以最短停頓時間為目標,適用于實時系統。
    • G1(平衡吞吐與延遲):適用于大堆內存(>4GB)的高并發場景。
    • ZGC/RHGC(超低延遲):毫秒級停頓,適用于大內存低延遲場景(如金融交易系統)。
  • JVM參數優化示例:

    # 啟用G1 GC,設置最大堆內存4GB,控制GC停頓時間目標為200ms
    java -XX:+UseG1GC -Xms4g -Xmx4g -XX:MaxGCPauseMillis=200 -jar myapp.jar
    
  • 內存泄漏示例與修復:

    // 內存泄漏場景:未關閉的資源導致對象無法回收
    public class LeakExample {private static List<BufferedReader> readers = new ArrayList<>();public void loadData(String filePath) throws IOException {BufferedReader reader = new BufferedReader(new FileReader(filePath));readers.add(reader); // 靜態集合導致reader無法被回收// ... 使用reader ...}
    }
    

    修復方法:

    1. 使用try-with-resources自動關閉資源。
    2. 避免靜態集合長期持有對象引用。
      定位工具:
    • MAT(Memory Analyzer):分析堆轉儲(heap dump),查找內存泄漏嫌疑對象。
    • jstat/jmap:監控GC行為和堆內存使用情況。

2. 高并發場景下的線程池優化

題目:

  • 請說明線程池核心參數的作用,并解釋如何根據任務類型(計算密集型 vs I/O密集型)調整線程池大小。
  • 編寫一個線程池配置示例,模擬高并發訂單處理場景,并說明其優化邏輯。

參考答案:

  • 線程池核心參數:

    • corePoolSize:核心線程數,常駐線程數量。
    • maximumPoolSize:最大線程數,任務激增時的擴展上限。
    • keepAliveTime:空閑線程存活時間。
    • workQueue:任務隊列,用于緩沖等待執行的任務。
    • threadFactory:線程工廠,自定義線程名稱或優先級。
  • 線程池大小計算公式:

    • 計算密集型線程數 = CPU核心數 + 1
    • I/O密集型線程數 = CPU核心數 × (1 + 平均等待時間/平均工作時間)
  • 訂單處理線程池示例:

    // 高并發訂單處理場景:I/O密集型任務(如遠程服務調用)
    int corePoolSize = Runtime.getRuntime().availableProcessors() * 2;
    ExecutorService executor = new ThreadPoolExecutor(corePoolSize,corePoolSize * 2,60L, TimeUnit.SECONDS,new LinkedBlockingQueue<>(1000),new ThreadFactoryBuilder().setNameFormat("order-pool-%d").build(),new ThreadPoolExecutor.CallerRunsPolicy() // 拒絕策略:由調用線程處理
    );
    
  • 優化邏輯:

    • 使用有界隊列(LinkedBlockingQueue)防止內存溢出。
    • 通過拒絕策略(CallerRunsPolicy)避免任務丟失。
    • 監控線程池狀態(如ThreadPoolTaskExecutorgetTaskCount())。

3. 數據庫與SQL優化

題目:

  • 請列舉數據庫查詢性能優化的常見手段,并說明索引的優缺點。
  • 編寫一個SQL查詢示例,模擬訂單分頁查詢的性能瓶頸,并說明如何優化。

參考答案:

  • 數據庫優化手段:

    • 索引優化:在頻繁查詢的字段(如主鍵、外鍵)創建索引。
    • 分庫分表:水平分表(如按時間分片)或垂直分庫(按業務模塊拆分)。
    • 連接池配置:使用HikariCP減少連接創建開銷。
    • 批量操作:使用batchInsert減少網絡往返。
    • 讀寫分離:主庫寫入,從庫讀取,降低主庫壓力。
  • 索引的優缺點:

    • 優點:加速查詢,減少全表掃描。
    • 缺點:增加寫入開銷,占用額外存儲空間。
  • 分頁查詢優化示例:

    -- 傳統分頁(性能差)
    SELECT * FROM orders WHERE user_id = 1 ORDER BY create_time DESC LIMIT 10 OFFSET 100000;-- 優化方案:基于游標的分頁(適用于有序數據)
    SELECT * FROM orders 
    WHERE user_id = 1 AND create_time < '2025-06-16' 
    ORDER BY create_time DESC 
    LIMIT 10;
    
  • 優化邏輯:

    • 避免OFFSET在大數據量下的性能問題。
    • 利用上次查詢的create_time作為游標條件。

4. 緩存策略(Redis & 本地緩存)

題目:

  • 請說明Redis緩存穿透、擊穿、雪崩的解決方法,并編寫一個本地緩存(如Caffeine)的代碼示例。
  • 描述如何設計一個高并發場景下的緩存預熱策略。

參考答案:

  • 緩存問題與解決方案:

    • 緩存穿透:惡意查詢不存在的數據 → 布隆過濾器攔截非法請求。
    • 緩存擊穿:熱點數據過期 → 互斥鎖(Redis.setnx)或永不過期策略。
    • 緩存雪崩:大量緩存同時失效 → 隨機過期時間 + 熔斷降級(如Hystrix)。
  • 本地緩存示例(Caffeine):

    // 使用Caffeine構建本地緩存,最大條目數1000,過期時間10分鐘
    Cache<String, Object> cache = Caffeine.newBuilder().maximumSize(1000).expireAfterWrite(10, TimeUnit.MINUTES).build();public Object getData(String key) {return cache.get(key, k -> fetchFromDB(k)); // 命中緩存或回源
    }
    
  • 緩存預熱策略:

    • 定時任務預熱:在業務低峰期加載熱點數據到緩存。
    • 冷啟動預熱:服務啟動時批量加載核心數據(如商品庫存)。
    • 監控驅動預熱:根據歷史訪問日志動態加載數據。

5. 前端性能優化

題目:

  • 請列舉前端性能優化的常見手段,并說明CDN和HTTP/2的作用。
  • 編寫一個代碼示例,模擬資源加載優化(如懶加載、資源合并)。

參考答案:

  • 前端優化手段:

    • 減少HTTP請求:合并CSS/JS文件,使用CSS Sprites。
    • 資源壓縮:Gzip壓縮HTML/CSS/JS,WebP格式圖片。
    • 懶加載:延遲加載非首屏資源(如圖片、組件)。
    • CDN加速:將靜態資源分發到全球節點,減少網絡延遲。
    • HTTP/2:多路復用、頭部壓縮,減少請求延遲。
  • 資源加載優化示例:

    <!-- 圖片懶加載 -->
    <img src="placeholder.jpg" data-src="image.jpg" class="lazyload"><!-- 動態加載腳本 -->
    <script>function loadScript(src) {const script = document.createElement('script');script.src = src;script.async = true;document.head.appendChild(script);}window.addEventListener('scroll', () => {if (isInViewport('.lazyload')) {loadScript('main.js');}});
    </script>
    
  • CDN與HTTP/2作用:

    • CDN:通過就近節點提供靜態資源,降低延遲。
    • HTTP/2:支持并行加載資源,減少TCP連接數,提升頁面加載速度。

6. 異步處理與消息隊列

題目:

  • 請說明異步處理的優勢,并描述如何使用消息隊列(如Kafka)優化系統性能。
  • 編寫一個Spring Boot中使用@Async注解的代碼示例。

參考答案:

  • 異步處理優勢:

    • 解耦業務流程(如訂單創建與短信通知)。
    • 提升響應速度(避免同步阻塞)。
    • 平滑流量高峰(削峰填谷)。
  • 消息隊列優化場景:

    • Kafka:用于日志收集、訂單異步處理,支持高吞吐量。
    • RabbitMQ:用于實時任務(如支付通知)。
  • Spring Boot異步示例:

    @Configuration
    @EnableAsync
    public class AsyncConfig {@Bean(name = "taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(4);executor.setMaxPoolSize(8);executor.setQueueCapacity(100);executor.setThreadNamePrefix("async-pool-");executor.initialize();return executor;}
    }@Service
    public class AsyncService {@Async("taskExecutor")public void sendNotification(String message) {// 模擬耗時操作try {Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}System.out.println("Sent: " + message);}
    }
    
  • 使用場景:

    • 用戶注冊后發送郵件/短信。
    • 日志記錄、數據統計等后臺任務。

7. 微服務性能優化

題目:

  • 請說明微服務架構中的常見性能瓶頸,并描述如何通過服務治理(如熔斷、限流)優化性能。
  • 編寫一個Resilience4j熔斷器的代碼示例。

參考答案:

  • 性能瓶頸與治理:

    • 服務依賴鏈過長:引入分布式追蹤(如SkyWalking)。
    • 雪崩效應:熔斷(Hystrix/Resilience4j)隔離故障服務。
    • 突發流量:限流(令牌桶算法)保護核心服務。
  • Resilience4j熔斷器示例:

    // 配置熔斷器(失敗率閾值50%,最小請求數10)
    Resilience4jConfig config = Resilience4jConfig.custom().failureRateThreshold(50).minimumNumberOfCalls(10).waitDuration(10, TimeUnit.SECONDS).build();// 應用熔斷器
    @Bean
    public CircuitBreaker circuitBreaker(CircuitBreakerConfig config) {return CircuitBreaker.of("orderService", config);
    }@Service
    public class OrderService {@CircuitBreaker(name = "orderService", fallbackMethod = "fallback")public String getOrderDetails(String orderId) {// 調用遠程服務return restTemplate.getForObject("http://order-service/" + orderId, String.class);}public String fallback(Throwable t) {return "Fallback response for order details";}
    }
    
  • 優化邏輯:

    • 當失敗率超過閾值時,熔斷器打開,直接返回降級響應。
    • 結合限流(RateLimiter)防止突發流量壓垮服務。

總結

以上題目覆蓋了Java性能優化的核心領域,包括JVM調優、高并發處理、數據庫優化、緩存策略、前后端資源加載、異步處理及微服務治理。通過這些問題,可以全面評估候選人對性能瓶頸的分析能力、優化手段的應用經驗以及實際編碼能力。

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

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

相關文章

火山引擎TTS使用體驗

文章目錄 前言1. 簡介1.1 能力體驗1.2 功能特性1.3 音色列表1.4 收費情況 2. 開啟服務2.1 創建應用2.3 使用服務介紹 3.Websocket接入演示3.1 編寫demo3.2 代碼解釋3.4運行demo 4. 參考鏈接 前言 語音合成TTS&#xff08;text to Speech&#xff09;是我覺得后續開發產品所不可…

Django中使用流式響應,自己也能實現ChatGPT的效果

最近在研究ChatGPT的時候&#xff0c;想通過openai提供的接口使國內用戶也可以無限制訪問&#xff0c;于是打算基于django開發一款應用。頁面的渲染也得想ChatGPT一樣采用流式響應&#xff0c;django中StreamingHttpResponse是支持流式響應的一種方式。 django 代碼 class Ch…

Python Redis 簡介

Redis 是一個高性能的內存鍵值數據庫&#xff0c;支持多種數據結構&#xff08;字符串、列表、哈希、集合等&#xff09;&#xff0c;常用于緩存、消息隊列和實時數據處理。Python 通過 redis-py 庫與 Redis 交互。 核心功能 內存存儲&#xff1a;數據存儲在內存中&#xff0c…

mac安裝whistle代理抓包工具(支持mock)

工具地址&#xff1a;https://wproxy.org/whistle/ 1、 安裝nodejs環境 參考方法&#xff1a;https://github.com/nvm-sh/nvm 1&#xff09;安裝 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash如圖&#xff0c;安裝成功 2&#xff09;…

基于 mydumper 實現 MySQL 定期全量備份、恢復方案

一、Mydumper 工具介紹 mydumper 是一款社區開源的邏輯備份工具,由 C 語言編寫,與 MySQL 官方提供的 mysqldump 相比,它具有更高的性能和更多的功能,例如: ? 支持多線程導出數據,速度更快; ? 支持一致性備份; ? 支持將導出文件壓縮,節約空間; ? 支持多線程恢復;…

C++中,std::async 一個用于異步編程的工具

在C中&#xff0c;std::async 是一個用于異步編程的工具&#xff0c;它允許你在一個單獨的線程中執行任務&#xff0c;并返回一個 std::future 對象&#xff0c;通過這個對象可以獲取任務的結果或者檢查任務的狀態。 基本用法1 lambda 表達式 #include <iostream> #incl…

【Linux驅動開發 ---- 4_驅動開發框架和 API】

Linux驅動開發 ---- 4_驅動開發框架和 API 目錄 Linux驅動開發 ---- 4_驅動開發框架和 API&#x1f3af; 目標&#xff1a;&#x1f4cc; 1. Linux 設備模型&#xff08;Linux Device Model&#xff09;**設備模型的核心概念**&#xff1a; &#x1f4cc; 2. 設備樹&#xff08…

實景VR展廳建設流程

實景VR展廳&#xff1a;建設流程、用途、案例與未來發展 隨著虛擬現實&#xff08;VR&#xff09;技術的發展&#xff0c;實景VR展廳作為一種創新的展示方式&#xff0c;正在各個領域得到廣泛應用。實景VR展廳提供沉浸式的體驗&#xff0c;豐富展示內容和形式&#xff0c;為觀…

android下拉欄添加媒體音量調節

參考下拉欄的屏幕亮度調節&#xff0c;添加媒體音量調節。 平臺信息&#xff1a; MSM8909.LA.3.1.2_AOSP PLATFORM_VERSION9 BUILD_IDPKQ1.190903.001 效果圖 布局文件與音量圖標 Index: frameworks/base/packages/SystemUI/res/layout/quick_settings_media_volume_dialog.x…

VS Code 配置ROS2開發環境常見問題記錄

1、ctrlshiftp后找不到C/C: Edit configurations 安裝或重裝C插件。 參考鏈接&#xff1a; 搜索C/C: Edit configurations顯示no matching command問題https://www.cnblogs.com/hunghau/p/17195622.html 2、ROS2 API無法轉到定義 &#xff08;1&#xff09;在c_cpp_proper…

Docker Desktop搭建RocketMQ的完整教程

Docker Desktop搭建RocketMQ圖文教程 1. 準備工作 已安裝Docker Desktop&#xff08;本地安裝方法參考上一節教程&#xff09;。需部署三個組件&#xff1a;NameServer、Broker、Console&#xff08;管理界面&#xff09;。 2. 創建目錄和文件 在任意盤&#xff08;如D盤&am…

算法35天|1049. 最后一塊石頭的重量 II、 494. 目標和、 474.一和零

1049. 最后一塊石頭的重量 II 題目 思路與解法 class Solution { public:int lastStoneWeightII(vector<int>& stones) {int sum 0;for(int i0;i<stones.size();i){sum stones[i];}// 問題轉換為&#xff1a;// 先求得&#xff0c;背包容量為target時&#x…

AWS S3拒絕非https的請求訪問

問題 aws s3桶&#xff0c;安全要求必須強制使用ssl加密訪問&#xff0c;即https。需要添加一個策略拒絕所有不是https的訪問s3桶請求。 解決 在對于桶添加相關拒絕策略即可。如下&#xff1a; {"Version": "2012-10-17","Statement": [{&qu…

GitLab CVE-2025-4278 安全漏洞解決方案

本分分享極狐GitLab 補丁版本 18.0.2, 17.11.4, 17.10.8 的詳細內容。這幾個版本包含重要的缺陷和安全修復代碼&#xff0c;我們強烈建議所有私有化部署用戶應該立即升級到上述的某一個版本。對于極狐GitLab SaaS&#xff0c;技術團隊已經進行了升級&#xff0c;無需用戶采取任…

Async、await是什么?跟promise有什么區別?使用的好處是什么

Async/Await 與 Promise 的深度解析 一、基本概念 1. Promise Promise 是 ES6 引入的異步編程解決方案&#xff0c;表示一個異步操作的最終完成&#xff08;或失敗&#xff09;及其結果值。 function fetchData() {return new Promise((resolve, reject) > {setTimeout(…

MySQL數據庫中所有表的空間占用與行數統計

查看某個數據庫中所有表的空間與行數統計 SELECT TABLE_NAME AS 表名,TABLE_ROWS AS 行數,ROUND(DATA_LENGTH / 1024 / 1024, 2) AS 數據大小(MB),ROUND(INDEX_LENGTH / 1024 / 1024, 2) AS 索引大小(MB),ROUND((DATA_LENGTH INDEX_LENGTH) / 1024 / 1024, 2) AS 總占用空間(…

el-upload 點擊上傳按鈕前先判斷條件滿足再彈選擇文件框

解決思路&#xff1a; 先寫一個上傳按鈕&#xff0c;點擊上傳按鈕后判斷條件是否滿足&#xff0c;滿足則顯示上傳組件并使用ref來控制點擊事件&#xff0c;隱藏自身。 注&#xff1a;上傳成功或者上傳失敗時或者上傳前判斷條件添加不滿足return將this.isShow true 代碼部分…

django ReturnDict 如何修改內容

在Django中&#xff0c;QuerySet 對象通常用于從數據庫中檢索數據&#xff0c;并且可以被轉換為各種格式&#xff0c;例如字典。如果你想修改QuerySet返回的結果&#xff08;例如&#xff0c;將其轉換為dict&#xff09;&#xff0c;你可以在查詢執行后進行操作。這里有幾種常見…

密室出逃消消樂小游戲微信流量主小程序開源

這個密室出逃消消樂小游戲采用了微信小程序的標準目錄結構&#xff0c;包含以下核心功能&#xff1a; 游戲界面&#xff1a;6x6 的網格布局&#xff0c;隨機生成不同類型的物品 游戲邏輯&#xff1a;交換相鄰物品&#xff0c;消除三個或以上相同類型的物品 計分系統&#xff1a…

SmartMediaKit實戰經驗總結之高穩定、低延遲、強兼容

在萬物互聯與數字化加速融合的今天&#xff0c;音視頻實時通信技術正成為各行業發展的核心驅動力。從教育到工業、從安防到遠程醫療&#xff0c;毫秒級低延遲的音視頻交互體驗已成為新一代實時系統的“生命線”。而在這個領域&#xff0c;視沃科技旗下的大牛直播SDK&#xff08…