Java网络编程性能优化

1.网络编程性能优化基础

1. 性能关键指标

指标

描述

优化目标

响应时间

从请求到响应的总时间

降低到毫秒级

吞吐量

单位时间内处理的请求数量

提高到每秒数千至数万请求

并发用户数

系统同时处理的用户数量

支持数千至数万并发连接

资源利用率

CPU、内存、网络带宽的使用率

保持在合理水平避免瓶颈

2. 性能瓶颈分析

▶ 网络应用性能瓶颈层次

2.连接池优化

1. 连接池工作原理

2. HttpClient连接池示例

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;public class HttpClientConnectionPoolExample {private static CloseableHttpClient httpClient;static {// 创建连接池管理器PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();// 设置最大连接数
        cm.setMaxTotal(200);// 设置每个路由的默认连接数
        cm.setDefaultMaxPerRoute(20);// 创建HttpClient并配置连接池
        httpClient = HttpClients.custom().setConnectionManager(cm).evictIdleConnections(30, TimeUnit.SECONDS) // 空闲连接超时时间.build();}public static CloseableHttpResponse execute(HttpUriRequest request) throws IOException {return httpClient.execute(request);}public static void main(String[] args) throws IOException {HttpGet request = new HttpGet("https://example.com");try (CloseableHttpResponse response = execute(request)) {System.out.println("Status code: " + response.getStatusLine().getStatusCode());}}
}

3.异步编程优化

1. 同步与异步对比

▶ 同步处理流程

▶ 异步处理流程

2. CompletableFuture异步处理示例

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class AsyncHttpClientExample {private static final ExecutorService executor = Executors.newFixedThreadPool(10);private static final HttpClient client = HttpClient.newBuilder().executor(executor).build();public static CompletableFuture<String> fetchUrlAsync(String url) {HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).build();return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(response -> {if (response.statusCode() == 200) {return response.body();} else {throw new RuntimeException("HTTP request failed: " + response.statusCode());}}).exceptionally(ex -> {System.err.println("Error fetching URL: " + ex.getMessage());return null;});}public static void main(String[] args) throws IOException, InterruptedException {// 异步获取多个URLCompletableFuture<String> future1 = fetchUrlAsync("https://example.com");CompletableFuture<String> future2 = fetchUrlAsync("https://example.org");// 所有任务完成后执行CompletableFuture.allOf(future1, future2).thenRun(() -> {System.out.println("Both requests completed");System.out.println("Length of response 1: " + (future1.join() != null ? future1.join().length() : 0));System.out.println("Length of response 2: " + (future2.join() != null ? future2.join().length() : 0));
                    executor.shutdown();});// 主线程可以继续执行其他任务System.out.println("Main thread continues...");Thread.sleep(2000);}
}

4.数据缓存优化

1. 缓存策略与位置

▶ 多级缓存架构

2. Caffeine本地缓存示例

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;import java.util.concurrent.TimeUnit;public class CaffeineCacheExample {private static final Cache<String, String> cache = Caffeine.newBuilder().maximumSize(1000)                  // 最大缓存条目数.expireAfterWrite(10, TimeUnit.MINUTES) // 写入后过期时间.refreshAfterWrite(5, TimeUnit.MINUTES) // 写入后刷新时间.build();public static String getData(String key) {// 尝试从缓存获取String value = cache.getIfPresent(key);if (value != null) {return value;}// 缓存未命中,从数据源获取
        value = fetchFromDataSource(key);if (value != null) {
            cache.put(key, value);}return value;}private static String fetchFromDataSource(String key) {// 模拟从数据库或其他数据源获取数据System.out.println("Fetching data from data source for key: " + key);return "Data for " + key;}public static void main(String[] args) {System.out.println(getData("key1"));  // 第一次调用,从数据源获取System.out.println(getData("key1"));  // 第二次调用,从缓存获取System.out.println(getData("key2"));  // 新键,从数据源获取}
}

5.零拷贝技术

1. 传统数据传输流程

硬盘 --> 内核缓冲区 --> 用户缓冲区 --> 内核套接字缓冲区 --> 网络接口

2. 零拷贝数据传输流程

