我们做 Java 开发,一项必不可少的技术就是优化虚拟机参数,比如使用什么垃圾收集器,堆内存大小设置、栈内存大小设置、新生代老年代内存比例,GC 最大时间设置诸如此类,算是 java 开发相对高级的技能了。
之前在开发项目的时候,我一直在研究,用什么垃圾收集器,是 parallel 还是 CMS 或者用 G1 ,不同的垃圾收集器对内存有不同的要求,因此运行性能不一样,比如要高吞吐量就用 parallel ,内存小低延迟就用 CMS ,内存大低延时就用 G1 ,ZGC 不能用,因为 jre 版本低,哎,真纠结。
前几天项目要上线,跟运维申请机器,运维直接给一台 64GB 的。卧槽,这么大内存,之前精心研究的设置都白费了,反正内存足够,把堆内存设大一点,用 G1 不就完事了,还研究其他收集器,有个球用。
1
haikea 2023-06-18 15:45:57 +08:00
低端开发者请教一下,平常开发中真的要研究这么深,考虑用什么垃圾收集器么
|
2
dw2693734d 2023-06-18 15:47:26 +08:00
开发效率第一,性能优化其次
|
3
chendy 2023-06-18 15:49:17 +08:00
xmx xms pretouch random fileencode 完事
垃圾回收器?容我把屎山扶好再碰吧 |
4
Mithril 2023-06-18 15:49:59 +08:00 6
你挠破头调个 JVM 配置优化内存使用浪费了一周时间。
如果你月薪 2W 的话,你这一周的工资 ECC 内存都能买上 320G 。你要是花了一个月,内存都能买上 T 。 而且最关键的是,真的有那么多用户要那么多并发吗。。。。 |
5
roundgis 2023-06-18 16:06:07 +08:00 via Android
G1 first
|
6
yty2012g 2023-06-18 16:23:52 +08:00 3
个人浅见:
1 、如果是 JDK8 环境,通常来说 ParaNew+CMS 算是比较万金油的选择。之所以不用 G1 ,只是因为 G1 在 jdk8 下还存在一些隐患,极端情况 Full GC 退化成单线程。ES 的配置文档也是建议 JDK10 以下,不建议配置 G1 2 、如果是 JDK11+环境,通常来说就选择 G1 就 ok 啦。需要关注下 MaxGcPauseMillis 参数,不要设置的太小了,按照实际来。而且随着 JDK 版本的升级,jdk11-14-15-17 ,G1 的性能越来越好,可以说 jdk17 下的 G1 真的强无敌,吞吐量、延迟达到了非常棒的平衡。 3 、关于 ZGC 。我在 jdk17 的生产环境测试过 zgc ,在 16g 的堆下,基本 gc 停顿时间<1ms 。但是,通过火焰图观察,大概消耗了 10%的吞吐量。所以看你的需求,如果可以舍弃一些吞吐量,那 zgc 也不是不能用。虽然我认为绝大多数的应用 g1 就够用啦 |
7
hello2090 2023-06-18 16:45:51 +08:00 via iPhone
i5 9500 + 8G 内存 java 开发 瑟瑟发抖
|
8
PVXLL 2023-06-18 18:08:13 +08:00 via iPhone 1
百分之 99 的项目都不用关注这些参数直接默认的就行,别浪费时间精力在这上了,别半桶水搞一些负优化。
|
9
felixcode 2023-06-18 18:30:23 +08:00 via Android
64G 内存服务器是低配了,当然,在 V 站 8G 内存足够搞开发,16G 内存用来造火箭都用不完。
|
11
Goooooos 2023-06-18 22:09:41 +08:00
-Xms4g -Xmx4g -XX:+UseG1GC
不够就 Xmx 继续增加,省事 |
12
yty2012g 2023-06-18 22:14:54 +08:00
@pH #10 哈哈哈,主要是 JDK17 下的 G1 真的太棒了,在同样的测试中,G1 对吞吐量的影响大概只有 0.5%。感觉分代的 ZGC 怎么着也得优化几个版本才赶得上了😂
|
13
salmon5 2023-06-18 23:07:32 +08:00
空间换时间,时间换空间;
普通场景 -XX:+UseG1GC ; 延迟要求高场景-XX:+UseZGC |
14
layxy 2023-06-19 08:45:06 +08:00
jvm 调参的前提是你有数据依据,自己压测观察下机器性能和 jvm 的指标,综合决定使用哪个垃圾回收策略以及内存配置,简单粗暴就单机多实例
|
15
pH 2023-06-19 14:01:53 +08:00
@yty2012g 是,不过 ZGC 的 GC 时间实在是太无解了。等 Generational ZGC 迭代几代,Java 的 GC 问题差不多就要停止争论了
|
16
zjq07 2023-06-20 09:32:31 +08:00
是不是想太多了,业务已经到了需要这么精打细算的地步了吗
|
17
julyclyde 2023-06-20 15:39:34 +08:00
难道解决方法不是升级程序去适应 JDK 么
|