返回顶部
首页 > 资讯 > 服务器 >docker 查看jvm内存占用方式
  • 877
分享到

docker 查看jvm内存占用方式

2024-04-02 19:04:59 877人浏览 安东尼
摘要

一、进入Docker容器的宿主机,查看运行指定镜像的容器id(结果的第一列): docker ps | grep myImageName(或docker ps | grep ja

一、进入Docker容器的宿主机,查看运行指定镜像的容器id(结果的第一列):


docker ps | grep myImageName(或docker ps | grep java)

二、进入容器内部:


docker exec -it containerId sh

三、直接输入top命令:

top

可看到基本的容器占用的信息:pid、vsz、cpu、command等。(ctrl+c 或 q,退出top)

四、查看更具体的JVM内存占用:


top -m 

其中,vsz:Virtual Memory Size,虚拟内存大小,表明了该进程可以访问的所有内存,包括被交换的内存和共享库内存。

rss: Resident Set Size,常驻内存集合大小,表示进程在RAM中占用了多少内存,并不包含在SWAP中占用的虚拟内存。即使是在内存中的使用了共享库的内存大小也一并计算在内,包含了完整的在stack和heap中的内存。

SHR:shared memory,共享内存。

补充:

ps -ef | grep java 或 docker top 容器id ,可查看pid的一些信息。

ps aux | grep java。

top -p pid。

RSS 是常驻内存集(Resident Set Size),表示该进程分配的内存大小。

RSS 不包括进入交换分区的内存。

RSS 包括共享库占用的内存(只要共享库在内存中)

RSS 包括所有分配的栈内存和堆内存。

VSZ 表示进程分配的虚拟内存。

VSZ 包括进程可以访问的所有内存,包括进入交换分区的内容,以及共享库占用的内存。

VSZRW:未百度到具体含义,猜测:初始申请的虚拟内存大小。

docker stats 容器名 或 docker stats 容器id,结果如下:


CONTAINER      CPU %        MEM USAGE / LIMIT     MEM %        NET I/O   BLOCK I/O    PIDS
 

补充:docker容器化下的JVM参数调优

1、JVM堆内存设置

跑在docker容器的Java服务发生过几次内存超标异常,实际上这和Java程序的docker容器化有很大的关系。Java和docker并不是天然的朋友,docker可以设置内存和CPU限制,底层通过linux cgroup技术实现,但是Java JVM并不能自动检测到。

我们可以使用Java的Xmx标识手动指定堆内存的大小或者使用较高版本的jdk提供的JVM标识,解决这个问题。

问题:

旧版本Java8(update 131之前的版本),JVM的可用内存和CPU数量并不是docker允许你使用的可用内存和CPU数量

比如docker容器中限制只能使用1G,但是旧版本Java并不能识别到这个限制,当业务增长时,JVM就会申请更多内存,可能远超这个限制。但是如果使用太多内存,docker就会采取行动并杀死容器内的Java进程,显然这不是我们想要的!

目前我们生产环境使用Java8版本,这个问题可通过-Xmx限制堆内存大小来解决,不过这里实际限制了两次,一次是docker容器的内存限制,一次是jvm堆内存的限制。

解决方法:

这个前提需要Java程序的dockerfile支持:


# 初始镜像
FROM adoptopenjdk/openjdk8
# jar包名字需要更改为项目名字-版本号,后面app.jar 不变
ADD example-sun-1.0.jar app.jar
# 配置JVM启动参数
ENV JVM_ARGS=${JVM_ARGS}
EXPOSE 8080
# 优化jvm参数配置启动
ENTRYPOINT java ${JVM_ARGS} -Djava.security.egd=file:/dev/./urandom -jar app.jar

具体在k8s deployment.yaml 部署文件中环境变量 env 中加入以下参数,当JVM 启动时就会加载进去


- name: JVM_ARGS
 value: -Xmx1024m -Xms512m

Xmx1024m #设置jvm堆内存的最大值

-Xms512m #设置jvm堆内存的最小值

这里设置最小堆内存为512m,最大内存为1024m, 堆内存调整不要一味简单增大,要仔细分析内存占用过大的原因,是否有代码上的问题。

较高版本Java9之后(8u131+)JVM提供更好的解决方式

使用JVM 标志: -XX:+UnlockExperimentalVMOptions-XX:+UseCGroupMemoryLimitForHeap

强制JVM检查Linux的cGoup配置,实际上docker正是通过Linux的cgroup技术来限制容器的内存等资源的。现在如果应用达到了docker设置的限制(比如1G),JVM是可以看到这个限制的,JVM就会尝试GC操作。

如果gc之后仍然超过内存限制,那JVM就会做它该做的事情,比如抛出OutOfMemoryException.也就是说,JVM能够识别到docker的这些设置。

2、GC日志打印以及OOM自动dump

程序运行过程中,也可以打印GC日志,方便排查问题, 同时当Java发生OutOfMemory 异常时可将heap 内存 dump 下来方便我们排查问题使用,设置以下参数:


- name: JVM_ARGS
 value: -Xmx1536m -Xms512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/my-heap-dump.hprof -Xloggc:/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps

参数含义:


# 发生内存溢出自动dump内存文件
-XX:+HeapDumpOnOutOfMemoryError
############ 指定dump文件地址为服务打印日志文件夹/logs(已挂载)
-XX:HeapDumpPath=/logs/my-heap-dump.hprof
############ 打印服务gc日志
-Xloggc:/logs/gc.log
# 输出详细GC日志
-XX:+PrintGCDetails
# 格式化输出时间戳 2020-09-17T19:45:05.680+0800
-XX:+PrintGCDateStamps

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

--结束END--

本文标题: docker 查看jvm内存占用方式

本文链接: https://lsjlt.com/news/122004.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • docker 查看jvm内存占用方式
    一、进入docker容器的宿主机,查看运行指定镜像的容器id(结果的第一列): docker ps | grep myImageName(或docker ps | grep ja...
    99+
    2024-04-02
  • docker如何查看jvm内存占用方式
    这篇文章主要介绍了docker如何查看jvm内存占用方式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、进入docker容器的宿主机,查看运行指定镜像的容器id(结果的第一...
    99+
    2023-06-14
  • 查看php-fpm内存占用
    php-fpm的启动数量必须,要调整好,否则会造成内存使用过高查看PHP-FPM在你的机器上的平均内存占用使用如下命令:ps --no-headers -o "rss,cmd" -C php-fpm | awk '...
    99+
    2023-01-30
    内存 php fpm
  • linux查看进程内存占用
    需要知道一台机器上面跑的java程序,各占用了多少内存。 ps -aux | grep xxxUSER        PID %CPU %MEM&nb...
    99+
    2023-01-31
    进程 内存 linux
  • 查看redis占用内存的实现方法
    目录查看Redis占用内存方法环境查看方法查询结果含义总结查看redis占用内存方法 环境 RedisDesktopManager客户端 查看方法 客户端连接redis 进入serve info  (redi...
    99+
    2024-01-29
    查看redis占用内存 redis占用内存 redis内存
  • linux怎么查看java内存占用
    要查看Java进程的内存占用情况,可以使用以下命令:1. 使用top命令查看进程的内存占用情况:```top -p ```在top命...
    99+
    2023-09-09
    java linux
  • jvm内存参数如何查看
    要查看JVM的内存参数,可以使用以下方法之一: 使用jps命令:打开命令行工具(如cmd或终端),输入jps并按下回车。这将列出...
    99+
    2024-02-29
    jvm
  • Linux系统如何使用命令行的方式查看内存占用
    这篇文章给大家分享的是有关Linux系统如何使用命令行的方式查看内存占用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. /proc/meminfo一种最简单的方法是通过“/proc/meminfo”来检查内存...
    99+
    2023-06-28
  • linux怎么查看程序占用内存
    在Linux系统中,可以使用以下命令来查看程序占用的内存:1. top命令:在终端中输入top命令,然后按下Shift + M键,可...
    99+
    2023-09-07
    linux
  • linux如何查看内存被谁占用
    在Linux系统中,你可以使用以下命令来查看内存被谁占用:1. `top`命令:在终端输入`top`命令,可以实时查看系统中各个进程...
    99+
    2023-08-30
    linux
  • python怎么查看内存占用情况
    可以使用Python的内置模块`sys`来查看内存占用情况。1. 使用`sys.getsizeof()`函数来获取对象占用的内存大小...
    99+
    2023-09-15
    python
  • linux怎么查看内存占用情况
    在Linux上查看内存占用情况可以使用以下命令: free命令:用于查看系统内存的使用情况。 free -h 该命令将以可读的方...
    99+
    2023-10-24
    linux
  • win11如何查看内存占用情况
    这篇文章主要介绍了win11如何查看内存占用情况的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win11如何查看内存占用情况文章都会有所收获,下面我们一起来看看吧。方法一:首先右键“windows徽标”,打开“...
    99+
    2023-07-02
  • mysql怎么查看内存占用情况
    要查看MySQL内存占用情况,可以使用以下几种方法: 使用MySQL自带的performance_schema插件:通过perfo...
    99+
    2024-04-09
    mysql
  • centos怎么查看内存占用情况
    在CentOS系统中,可以使用以下命令来查看内存占用情况: 使用 free 命令查看系统内存使用情况: free -h 使用...
    99+
    2024-04-02
  • linux怎么查看jvm内存使用情况
    在Linux系统中,可以通过以下命令查看JVM内存使用情况:1. 使用top命令查看整个系统的进程状态和资源使用情况:top在top...
    99+
    2023-10-20
    linux jvm
  • JVM中怎么使用jstat查看堆内存
    在JVM中使用jstat命令可以查看堆内存的使用情况。具体步骤如下: 打开命令行工具,进入到JVM的bin目录下,通常位于JDK...
    99+
    2024-03-05
    JVM
  • 怎么查看jvm的内存使用情况
    可以通过以下几种方式查看JVM的内存使用情况: 使用命令行工具:可以通过命令行工具jstat来查看JVM的内存使用情况。使用以下命...
    99+
    2024-04-02
  • Python利用memory_profiler查看内存占用情况
    目录简介安装使用方法1、通过装饰器运行2、通过命令行运行补充简介 memory_profiler是第三方模块,用于监视进程的内存消耗以及python程序内存消耗的逐行分析。它是一个纯...
    99+
    2024-04-02
  • ubuntu怎么查看内存占用和查看cpu使用情况
    这篇文章主要介绍“ubuntu怎么查看内存占用和查看cpu使用情况”,在日常操作中,相信很多人在ubuntu怎么查看内存占用和查看cpu使用情况问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ubuntu怎么查...
    99+
    2023-06-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作