JVM java堆内存

ChenRuiyz 2020-05-19

应用程序以及相关数据将决定Java堆空间占用需求。通过静态内存,可“预测”下面的内存需求:

  • 确定将会有多少不同的应用程序部署到预先计划的一个单独的JVM进程上,例如有多少个ear文件、war文件、jar文件等。在一个JVM上部署的应用程序越多,对本机堆的需求就越多。
  • 确定有多少个类需要在运行时加载:包括第三方API。越多的类加载器和类在运行时被加载,在HotSpot VM PermGen空间和内部JIT相关优化对象上的需求就越高。
  • 确定数据缓存占用,如应用程序加载内部缓存数据结构(和第三方API),例如数据库中的数据缓存,从文件中读取数据等。数据缓存使用越多,Java Heap OldGen空间需求就越高。
  • 确定允许建立的中间件线程数量。这是非常重要的,因为Java线程需要足够的本机内存,否则会抛OutOfMemoryError异常。

在JVM进程上部署的应用程序越多,对本地内存和PermGen空间的要求就越高。数据缓存并不是序列化为一个磁盘或数据库,它将从OldGen空间里面需要额外的内存。

你有5个ear应用程序(2000多个Java类)要部署(包含中间件代码)

  1. 本地堆需求估计为1GB(必须足够大以处理线程创建等等。)PermGen空间大约是512 MB。
  2. 内部静态缓存大约500MB
  3. 在高峰时间,总预测流量是5000个并发用户
  4. 每个用户的会话数据大约500K
  5. 在高峰期间,总流量会话要求是2.5GB。

正如你所看到的一样,在如此情况下,32位JVM进程就无法满足。一个典型的解决方案是进行流量拆分,在几个JVM进程或物理主机(假设有足够的硬件和CPU core可用)上。

大多数时候,业务流量将推动内存占用。除非你需要大量的数据缓存来实现适当的性能,典型的门户应用网站(媒体)繁重的应用程序需求。数据缓存太多的时候应该用一个黄色的标志标注一下,最好早点去重新审视一下一些设计元素。

相关推荐