与此问题类似jmeter Error occurred during initialization of VM Could not reserve enough space_萧木易的博客-CSDN博客

前言

微服务和docker的结合应该是现在服务端的主流技术,随着springboot的出现,有很多公司已经把微服务迁移到了docker容器中,我们也不甘寂寞,也尝试了一把新技术,把以前的整体服务进行拆分以后,也全部上到了docker容器中。

问题

压力测试稳定性测试时发现TPS突然降了下来,进入微服务查看日志发现报内存溢出,如下图。

后来由于java默认使用的内存是docker实体机器1/4的内存,导致部署了很多应用以后,经常出现内存不足的情况,然后公司要求应用在启动的时候通过jvm的启动参数来限制java使用的内存来缓解内存消耗过快的问题。

再后来,我们的docker平台进行了升级, 有了可以让应用限制cpu个数和mem大小的参数设置,后面应用方把app的 -Xmx和docker的内存大小设置成同样大小, 比如2g。后面发现跑了一段时间以后,应用经常出现oom的情况,而被杀掉。

因为java使用的内存不仅仅是 -Xmx设置的大小, -Xmx设置的大小只是java进程堆的最大占用内存,

原因

为什么会出现上面这个问题呢?通过监控系统可以知道,docker获得的mem_usage的大小是从外部得到的java进程的内存大小,不仅仅是 -Xmx设置的大小,如果 -Xmx和docker分配的内存一致的话,由于java应用其他的地方还要占用不少的内存,导致还没有到达 -Xmx的时候就没有可以用的内存了,所以被docker容器给干掉了,从而出现了oom的情况。

那么java程序启动的时候需要哪些方面的内存呢?

  1. java程序的堆内存,最大就是 -Xmx设置的这个值
  2. Garbage collection在垃圾回收的时候使用的内存
  3. JIT optimization使用的内存
  4. java程序的Off-heap所使用的内存
  5. java程序的Metaspace所使用的内存
  6. JNI Code所占用的内存
  7. jvm启动的时候所占用的内存。

如何大体估算java进程使用的内存呢?

Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss]

上面的公式大体得到了内存的占用,但是不是全部占用,网上有一些人做了一些试验,有两篇比较好的介绍文章:
https://plumbr.eu/blog/memory-leaks/why-does-my-java-process-consume-more-memory-than-xmx

http://trustmeiamadeveloper.com/2016/03/18/where-is-my-memory-java/

所以猜测在设置jvm启动参数的时候 -Xmx的这个值一般要小于docker限制内存数,个人觉得 -Xmx:docker的比例为 4/5 - 3/4

目前正在试验和观察,这里仅仅保存一下记录,以免忘记。

解决方法:查看docker java配置,把这个值改大

docker java 内存溢出_java内存溢出相关推荐

  1. java 内存溢出 内存泄露_java 内存泄露、内存溢出、内存不足

    内存泄露 什么是内存泄露? 在维基百科上的定义如图: 中文意思就是一个对象在内存中,而程序无法获取此对象,于是不能释放该对象所占用的内存. 百度百科上的定义如图: OWASP上的定义: 开发者无法释放 ...

  2. java 如何排查内存溢出_java 内存溢出排查

    测试代码,如下示例: import java.util.ArrayList; import java.util.List; /** * @Description 测试内存溢出, 启动时设置参数,最大堆 ...

  3. java long 内存溢出_JAVA内存区域与内存溢出异常

    JAVA内存区域与内存溢出异常 一 Java内存区域 Java虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区域,Java虚拟机所管理的内存包含以下几个运行时数据区域. 1.程 ...

  4. java数组内存溢出_Java内存溢出问题总结

    使用Java那么久,在此总结一下Java中常见的内存溢出问题以及对应的解决思路 堆溢出 报错信息 java.lang.OutOfMemoryError: Java heap space 报错原因 堆中 ...

  5. java 内存 溢出_java内存溢出的几种原因和解决办法是什么?

    java内存溢出的几种原因和解决办法是什么? java内存溢出的几种原因和解决办法是: 第一类内存溢出,也是大家认为最多,第一反应认为是的内存溢出,就是堆栈溢出: 那什么样的情况就是堆栈溢出呢?当你看 ...

  6. java什么时候可能产生内存溢出_JAVA内存泄露和内存溢出

    1)概念: 内存溢出:指在指定大小的内存空间,写入了超出大小的数据,从而导致了内存溢出. 内存溢出:指程序运行过程中无法申请到足够的内存而导致的一种错误. 内存溢出通常发生于OLD段或Perm段垃圾回 ...

  7. java list 内存溢出_java内存溢出的2种情况

    java程序员在面试经常被问到内存om之后如何处理,但是实际在工作中遇到此类问题的情况却又非常少. 进过自己一番总结内存溢出主要分为2种: 一.堆内存溢出 OutOfMemoryError 从jvm的 ...

  8. java 内存溢出和内存泄漏_JAVA内存泄漏和内存溢出的区别

    内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. ...

  9. JAVA 继承内存模型_Java内存模型

    JVM的组成 类加载器(classloader) 执行引擎(execution engine) 运行时数据区域(runtime data area) 对于Java程序员来说,在虚拟机自动内存管理机制下 ...

最新文章

  1. Firefox 66正式向广告宣战!预设禁止自动播放影片并加入加入 Windows Hello
  2. 不愿意和别人打交道_不想麻烦别人,也不希望别人麻烦我,是什么心理?看完就明白...
  3. Oracle自动备份脚本(Linux)
  4. WCF创建到使用到发布
  5. docwizard c++程序文档自动生成工具_如何开发一个基于 TypeScript 的工具库并自动生成文档
  6. 时下最流行前端构建工具Webpack 入门总结
  7. 【图像处理】——opencv常用函数
  8. [vue] 说说你觉得认为的vue开发规范有哪些?
  9. 1-物联网开发标配方案(预期方案使用说明和演示)
  10. 5.1.7 INSERT新增数据
  11. 设置 git/npm/bower/gem 镜像或代理的方法
  12. 什么叫单模光纤_什么是单模单纤/双纤光纤收发器?二者有何区别?
  13. vue 组件中的钩子函数 不能直接写this
  14. kafka日志格式和分区
  15. php 月份查询生日_PHP----------php根据生日(时间戳)计算星座
  16. 华为认证hcia含金量_【华为认证】HCIA-DATACOM史上最全精选题库(附答案解析)...
  17. 乒乓球训练机_比教练更牛的全新乒乓球机器人,超拟人黑科技,引领未来体育浪潮...
  18. 基于python物流管理系统毕业设计-python实现快递价格查询系统
  19. HugePages 大内存页
  20. 基于java(springboot框架)旅游景区景点购票系统 java毕业设计选题课题作品 毕业论文

热门文章

  1. 编码格式发展历史及简介
  2. typora+picgo+Chevereto(linux)搭建图床-利用宝塔面板安装Chevereto图床
  3. Redis只会用来做缓存?那你应该来看看这篇文章
  4. 两种方式可获得2022年工程师职称
  5. Eclipse连接海马模拟器
  6. Django实战技巧(2)-git代码仓分支管理技巧
  7. 技术分享 | 一款功能全面的 MySQL Shell 插件
  8. 死亡金属重型混音教程视频|Feared 2013年的混音作品|混音母带处理 By JeromeAlanChan
  9. Android使用AChartEngine制作动态心电图效果
  10. 小米上市、腾讯计划分拆音乐娱乐业务上市|互联网行业公会