搜索
简帛阁>技术文章>JVM -Xmx -Xms 配置误区(越大越好?越大并发量越大?)

JVM -Xmx -Xms 配置误区(越大越好?越大并发量越大?)

JVM -Xmx -Xms 配置,与误区

-Xmx1024m 越大越好?

作者在一家小公司,负责程序的开发和维护,每当(x64环境)线上的服务节点出现内存溢出的情况我总是采取

提高 -Xmx1024m 的措施来增加堆内存(Heap)大小的问题,

在我下意识里我一直以为,程序访问量大了去提高Heap就ok 

实则不然。

Heap越大限制并发量

进程模型

如图所示:

x86的机器上的 进程 最多可以使用 2048mb的内存,

假设 /** VM Args -Xmx 1024 **/ 那么

该Java进程剩下的内存由, 方法区,程序计数器,虚拟机栈,本地方法栈 共同使用。

虚拟机栈使用的空间 = 2048- Xmx(最大堆容量)-MaxPermSize (最大方法区容量) - 本地方法栈

我们知道,一个线程对应一个虚拟机栈,

所以总结:那么Heap 越大可以供,程序申请的内存空间越少,就是说虚拟机栈越少(线程数量越少)

堆内存存储了对象,我们称为GC堆,我们增加-Xmx 只是增加了GC堆的大小正真执行程序的内存空间反而小了

虚拟机栈图解

如图:右边绿色是虚拟机栈

(每个线程里面都是顺序执行的,里面的所有的,程序的执行都在栈帧里,若一段代码调用一个方法就会产生一个新的栈帧压到栈里去),

因此:一个方法我们可以理解为一个栈帧,

用个更好理解的图:

用IDEA 调试的时候,Debugger 就显示了栈帧信息, FILO(First in last out )

如何提高并发

(只有理论指导 ?)

更具OOM Dump,来调优

  1. 对于高并发,创建对象不多的项目,可以降低Xmx的配置, 结合Xms 设定堆范围 -Xms256m -Xmx512 
  2. 对于低并发,创建对象多的项目,(数据处理型的) 可以适当提高,Xmx
  3. (因为对象和数组是存放到Heap内的,栈帧中其实只存了对象地址,所以不存在爆的情况)
1prometheus的配置job_name:'java01'按照这个来分组scrape_interval:10sstatic_configs:targets:['192168144:6060']la
转自:https://wwwcnblogscom/jpfss/p/8618297html常见配置举例堆大小设置JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32bt还是64bit)限制;系统
常见配置举例堆大小设置JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32bt还是64bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制32位系统下,一般限制在15G~2G;64为操
Xms5GXmx5GXX:+AlwaysPreTouch如果不加XX:+AlwaysPreTouch,系统不会初始时分配5G,用多少给多少。如果加了这个标志,就会在程序运行时就分配Xms的大小。
Eclipse崩溃,错误提示:MyEclipsehasdetectedthatlessthan5%ofthe64MBofPermGen(Nonheapmemory)spaceremainsItisst
一、配置参数使用条件在不断重构代码的情况下,仍然不能解决内存溢出的问题(OutOfMemoryError等),这种情况下就需要使用JVM配置参数对JVM运行时各个区域的内存情况进行相应的分配。二、
javaXmsXmxXX:PermSizeXX:MaxPermSize在做java开发时尤其是大型软件开发时经常会遇到内存溢出的问题,比如说OutOfMemoryError等。这是个让开发人员很痛苦、
https://cloudtencentcom/developer/article/11996901参数的含义vmargsXms128MXmx512MXX:PermSize64MXX:MaxPermS
1参数的含义vmargsXms128MXmx512MXX:PermSize64MXX:MaxPermSize128Mvmargs说明后面是VM的参数,所以后面的其实都是JVM的参数了Xms128mJV
Eclipse崩溃,错误提示:MyEclipsehasdetectedthatlessthan5%ofthe64MBofPermGen(Nonheapmemory)spaceremainsItisst