jvm 在docker中内存占用问题探索 | Truman's Blog

标签: | 发表时间:2019-12-27 08:21 | 作者:
出处:https://trumandu.github.io

jvm 在docker中内存占用问题探索

问题背景

最近有个项目在PRD上部署,因为涉及到读取大量数据,会出现内存占用。为了避免因为该项目影响线上其他服务,所以设置了-m=2048,结果发现运行会超过这个值,docker 进程即将该container killed.

随后设置了好几个级别,直到-m=6048,依然无法避免container 被干掉。但是在本地测试和在同事机器上测试,不会出现内存飙升。同样的数据,同样的容器,唯一不同的就是机器物理配置的不同。

问题原因

线上机器是128g内存,目前制作的jre image 是1.8版本,未设置堆栈等jvm 配置,那么jvm 会字节分配一个默认堆栈大小,这个大小是根据物理机配置分配的。这样就会造成越高的配置,默认分配( 使用1/4的物理内存)的堆内存就越大,而docker设置限制内存大小,jvm却无法感知,不知道自己在容器中运行。目前存在该问题的不止jvm,一些linux 命令也是如此,例如:top,free,ps等。

因此就会出现container 被docker killed情况。这是个惨痛教训。。。

问题复现

略…

有个不错的 文章,可以查看一下。

解决方案

  • Dockerfile增加jvm参数

在调用java 可以增加jvm 参数,控制堆栈大小。

1             
CMD java  $JAVA_OPTIONS -jar java-container.jar             

1            
$ docker run -d --name mycontainer8g -p 8080:8080 -m 800M -e JAVA_OPTIONS='-Xmx300m' rafabene/java-container:openjdk-env            
  • 选用Fabric8 docker image

镜像fabric8/java-jboss-openjdk8-jdk使用了脚本来计算容器的内存限制,并且使用50%的内存作为上限。也就是有50%的内存可以写入。你也可以使用这个镜像来开/关调试、诊断或者其他更多的事情

相关 [jvm docker 内存] 推荐:

jvm 在docker中内存占用问题探索 | Truman's Blog

- -
jvm 在docker中内存占用问题探索. 最近有个项目在PRD上部署,因为涉及到读取大量数据,会出现内存占用. 为了避免因为该项目影响线上其他服务,所以设置了-m=2048,结果发现运行会超过这个值,docker 进程即将该container killed.. 随后设置了好几个级别,直到-m=6048,依然无法避免container 被干掉.

JVM内存分配

- - 移动开发 - ITeye博客
计算机内存,它算是CPU与计算机打交道最频繁的区域,所有数据都是先经过硬盘至内存,然后由CPU再从内存中获取数据进行处理,又将数据保存到内存,通过分页或分片技术将内存中的数据再flush至硬盘. 那JVM的内存结构到底是如何呢. JVM做为一个运行在操作系统上,但又独立于os运行的平台,它的内存至少应该包括象寄存器、堆栈等区域.

jvm内存映像分析

- - ITeye博客
     jdk自带的jmap就是java内存映像工具,可以用于上生成堆转储快照:. 在eclipse中启动一个java类,打开jdk安装目录下的C:\Program Files\Java\jdk1.6.0_11\bin目录,双击jconsole.exe,显示连接窗口:.  ,单击pid为6920的选项,点连接进入,可以看到jvm运行时的多种参数,.

JVM内存的调优

- - ITeye博客
默认的 java 虚拟机的大小比较小,在对大数据进行处理时 java 就会报错: java.lang.OutOfMemoryError. 设置 jvm 内存的方法,对于单独的 .class ,可以用下面的方法对 Test 运行时的 jvm 内存进行设置. -Xms 是设置内存初始化的大小. -Xmx 是设置最大能够使用内存的大小(最好不要超过物理内存大小).

MAT JVM内存分析

- - 开源软件 - ITeye博客
我们使用的是 Eclipse Memory Analyzer V0.8,Sun JDK 6. 和其他插件的安装非常类似,MAT 支持两种安装方式,一种是“单机版“的,也就是说用户不必安装 Eclipse IDE 环境,MAT 作为一个独立的 Eclipse RCP 应用运行;另一种是”集成版“的,也就是说 MAT 也可以作为 Eclipse IDE 的一部分,和现有的开发平台集成.

[译] HotSpot JVM 内存管理

- - IT瘾-dev
HotSpot JVM 内存管理. 更新时间:2018-03-28. 关于 JVM 内存管理或者说垃圾收集,大家可能看过很多的文章了,笔者准备给大家总结下. 这算是系列的第一篇,接下来一段时间会持续更新. 本文主要是翻译《 Memory Management in the Java HotSpot Virtual Machine》白皮书的前四章内容,这是 2006 的老文章了,当年发布这篇文章的还是 Sun Microsystems,以后应该会越来越少人记得这家曾经无比伟大的公司了.

【JVM】HotSpot JVM内存管理和GC策略总结

- - ITeye博客
JVM的相关知识是学习java高级特性必须要去深入学习的. 平时也有一些学习和实践,不过总结比较少. 今天有时间总结一下最基础的内存模型和GC策略的知识,在此记录一下. hotspot jvm内存模型. hotspot的内存模型很多地方都有类似总结,我也简单总结了一下,大概可以用下图表示:. 1.线程栈:线程创建是会为每个线程创建一个线程栈,线程栈里面会为每个方法调用创建一个栈帧.

java 内存移到堆外!!! Jvm gcih 淘宝优化JVM实践

- - CSDN博客互联网推荐文章
出自Jvm  GC-Invisible Heap. GC-Invisible Heap,简称GCIH,是一种将Java对象从Java堆内移动到堆外,并且可以在JVM间共享这些对象的技术. GCIH顾名思义就是GC访问不到的堆,它是对JVM内存管理机制的一个有益的补充. 在某些特殊的应用中有大量生命周期很长的对象,在应用运行的整个过程中它们都存在,不需要被GC回收.

JVM内存管理学习总结(一)

- - CSDN博客互联网推荐文章
I.JVM进程的生命周期. JVM实例的生命周期和java程序的生命周期保持一致,即一个新的程序启动则产生一个新的JVM进程实例,程序结束则JVM进程实例伴随着消失. 那么程序启动和程序终止就是JVM实例生命周期的两个边界,两个边界点可以这么理解:一个拥有程序入口(main函数)的class在执行main方法时,相应的JVM就被创建了(即JVM生命周期的起点),当由此main函数启动的所有非守护线程都终止时,JVM即退出(JVM实例生命周期的终点).

在JVM发生FGC前后dump内存

- - 互联网 - ITeye博客
有时候web应用经常会发生FGC,我们想知道FGC把那些对象给回收了,思路很简单就是看看FGC之前内存中有那些实例,FGC之后内存中又有那些实例,通过前后的比较,我们就能很容易知道FGC回收了那些实例,当然我们可以手工去dump内存,在FGC发生之前dump一下内存,再在FGC发生之后dump一下内存,但是这dump的时间点不好把握,能否让JVM自动去dump就更好了.