硬盘 --> 内核缓冲区 --> 网络接口

3. Java零拷贝示例

import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;public class ZeroCopyExample {public static void main(String[] args) {try (FileChannel fileChannel = new FileInputStream("large_file.dat").getChannel();SocketChannel socketChannel = SocketChannel.open()) {// 连接到服务器
            socketChannel.connect(new InetSocketAddress("example.com", 8080));// 使用transferTo实现零拷贝long transferred = 0;long size = fileChannel.size();while (transferred < size) {
                transferred += fileChannel.transferTo(transferred, size - transferred, socketChannel);}System.out.println("文件传输完成,总字节数: " + transferred);} catch (IOException e) {
            e.printStackTrace();}}
}

6.性能监控与调优

1. 关键监控指标

类别

指标

工具

系统

CPU 使用率、内存使用率

top, htop, jstat

网络

带宽利用率、连接数

iftop, netstat, ss

JVM

GC 频率、堆内存使用

jstat, jmap, VisualVM

应用

请求响应时间、吞吐量

JMeter, Gatling, Prometheus

7.综合优化示例

1. 优化后的HTTP服务器

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class OptimizedHttpServer {private static final int PORT = 8080;private static final int BUFFER_SIZE = 8192;private static final int THREAD_POOL_SIZE = 100;private final Selector selector;private final ServerSocketChannel serverChannel;private final ExecutorService threadPool;private final ByteBuffer buffer = ByteBuffer.allocateDirect(BUFFER_SIZE); // 直接内存缓冲区public OptimizedHttpServer() throws IOException {
        selector = Selector.open();
        serverChannel = ServerSocketChannel.open();
        serverChannel.configureBlocking(false);
        serverChannel.socket().bind(new InetSocketAddress(PORT));
        serverChannel.register(selector, SelectionKey.OP_ACCEPT);        threadPool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);System.out.println("服务器启动,监听端口: " + PORT);}public void start() {try {while (true) {
                selector.select();Iterator<SelectionKey> keys = selector.selectedKeys().iterator();while (keys.hasNext()) {SelectionKey key = keys.next();
                    keys.remove();if (key.isAcceptable()) {handleAccept(key);} else if (key.isReadable()) {handleRead(key);}}}} catch (IOException e) {
            e.printStackTrace();} finally {try {
                selector.close();
                serverChannel.close();
                threadPool.shutdown();} catch (IOException e) {
                e.printStackTrace();}}}private void handleAccept(SelectionKey key) throws IOException {ServerSocketChannel server = (ServerSocketChannel) key.channel();SocketChannel client = server.accept();
        client.configureBlocking(false);
        client.register(selector, SelectionKey.OP_READ);}private void handleRead(SelectionKey key) {SocketChannel client = (SocketChannel) key.channel();
        threadPool.submit(() -> {try {
                buffer.clear();int bytesRead = client.read(buffer);if (bytesRead == -1) {
                    client.close();return;}                buffer.flip();// 处理HTTP请求(实际应用中应该解析请求并生成响应)String response = "HTTP/1.1 200 OK\r\n" +"Content-Type: text/plain\r\n" +"Content-Length: 12\r\n" +"\r\n" +"Hello World!";ByteBuffer responseBuffer = ByteBuffer.wrap(response.getBytes());while (responseBuffer.hasRemaining()) {
                    client.write(responseBuffer);}} catch (IOException e) {try {
                    client.close();} catch (IOException ex) {
                    ex.printStackTrace();}}});}public static void main(String[] args) {try {OptimizedHttpServer server = new OptimizedHttpServer();
            server.start();} catch (IOException e) {
            e.printStackTrace();}}
}

8.优化总结

技术

适用场景

性能提升点

连接池

频繁创建和销毁连接的场景

减少连接创建开销

异步编程

I/O 密集型应用

提高线程利用率

数据缓存

数据读取频繁且变化不频繁的场景

减少数据获取时间

零拷贝

大文件传输或数据复制场景

减少 CPU 和内存开销

直接内存

频繁进行内存分配和释放的场景

减少 GC 压力

