针对Java程序在4核8G内存的服务器上的配置,以下是一些关键建议和优化方向:
1. JVM内存分配
- 堆内存(Heap):建议设置为总内存的50%~70%(即4G~5.5G),避免过大导致系统资源耗尽。
-Xms4g -Xmx4g # 初始和最大堆内存设为4G(根据实际需求调整) - 非堆内存:为方法区(Metaspace)、线程栈等预留空间:
-XX:MaxMetaspaceSize=256m # 元空间上限 -Xss256k # 每个线程栈大小(根据线程数调整)
2. 垃圾回收(GC)调优
-
GC算法选择:
- 低延迟场景:G1 GC(默认JDK9+)或 ZGC/Shenandoah(JDK11+)。
-XX:+UseG1GC # 启用G1垃圾回收器 -XX:MaxGCPauseMillis=200 # 目标最大停顿时间(毫秒) - 高吞吐量场景:Parallel GC。
-XX:+UseParallelGC
- 低延迟场景:G1 GC(默认JDK9+)或 ZGC/Shenandoah(JDK11+)。
-
其他参数:
-XX:+HeapDumpOnOutOfMemoryError # OOM时生成堆转储 -XX:SurvivorRatio=8 # Eden与Survivor区比例
3. 线程池配置
- Web服务器(如Tomcat):
<!-- Tomcat的server.xml --> <Connector executor="tomcatThreadPool" maxThreads="200" # 根据QPS和CPU核数调整(建议4核设置200~400) minSpareThreads="20" acceptCount="100" # 等待队列长度 /> - 自定义线程池:避免无限制创建线程(推荐线程数 ≈ CPU核数 * (1 + 等待时间/计算时间))。
4. 系统与容器优化
- Linux内核参数:
# 文件描述符限制 ulimit -n 65535 # 减少TCP TIME_WAIT(高并发场景) sysctl -w net.ipv4.tcp_tw_reuse=1 - 容器(如Docker):明确限制资源,避免争抢:
resources: limits: cpu: "4" memory: "8Gi"
5. 监控与诊断
- 工具:
jstat、jmap、jstack(JDK自带)- VisualVM、Arthas(在线诊断)
- Prometheus + Grafana(监控JVM指标)。
- 关键指标:
- CPU使用率(单核不超过80%)
- GC频率/耗时(Young GC < 50ms,Full GC < 1s)
- 堆内存利用率(避免长期>80%)。
6. 其他建议
- 缓存优化:堆外缓存(如Redis)减轻GC压力。
- 日志级别:生产环境避免DEBUG日志,使用异步日志(如Log4j2 AsyncAppender)。
- 代码层面:减少大对象创建,避免内存泄漏(如未关闭的流)。
示例启动参数
java -server -Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxMetaspaceSize=256m
-XX:MaxGCPauseMillis=200 -XX:+HeapDumpOnOutOfMemoryError
-jar your-application.jar
根据实际应用特点(如高并发、计算密集型等),可能需要进一步调整。建议通过压测(如JMeter)验证配置效果。
轻量云Cloud