《Java性能优化指南》读书笔记-JVM性能调优具体方法

选择jvm部署模式

应用在部署的时候,是单个jvm实例,还是选择多个实例?该如何选择?

单个jvm实例存在的问题是单点故障。当我们jvm实例出现故障的时候或者我们需要重启或者部署的时候都会影响到应用的可用性,这对于互联网产品初期,对于应用可用性要求不高的应用是可以选择该模式的。

多个jvm实例组成的应用集群。带来的问题有系统结构更加复杂,我们需要配置成为自动故障转移,当一个问题出问题或者在维护的时候,还有别的jvm能够接管服务,从而不影响系统的可用性,如果我们需要多个jvm实例同时提供服务,以增加系统的吞吐量,或者降低单个jvm实例的内存量,系统压力,可以配置成为负载均衡,而多个jvm实例又会消耗更多的系统资源,增加系统的管理成本。

因此对于部署的jvm实例数量建议是适应业务的发展逐步增加实例,不应过早部署复杂的结构,否则会带来很多运维管理上的成本。比如你要排查一个问题的时候,你查看日志由于部署了多个jvm实例,当你无法确定在哪个实例上的时候,则需要查看多个jvm实例,你部署的实例越多则越困难,还有你的代码版本升级还需要发布多个实例,配置文件可能又会有多份,如果你没有足够好的自动化运维管理多实例的工具的话,则你的运维成本会随着jvm实例的数量成线性增长,这种人工成本的增加将变得不可行。


选择jvm运行模式

jvm有两种运行模式:

Client模式特点是启动快、占用内存少、JIT编译器生产代码的速度快,但是代码的允许速度相对更慢。

Server模式则提供了更加复杂的生成代码优化,因此代码的执行速度快,启动慢,占用内存更多。

因此我们在开发和测试环境上选择默认的Client模式,在生产环境上一般使用Server模式。

jvm启动参数中添加-server即可开启Server模式。

选择JVM位数

jvm分为32位和64位,增加了位数也就增加了jvm的寻址空间,让jvm支持更大的堆,具体在各操作系统平台上内存限制如下所示:

《Java性能优化指南》读书笔记-JVM性能调优具体方法_第1张图片

有经验数据表明32位的性能要好于64位的性能,因此如果32位的内存够用的话不应该选择64位的jvm。


JVM内存配置调优


  1. 当应用初上线的时候若无法准确估算堆大小的时候则不配置堆大小,让jvm自动分配。
  2. 系统运行稳定之后,查看jvm活跃数据所占用的堆空间大小,查看年老代和永久代活跃数据在稳定运行期的空间大小。一般将-Xms和-Xmx设置为年老代活跃数据空间的3-4倍。永久代的设置-XX:PermSize及-XX:MaxPermSize应该设置为永久代活跃空间大小的1.2至1.5倍。
  3. -Xms和-Xmx一般配置成一样,当然这样会浪费一些空间,但是会避免因为Jvm堆动态扩容而引起的Full GC和jvm响应延迟。


你可能感兴趣的:(《Java性能优化指南》读书笔记-JVM性能调优具体方法)