通过合理组合使用这些优化技术,可以显著提高Java网络应用的响应速度和吞吐量,更好地应对高并发场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react native搭建项目

React Native 项目搭建指南 React Native 是一个使用 JavaScript 和 React 构建跨平台移动应用的框架。以下是搭建 React Native 项目的详细步骤&#xff1a; 1. 环境准备 安装 Node.js 下载并安装 Node.js (推荐 LTS 版本) 安装 Java Development Kit (JDK) 对于 Androi…

Redis 容器启动失败Fatal error loading the DB, check server logs. Exiting.的解决方法

❗ 问题分析&#xff1a;Redis 容器启动失败 根据提供的 Redis 启动日志&#xff0c;关键信息如下&#xff1a; &#x1f50d; 模块加载情况 模块名称状态备注RedisCompat✅ 成功search✅ 成功RediSearch 模块timeseries✅ 成功RedisTimeSeries 模块ReJSON✅ 成功bf✅ 成功R…

chrome打不开axure设计的软件产品原型问题解决办法

1、打开原型文件夹&#xff0c;进入到其中的如下目录中&#xff1a;resources->chrome->axure-chrome-extension.crx&#xff0c;找到 Axure RP Extension for Chrome插件。 2、axure-chrome-extension.crx文件修改扩展名.rar&#xff0c;并解压到文件夹 axure-chrome-ex…

Java 各版本核心新特性的详细说明

一、Java 8&#xff08;2014&#xff09;—— 函数式编程的里程碑 1. Lambda 表达式 作用&#xff1a;简化匿名内部类&#xff0c;支持函数式编程。示例&#xff1a;// 传统匿名内部类 Runnable r1 new Runnable() {Overridepublic void run() {System.out.println("He…

【md2html python 将 Markdown 文本转换为 HTML】

