JVM那些我们不知道的参数

前言

还是我的Wsocks(不过现在改名SuperEngine了),在兜兜转转了许久之后还是回到了最初的起点。要什么Kotlin Native,要什么Go,要什么GraalVm,都是垃圾,原始的才是最好的。

客户端之痛

JVM的客户端为什么那么少? 我们往往能看到 .net系列,C++甚至是go的客户端但是为什么没有java的客户。个人觉得原因主要在启动速度慢和内存占用高这两个地方。对于服务端来说JVM的启动时间可以忽略不计,而默认的内存策略也不会有太多问题,但是客户端上大家都想要小巧玲珑的类型,JVM就有些不合适了。

JVM内存参数

启动速度是没办法变快了,但是内存还是有很多可以调整的地方。

最大堆内存

-Xmx=Your_size -Xms=Your_size

这是第一个可以加的内存参数,也是最没用的一个。他能限制堆的大小,让gc触发的更加频繁一点,但是往往我们的启动内存就已经超过100M了,这里的设置根本没有效果。

冗余度控制

-XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=10

这行的效果非常好,默认的两个值似乎是50和70,这样内存的浪费就太多了。把两个值调到10之后整体的内存占用一下就少了很多。

最大直接内存

-XX:MaxDirectMemorySize=12m

如果有用像netty这样的框架,那这个设置就比较有用了。

nio缓存

-Djdk.nio.maxCachedBufferSize=262144

跟上面一样,如果使用了nio或者netty的东西,加上这个参数之后可以限制缓存的大小。

小结

JVM的许多默认设置都是以空间换时间的策略,在服务端上这样的策略当然有利于节约CPU资源,但是对于客户端程序来说,本身所需要的CPU就不高,这样的策略在用户看来就是程序占用了大量的内存。