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

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

为何 Java 码农在折腾 JVM 上乐此不彼?
这是什么癖好?
8960 次点击
所在节点    Java
92 条回复
yuk1no
2020-12-15 15:05:20 +08:00
大概是.net 没人用吧🐶
MinQ
2020-12-15 15:05:51 +08:00
@Jooooooooo JVM 需要调优是因为它是 VM 啊,代码是在 VM 上运行的。CLR 又不是 VM,代码先被转换成 MSIL 中间语言,然后就被 JIT 编译器编译成当前平台的字节码了,直接跑在操作系统层面上
micean
2020-12-15 15:06:23 +08:00
绝大部分 java 码农也不关心 jvm 性能啊。。。。。。最多也就查个内存泄漏
enihcam
2020-12-15 15:07:18 +08:00
@yuk1no 有没有人用是另外一个独立的问题。
liudaolunhuibl
2020-12-15 15:08:28 +08:00
感觉就是八股。。实际上用到过 jvm 调优的人很少的,最多就是 dump 下线程或者堆,然后 jvm 参数就是换个垃圾回收器加大一下堆大小仅此而已,而且这些事情一般都是团队的“架构师”做,一般的 CRUD BOY 是接触不到的。面试的时候背就完事儿了
FreeEx
2020-12-15 15:11:13 +08:00
如果互黑的话就是因为 .Net 的网站用户量太小。
认真点就是高级工程师都需要知道如何优化系统运行效率,排查系统占用高,响应慢的原因,所以 Java 工程师就需要对 Jvm 有深刻的了解。
.NET 肯定也是需要的,不然你怎么排查?
enihcam
2020-12-15 15:14:06 +08:00
@FreeEx 下 dump 、看 profiler 、设断点。
FreeEx
2020-12-15 15:15:23 +08:00
@enihcam 前俩和 Java 基本一致,不过线上还能打断点的?
MinQ
2020-12-15 15:16:17 +08:00
@liudaolunhuibl 起码 OOM 还是要看一眼的,不是无脑加堆就完事了

@FreeEx dot net 当然也需要,profiler 就是帮忙干这事的,但 dot net 不太会出现由于 CLR 参数设置不合理导致出问题,一般都是自己的问题或者 framework 中有 bug
liudaolunhuibl
2020-12-15 15:18:11 +08:00
@MinQ 我没说吗?最多就是 dump 下线程或者堆
enihcam
2020-12-15 15:18:14 +08:00
@FreeEx 远程 attach process,指定源文件和 pdb 就行了。
Rwing
2020-12-15 15:18:40 +08:00
知乎上有人问过了,建议看看大佬的回答 https://www.zhihu.com/question/52900051
FreeEx
2020-12-15 15:19:35 +08:00
@enihcam 我的意思是这样影响面太大,会造成普通用户的请求全部挂起。
enihcam
2020-12-15 15:22:28 +08:00
@FreeEx 起 pod 接活啊,你挂住又不是全部无态实例。
FreeEx
2020-12-15 15:42:46 +08:00
@MinQ 当你需要在某一个操作系统运行多个程序,又不想某一个程序把内存占满的情况下是需要限制程序使用的内存的,Jvm 可以帮你限制。当然一台机器一个程序完全不用限制。
当你想要压榨机器的性能,因为在 Jvm 里面类,方法,变量,对象等元素是存在不同的地方的,可以根据当前项目的实际情况调整每一个地方的大小,这样便可以增加程序可处理的请求。当然,钱多加机器可解。

这些在开发的时候基本上无需考虑,算是技术经理才需要想的问题吧。
FreeEx
2020-12-15 15:45:43 +08:00
@enihcam 线上打断点这个操作无论如何操作,都只能说是🐂🍺,哈哈。
a719031256
2020-12-15 15:46:56 +08:00
面试需要呗,反正我遇到的项目从开发到上线再到运营就没遇到 jvm 调优
jvm 这东西默认值就能满足 95%的需求了
MapHacker
2020-12-15 15:50:55 +08:00
把大佬的回答直接粘过来吧

作者:RednaxelaFX
链接: https://www.zhihu.com/question/52900051/answer/132583244
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

