docker java 内存溢出_java内存溢出
与此问题类似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程序启动的时候需要哪些方面的内存呢?
- java程序的堆内存,最大就是
-Xmx
设置的这个值 - Garbage collection在垃圾回收的时候使用的内存
- JIT optimization使用的内存
- java程序的Off-heap所使用的内存
- java程序的Metaspace所使用的内存
- JNI Code所占用的内存
- 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内存溢出相关推荐
- java 内存溢出 内存泄露_java 内存泄露、内存溢出、内存不足
内存泄露 什么是内存泄露? 在维基百科上的定义如图: 中文意思就是一个对象在内存中,而程序无法获取此对象,于是不能释放该对象所占用的内存. 百度百科上的定义如图: OWASP上的定义: 开发者无法释放 ...
- java 如何排查内存溢出_java 内存溢出排查
测试代码,如下示例: import java.util.ArrayList; import java.util.List; /** * @Description 测试内存溢出, 启动时设置参数,最大堆 ...
- java long 内存溢出_JAVA内存区域与内存溢出异常
JAVA内存区域与内存溢出异常 一 Java内存区域 Java虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区域,Java虚拟机所管理的内存包含以下几个运行时数据区域. 1.程 ...
- java数组内存溢出_Java内存溢出问题总结
使用Java那么久,在此总结一下Java中常见的内存溢出问题以及对应的解决思路 堆溢出 报错信息 java.lang.OutOfMemoryError: Java heap space 报错原因 堆中 ...
- java 内存 溢出_java内存溢出的几种原因和解决办法是什么?
java内存溢出的几种原因和解决办法是什么? java内存溢出的几种原因和解决办法是: 第一类内存溢出,也是大家认为最多,第一反应认为是的内存溢出,就是堆栈溢出: 那什么样的情况就是堆栈溢出呢?当你看 ...
- java什么时候可能产生内存溢出_JAVA内存泄露和内存溢出
1)概念: 内存溢出:指在指定大小的内存空间,写入了超出大小的数据,从而导致了内存溢出. 内存溢出:指程序运行过程中无法申请到足够的内存而导致的一种错误. 内存溢出通常发生于OLD段或Perm段垃圾回 ...
- java list 内存溢出_java内存溢出的2种情况
java程序员在面试经常被问到内存om之后如何处理,但是实际在工作中遇到此类问题的情况却又非常少. 进过自己一番总结内存溢出主要分为2种: 一.堆内存溢出 OutOfMemoryError 从jvm的 ...
- java 内存溢出和内存泄漏_JAVA内存泄漏和内存溢出的区别
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. ...
- JAVA 继承内存模型_Java内存模型
JVM的组成 类加载器(classloader) 执行引擎(execution engine) 运行时数据区域(runtime data area) 对于Java程序员来说,在虚拟机自动内存管理机制下 ...
最新文章
- Firefox 66正式向广告宣战!预设禁止自动播放影片并加入加入 Windows Hello
- 不愿意和别人打交道_不想麻烦别人,也不希望别人麻烦我,是什么心理?看完就明白...
- Oracle自动备份脚本(Linux)
- WCF创建到使用到发布
- docwizard c++程序文档自动生成工具_如何开发一个基于 TypeScript 的工具库并自动生成文档
- 时下最流行前端构建工具Webpack 入门总结
- 【图像处理】——opencv常用函数
- [vue] 说说你觉得认为的vue开发规范有哪些?
- 1-物联网开发标配方案(预期方案使用说明和演示)
- 5.1.7 INSERT新增数据
- 设置 git/npm/bower/gem 镜像或代理的方法
- 什么叫单模光纤_什么是单模单纤/双纤光纤收发器?二者有何区别?
- vue 组件中的钩子函数 不能直接写this
- kafka日志格式和分区
- php 月份查询生日_PHP----------php根据生日(时间戳)计算星座
- 华为认证hcia含金量_【华为认证】HCIA-DATACOM史上最全精选题库(附答案解析)...
- 乒乓球训练机_比教练更牛的全新乒乓球机器人,超拟人黑科技,引领未来体育浪潮...
- 基于python物流管理系统毕业设计-python实现快递价格查询系统
- HugePages 大内存页
- 基于java(springboot框架)旅游景区景点购票系统 java毕业设计选题课题作品 毕业论文
热门文章
- 编码格式发展历史及简介
- typora+picgo+Chevereto(linux)搭建图床-利用宝塔面板安装Chevereto图床
- Redis只会用来做缓存?那你应该来看看这篇文章
- 两种方式可获得2022年工程师职称
- Eclipse连接海马模拟器
- Django实战技巧(2)-git代码仓分支管理技巧
- 技术分享 | 一款功能全面的 MySQL Shell 插件
- 死亡金属重型混音教程视频|Feared 2013年的混音作品|混音母带处理 By JeromeAlanChan
- Android使用AChartEngine制作动态心电图效果
- 小米上市、腾讯计划分拆音乐娱乐业务上市|互联网行业公会