测试md文本 md_text """ # title## subtitle\python print("Hello, World!") \- item 1| Header 1 | Header 2 | |----------|----------| | Row 1 Col 1 | Row 1 Col 2 |- item 2> This is a blockquote.### SubsubtitleThis is a paragraph wi…

Prompt Engineering 提示工程介绍与使用/调试技巧

1. 介绍 Prompt Engineering 是一种人工智能&#xff08;AI&#xff09;技术&#xff0c;它通过设计和改进 AI 的 prompt 来提高 AI 的表现。Prompt Engineering 的目标是创建高度有效和可控的 AI 系统&#xff0c;使其能够准确、可靠地执行特定任务。 如果你从来没有使用过Pr…

如何把 Microsoft Word 中所有的汉字字体替换为宋体?

Ctrl H &#xff0c;然后&#xff0c;点击更多&#xff0c;勾选使用通配符&#xff0c;查找内容中填入 [一-龥]{1,}&#xff0c; 这是 Word 通配符匹配汉字的经典写法&#xff08;匹配 Unicode 范围内的 CJK 汉字&#xff09;。 然后&#xff0c; “替换为”留空&#xff0c;点…

CMake从入门到实战:现代C++项目构建指南

CMake从入门到实战&#xff1a;现代C项目构建指南 引言 在跨平台开发成为主流的今天&#xff0c;CMake作为开源构建系统的标杆工具&#xff0c;凭借其跨平台性、灵活性和可扩展性&#xff0c;已成为C/C项目的事实标准。本文将带你系统掌握CMake的核心机制&#xff0c;通过实战…

Web安全渗透之长城杯夺旗赛

Web-Git flag1 扫描WEB目录发现存在Git泄露&#xff08;这里是队友扫的&#xff0c;我这图是拿的我后面扫的截图&#xff0c;所以时间对不上。 使用GitHub - gakki429/Git_Extract: 提取远程 git 泄露或本地 git 的工具拉取泄露代码。 读取到flag&#xff0c;全场一血捏。…

机器学习与深度学习:区别与联系

机器学习与深度学习&#xff1a;区别与联系 在人工智能领域&#xff0c;机器学习和深度学习是两个最热门的概念&#xff0c;它们既相互关联又有所区别。本文将深入探讨这两者的核心差异与内在联系&#xff0c;帮助读者更好地理解它们在实际应用中的定位。 一、基本概念 **机…

Linux TCP与Socket与IO多路复用(Epoll)

目录 一、背景 二、交互流程 2.1 数据流动 2.2 对象之间的关系 三、TCP 3.1 为什么需要三次握手 3.2 三次握手流程 3.3 三次握手后的产物 3.4 TCB 四、Socket 4.1 Java Socket和C Socket 4.2 Socket的本质 4.3 Socket和TCB的关系 4.4 通过文件描述符调用Socket的…

字节跳动旗下火山引擎都覆盖哪些领域

首先&#xff0c;我需要确认火山引擎的主要业务范围。根据之前的资料&#xff0c;火山引擎是字节跳动的企业技术服务平台&#xff0c;可能包括云服务、人工智能、大数据分析等。不过需要更详细的信息&#xff0c;比如具体的产品和服务&#xff0c;覆盖的行业等。 接下来&#x…

如何配置jmeter做分布式压测

问&#xff1a;为何需要做分布式 答&#xff1a;当我们本地机器jmeter进行压测时&#xff0c;单台JMeter机器通常无法稳定生成2000 QPS&#xff08;受限于CPU、内存、网络带宽&#xff09;&#xff0c;本地端口耗尽&#xff1a;操作系统可用的临时端口&#xff08;Ephemeral P…

【算法提升】牛牛冲钻五 最长无重复子数组 重排字符串 one_day

算法提升 1.牛牛冲钻五1.2 解析 2.最长无重复子数组2.1解析 3.重排字符串3.1解析 1.牛牛冲钻五 1.2 解析 后面的数据要根据前面两个的状态来确定&#xff0c;我的做法是使用动态规划的方式 #include<iostream> #include<string> #include<vector> using n…

数学建模MathAI智能体-2025电工杯A题实战

题目&#xff1a; 光伏电站发电功率日前预测问题 光伏发电是通过半导体材料的光电效应&#xff0c;将太阳能直接转化为电能的技术。光伏电站是由众多光伏发电单元组成的规模化发电设施。 光伏电站的发电功率主要由光伏板表面接收到的太阳辐射总量决定&#xff0c;不同季节太阳…

VR 展厅开启一场穿越时空的邂逅​

在文化艺术领域&#xff0c;VR 展厅宛如一扇通往奇妙世界的大门&#xff0c;让观众得以突破时间与空间的枷锁&#xff0c;以一种前所未有的沉浸式体验&#xff0c;与历史文化和艺术作品展开亲密无间的互动。博物馆&#xff0c;作为承载着厚重历史文化的璀璨宝库&#xff0c;长久…

linux中使用make clean重新编译

是的&#xff0c;在编译完成后&#xff0c;你可以通过以下方式清除之前的编译结果并重新编译&#xff1a; 方法 1&#xff1a;直接删除 build 目录&#xff08;推荐&#xff09; 这是最彻底的清理方式&#xff0c;适用于需要完全重新配置或解决构建问题的情况。 # 进入项目根…

【Linux】的火墙管理及优化

目录 iptables与firewalld服务 iptables的三表五链 iptables的安装和启用 iptables命令的格式及常用参数 命令格式 常用参数 编写规则示例 firewalld的域 firewalld的启用 firewalld-cmd命令的常用参数 firewalld的高级规则 firewalld的地址伪装与端口转发 iptable…

古文时空重构:当AI把课本诗词做成4D电影

当青铜编钟声由远及近&#xff0c;AI生成的水墨粒子逐渐凝聚成标题 当苔痕在石阶上悄然蔓延时&#xff0c;你听见刘禹锡笔下的呼吸了吗&#xff1f; 当镜头突然穿透墨迹&#xff0c;3D古卷如星河铺展&#xff01; 当AI把课本诗词做成4D电影&#xff0c;这样的视频流量会不会高…

自动生成图标小程序(iOS)

续上篇《iOS应用程序开发(图片处理器&#xff09;》 这是一个图片浏览器和处理器&#xff0c;增加一些功能&#xff0c;可以自动生成小图标。 (This is a picture viewer and editor.You can add some functions,generate the icon automatically.You can select the object …