为什么 Java 要码农操心 JVM 性能调优?

2020-12-15 14:48:38 +08:00
 enihcam
.Net Core 团队官方表示 CLR 任何时候都是最优性能状态。而 Java 需要经常人肉调优 JVM,居然还做成了面试题。

为何 Java 码农在折腾 JVM 上乐此不彼?
这是什么癖好?
8971 次点击
所在节点    Java
92 条回复
whileFalse
2020-12-15 15:59:36 +08:00
我同意 LZ 的观点。
我是一个运维。在测试环境中,我用一台机器跑几十个 Java 微服务。于是我有一个很简单的需求:让这些服务和平共处,不要干爆内存或 CPU 。我希望简简单单地将单个微服务限制为使用 1G 内存。至于这些内存怎么分配,是你 JVM 自己的问题。

然而 JVM 做不到。我要让 JVM 不超过 1G 内存,那我得把 Xmx 设置为 512m,然后一小撮 VM 逼近 1G 内存,大部分 VM 跑 700M 。这些配置必须小心调教,不然有的服务就会疯狂 GC,干爆 CPU 。如果不小心把限制设的太宽,VM 们还会干爆内存,导致部分 VM 崩溃然后不停重新启动,于是服务器就挂了。
cheng6563
2020-12-15 16:05:23 +08:00
设计思路问题吧,为了提高性能,JVM 的思路是拿了就不还,那么码农就要考虑到底给你多少。
FreeEx
2020-12-15 16:05:51 +08:00
@MinQ 互联网行业不能这样玩的,停服更新在外界看来就是实力不足的表现,如果是需要线上打断点调试代码,这...肯定是不被允许的。
enihcam
2020-12-15 16:09:38 +08:00
@FreeEx 实际生产环境确实不允许,我只是说可以这么做。
zsl199512101234
2020-12-15 16:09:45 +08:00
说实话,学 java 的都很能说,分布式事务,高可用常常挂在嘴边的
FreeEx
2020-12-15 16:09:51 +08:00
@whileFalse .NET 连给你限制内存的机会都不给。。。你这个场景更需要使用 VM 或者 docker 来隔离
zsl199512101234
2020-12-15 16:09:58 +08:00
不然不好找工作
FreeEx
2020-12-15 16:11:46 +08:00
@zsl199512101234 说实话,分布式事务能不用就别用,高可用这个没得黑,都得做。
whileFalse
2020-12-15 16:12:26 +08:00
@FreeEx #46 我是用 Docker 隔离的。然而参数调不好的话他自己总是炸呀。一个服务老重启很烦呀。
Suclogger
2020-12-15 16:24:28 +08:00
选了 java,只能一条路走到黑了。建议学 rust
mosliu
2020-12-15 16:38:29 +08:00
个人感觉,普通跑个 java 服务,基本不用太考虑调优问题,设定个-Xmx 就足够了,除非代码稀烂,内存泄漏等等的,那些当我没说

一般用到 jvm 调优的,大都是大数据,分布式的东西,非常吃内存的,经常有 GC 的。

通过调优,可能本来一台服务器 能跑 4 个实例的,内存就有些争用的,跑到 6 个了 或者原本 gc 到了 s 级的下降回 ms 级。
调优不是比烂,而是让好的更好。
深入到 GC 层去理解系统怎么执行的,是一个通过调优去理解 JVM,然后最终反馈到之后的代码编写方式的事情。
wanguorui123
2020-12-15 16:40:08 +08:00
我想对 NET 调优,可是 GC 模块不开放那么多参数给我调试
micean
2020-12-15 16:42:12 +08:00
@whileFalse

xmx 只是堆的大小
一台服务器跑几十个 vm 贼慢,已经不是能调优的了
zsl199512101234
2020-12-15 16:47:32 +08:00
@FreeEx 分布式事务是最恶心的了,要注意哪些地方得加锁,不加锁会很麻烦
nightwitch
2020-12-15 16:55:55 +08:00
简单的逻辑推论
1.Net Core 团队官方表示 CLR 任何时候都是最优性能状态
2..Net Core 团队提供了大量的选项用于在运行期调整 GC 的设置,以帮助程序员提高 App 的峰值性能( https://docs.microsoft.com/en-us/dotnet/core/run-time-config/garbage-collector)。

如果 1 成立,2 是行为艺术么?
RipL
2020-12-15 17:12:51 +08:00
楼上那些 说 开发基本上用不到 jvm 调优的 不知道咋想的,不知道是项目 low 流量小,还是自己根本就不去深究一个问题的根源。
RipL
2020-12-15 17:14:50 +08:00
@zsl199512101234 分布式事务和高可用 都能被黑 。。。。。。
leonardyang
2020-12-15 17:20:28 +08:00
@FreeEx 虽然这么做确实一般不合规,但是从实现而言 java 也能啊,不就是 remote debug 吗
FreeEx
2020-12-15 17:22:46 +08:00
@whileFalse 你应该是没有限制 docker 的 cpu 和内存吧?如果你们是使用 springcloud 那一套的话,限制了 docker,Java 程序就不再需要限制了。
coderwl
2020-12-15 17:22:55 +08:00
Java 作为使用最多的业务开发语言,大部分的云服务上都跑着 Java 的服务,这时候 JVM 吃内存的弊端就显现出来了,各个大厂都有对 JVM 做魔改,针对自己的业务特点来做优化,节省成本,Oracle 也知道这点,搞了个 GraalVM,把 Java 编译为 native 执行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/735661

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX