Java应用在Debian上的优化策略
选择长期支持(LTS)的OpenJDK版本(如11、17),或根据低延迟需求选择GraalVM(提供高性能JIT编译器和原生镜像功能)。通过Debian官方源或添加OpenJDK PPA源安装,确保版本稳定且支持最新特性:
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-11-jdk # 或openjdk-17-jdk
-Xms(初始堆大小)与-Xmx(最大堆大小)为相同值(如-Xms4g -Xmx4g),避免运行时堆大小动态调整带来的性能波动;根据应用内存需求调整新生代(-XX:NewSize/-XX:MaxNewSize)与老年代比例(-XX:NewRatio,如-XX:NewRatio=3表示新生代占堆的1/4),优化垃圾回收效率。-XX:+UseG1GC):适用于大堆内存(>4GB),平衡吞吐量与低延迟(可设置-XX:MaxGCPauseMillis=200指定最大停顿时间);-XX:+UseZGC):适用于超低延迟场景(停顿时间<10ms),但需Debian内核版本≥4.14;-XX:+UseParallelGC):适用于高吞吐量场景(如批处理任务)。-Xss,如-Xss2m,默认1MB,可根据应用线程数调整,减少内存占用);并行垃圾回收线程数(-XX:ParallelGCThreads)设置为CPU核心数的50%~70%(如-XX:ParallelGCThreads=4),提升垃圾回收效率。String str = new String("test")改为String str = "test"),使用对象池(如数据库连接池、线程池)复用对象。HashMap用于快速查找、ArrayList用于有序列表),避免使用LinkedList(随机访问性能差);选择时间复杂度低的算法(如快速排序代替冒泡排序)。java.util.concurrent包下的并发工具(如ThreadPoolExecutor管理线程、ConcurrentHashMap替代synchronized Map),避免过度同步(如将synchronized方法拆分为细粒度锁)。BufferedReader/BufferedWriter)减少I/O次数;批量处理数据(如JDBC批量插入addBatch()/executeBatch());优先使用NIO(java.nio包)提升高并发场景下的I/O效率。logger.debug("用户ID: {}, 商品ID: {}", userId, productId)),避免字符串拼接带来的性能开销;使用StringBuilder代替+操作符进行字符串拼接(尤其在循环中)。/etc/sysctl.conf文件,优化网络与内存性能:vm.swappiness=10 # 减少系统对交换分区的依赖(值越小,越倾向于使用物理内存)
net.core.somaxconn=65535 # 增加服务器连接队列长度,避免高并发时连接拒绝
net.core.rmem_max=16777216 # 增加接收缓冲区大小
net.core.wmem_max=16777216 # 增加发送缓冲区大小
执行sudo sysctl -p使配置生效。noatime选项挂载文件系统(如/etc/fstab中添加defaults,noatime),避免每次文件读取时更新访问时间,减少磁盘I/O。/etc/default/grub,添加GRUB_CMDLINE_LINUX="default_hugepagesz=1G hugepagesz=1G hugepages=4",更新GRUB并重启系统。-Xloggc:/var/log/java/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps),通过jstat(jstat -gcutil <pid> 1000)或GCViewer工具分析GC日志,找出频繁Full GC或停顿时间过长的问题。