服务公告
S4-8G 跑 Java 应用的 JVM 建议
发布时间:2025-10-17 09:48
Java 应用对内存的占用方式和其他语言不同:JVM(Java 虚拟机)会预先圈地,堆内存一旦设定就长期占着,即便实际对象只用了一小部分。8G 机型上跑 Java,参数怎么给直接影响整机格局,顺云 S4-8G 的场景下重点谈两件事:堆占比和 GC 日志。 堆内存给多少 通行做法是堆大小不超过物理内存的一半,8G 机型即 -Xmx4g 封顶;同机还跑着 MySQL 的场景,建议压到 -Xmx3g,给数据库缓冲池留空间。注意 JVM 实际占用大于堆:元空间、线程栈、直接内存都算在内,再预留两成是合理估计。无论容器还是 systemd 部署,都显式写 -Xmx,不要依赖"默认取四分之一物理内存"的隐式行为,多服务共存时容易互相挤压,出问题时还难以定位是谁超了界。改堆参数属于低风险操作,调整后重点观察两天 GC 日志和接口耗时,无异常再继续下一项。 GC 日志怎么开、怎么读 JDK 8 加 -XX:+PrintGCDetails -Xloggc:/var/log/app/gc.log;JDK 9 以上用 -Xlog:gc*:file=/var/log/app/gc.log:time。拿到日志看两个数:Full GC(全量回收)的停顿时长和发生频率。Minor GC 频繁但每次几十毫秒属正常;Full GC 一天多次且单次秒级停顿,说明堆偏小或有泄漏,先用 jmap -histo 进程号 | head 看对象直方图,定位哪类对象在涨,再对应到具体业务功能去查。日志要配合时间戳看,把 Full GC 的时刻与告警、发布记录对齐,很多偶发停顿其实有规律。 一个常见的参数误区 堆给得越大越保险并不成立。堆远大于日常活跃对象集时,GC 扫描范围变大,单次停顿反而更长,接口毛刺感更明显。日常活跃对象 1G 左右的 Web 应用,堆从 4G 收到 3G,通常不增加 GC 压力,还能给同机数据库腾出空间。判断活跃对象集的大小,看 GC 日志里回收后堆的占用量即可,不需要额外装工具。参数不在多,给对就行。 建议收尾:8G 机型跑 Java 的配置要点是堆不过半、显式声明、日志常开。上线第一周每天扫一眼 GC 日志,比事后救火划算得多,日志文件记得配好轮转,避免日积月累吃满磁盘。上一篇: 预制化模块机房的兴起
下一篇: 云主机防御能力升级说明