假定题主说的是下面三个层面的调优的头两种情况:
1.对 VM 的配置参数调优(例如 GC 参数)
2.对应用程序自身的代码调优
3.对 VM 自身的实现调优

(2)的话无论什么语言什么环境都好,追求性能的人肯定都有在做。Java 和.NET 都有好用的 profiler 可以帮助这方面的调查和调优。有时候参数调优还不够的地方,也只能自己改自己的应用代码来解决问题了。请看一个经典案例: https://samsaffron.com/archive/2011/10/28/in-managed-code-we-trust-our-recent-battles-with-the-net-garbage-collector

(3)的话,CLR 还没开源的时候,也无从调起。倒是有不少人给 Mono 贡献改进性能的 patch,也算是广义上“.NET”的 VM 实现层面调优吧。在 CoreCLR 开源后,也有不少人给 CoreCLR 贡献各种 patch 呢,包括“调优”。.NET 码农们以前时不时会中招的一种地方是程序进入 GC 的耗时( time-to-GC ),也就是从 CLR 说“我要开始做 GC 了”到“真正开始做 GC”之间的耗时。这里主要开销来自请求所有应用线程暂停( SuspendEE ),这些线程要多久才完成对该请求的响应。听说过这个过程中会发生“250ms 的倍数的等待时间”不?请跳传送门: http://blogs.microsoft.co.il/sasha/2009/07/31/garbage-collection-thread-suspension-delay-250ms-multiples/ 像这种问题就是不进到 VM 内部做修改的话无法解决的。

(1)的话,其实就算当年 CLR 还没开源的时候,CLR 也是有调优参数可以配置的呢。最经典的就是选择试用 Workstation GC ( WKS GC )或者 Server GC ( SVR GC )。见过<gcServer>参数不?后来可以配置使用 Concurrent GC 、Background Workstation GC 、Background Server GC 等。用户还可以在代码里通过 GCSettings.LatencyMode 属性来影响 GC 的行为。看,调优参数列表之一: https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/?redirectedfrom=MSDN

不过 CLR 跟 HotSpot VM 在配置上有一个显著的区别,就是 CLR 不需要用户指定一个“GC 堆的最大大小”。这跟 CLR 的 GC 堆的基础设计思路有关系。HotSpot VM 的 GC 堆一定要使用连续的虚拟地址空间。VM 在启动的时候会一口气 reserve GC 所需要的整个地址空间,然后再按需 commit 。-Xmx 会参与到 GC 堆最大大小的计算中。CLR 的 GC 堆则是分段式的( segemented ),GC 堆所用的空间会一个个 segment 分配,用满了一个再去分配一个新的; segment 不需要在连续的地址空间上。这样 GC 堆可以按需自动增长或者缩减,可以一直增长到耗尽虚拟地址空间或者达到配额。CLR 这种分段式 GC 堆的好处是,在 Windows 上,特别是 32 位 Windows 上,虚拟地址空间中用户程序可以用的部分是比较零碎的,想要用到尽就不能对“连续的地址空间”有太多要求,这种条件下 CLR 跑在 Windows 上就可以充分利用资源。而且这样一来,用户就不用头疼实现想好要配置多大的堆给 CLR 用了。反正它需要用多少会自己去增长。这用户体验就比绞尽脑汁想个好-Xmx 要爽。这种做法的坏处…怎能没有坏处呢。坏处也有若干。其中一个就是在这样的堆上实现的分代式 GC 的 write barrier 效率会比 HotSpot 那种用连续地址空间的要差一些。而且 segmented heap 实现起来也稍微复杂一些。
yagao0o
2020-12-15 15:52:16 +08:00
举个稍微有点偏的例子:
你开车,每次都加满油,轮胎买来是啥就是啥,也就这么开下去了。(同时你想换胎和加多少油你其实每次也可以自己决定,车出厂已经调整到针对大部分情况下最佳的状态了)
人家开 F1,根据不同的场景,要换不同的胎,油也是看情况加多少。
当然.NET 和 Java 没这么大差距,
MinQ
2020-12-15 15:54:41 +08:00
@FreeEx 现场打断点不稀奇,我还见过当场停服务当场改代码当场部署的,虽然是工控行业就是(狗头)

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

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

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

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

© 2021 V2EX