JVM优化,虽然在很多地方提及,在我的实际开发工程中却很少用到,我看来主要有以下几个原因

  • 机器性能足够,暂时不用考虑这方面优化。
  • 业务不在意此方面,可能不影响他们业务就不会放入他们计划。
  • 整个项目希望更关注于业务方面。

总之就是一句话,没有出问题,就不是问题。 实际真的如此吗? 在资源不足的时候,在程序业务量并发的时候,这种情况可能就会让你重视起这一块的优化了。

或许我们都知道JVM内存模型有如下分区,但是实际优化又该怎么做呢?

JVM(Java Virtual Machine)内存模型是 Java 虚拟机对内存进行管理的一种抽象模型,它将 JVM 内部的内存分为以下几个区域:

程序计数器(Program Counter Register):用于记录当前线程执行的字节码行号,也可以称为指令指针。

虚拟机栈(JVM Stack):用于存储方法调用的局部变量、方法参数、返回值以及操作数栈等数据。每个线程都有自己的虚拟机栈。

本地方法栈(Native Method Stack):与虚拟机栈类似,用于存储本地方法(Native Method)的数据。

堆(Heap):用于存储对象实例以及数组等数据。堆是 Java 虚拟机所管理的内存中最大的一块。

方法区(Method Area):用于存储类信息、常量、静态变量等数据。在 Java 虚拟机规范中,方法区被划分为常量池(Constant Pool)和运行时常量池(Runtime Constant Pool)两部分。

运行时常量池(Runtime Constant Pool):在 Java 虚拟机规范中,它是方法区的一部分。用于存储字面量、符号引用等常量信息。在类加载后,将常量池中的符号引用替换为直接引用。

这一大堆描述,我们可能也知道一些优化的事项:

  1. 优化垃圾回收器的选择
  2. 减少GC,调整GC参数,通过调整如-Xmx(最大堆大小)、-Xms(初始堆大小)、-XX:+UseG1GC等参数来优化GC性能
  3. 堆内存分代大小比例调整
  4. 优化I/O等等

然而实际上我们对JVM优化是一个漫长的过程,需要监控应用具体的运行情况,找出瓶颈,再对症下药,这个关乎于具体业务的影响。

总之一个原则,抛开业务不谈优化。