问题1:docker容器内存使用爆表,频繁自动重启
问题2:频繁FullGC
解决说明:以下命令中的1是pid的意思
解决命令
1、查看所有的Docker容器
docker ps -a
2、查看容器的状态,内存、cpu、mem等
docker stats
3、进入某一个容器(有问题的容器)
docker exec -it con_id bash
4、查看jvm参数配置
jinfo -flags 1
5、进入容器后统计gc信息统计,pid一般是1
jstat -gcutil 1 1000 100 一秒一次共100次
6、进入容器后查看堆配置以及使用大小
jmap -heap 1
7、找到问题点
配置上:堆区最大值为15G,新生代最大为5G,老年代最大为10G;
实际使用:
区 大小 使用率
eden 4.4G 49%
from 0.3G 14%
to 0.3G 0%
old 10G 2.3%
8、处理方案
整个docker容器的内存大小为16G,jvm参数Xxs15G,Xxm15G。
改为Xxs4G,Xxm4G后docker容器内存使用率不再飙升了,且峰值为50%,不再重启了。
9、fgc问题解决方案
代码中手动调用system.gc()的代码,将其去掉后好了。
其他命令为资料转载
Docker查看容器完整的COMMAND信息
docker ps -a --no-trunc 查看jvm配置参数情况
每个class的实例数目,内存占用,类全名信息.
jmap -histo 1
jmap -histo:live 1 只统计存活的对象数量
查看Java JVM参数配置信息命令
java -XX:+PrintCommandLineFlags
查看剩余内存
free -h
ps
列出当前机器上正在运行的虚拟机进程,JPS 从操作系统的临时目录上去找。
-q :仅仅显示进程,
-m:输出主函数传入的参数. 下的 hello 就是在执行程序时从命令行输入的参数
-l: 输出应用程序主类完整 package 名称或 jar 完整名称. -v: 列出 jvm 参数, -Xms20m -Xmx50m 是启动程序指定的 jvm 参数
jstat
是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据,在没有 GUI
图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
假设需要每 250 毫秒查询一次进程 13616 垃圾收集状况,一共查询 10 次,那命令应当是:jstat-gc 13616 250 10
常用参数:
-class (类加载器) -compiler (JIT) -gc (GC 堆状态) -gccapacity (各区大小) -gccause (最近一次 GC 统计和原因) -gcnew (新区统计) -gcnewcapacity (新区大小) -gcold (老区统计) -gcoldcapacity (老区大小) -gcpermcapacity (永久区大小) -gcutil (GC 统计汇总) -printcompilation (HotSpot 编译统计)
jinfo
查看和修改虚拟机的参数
jinfo –sysprops 可以查看由 System.getProperties()取得的参数
jinfo –flag 未被显式指定的参数的系统默认值
jinfo –flags(注意 s)显示虚拟机的参数
jinfo –flag +[ 参 数 ] 可 以 增 加 参 数 , 但 是 仅 限 于 由 java -XX:+PrintFlagsFinal –version 查 询 出 来 且为 manageable 的参数
jmap
用于生成堆转储快照(一般称为 heapdump 或 dump 文件)。jmap 的作用并不仅仅是为了获取 dump 文件,它还可以查询 finalize 执行队列、Java 堆和永
久代的详细信息,如空间使用率、当前用的是哪种收集器等。和 jinfo 命令一样,jmap 有不少功能在 Windows 平台下都是受限的,除了生成 dump 文件的
-dump 选项和用于查看每个类的实例、空间占用统计的-histo 选项在所有操作系统都提供之外,其余选项都只能在 Linux/Solaris 下使用。
jmap -dump:live,format=b,file=heap.bin
Sun JDK 提供 jhat(JVM Heap Analysis Tool)命令与 jmap 搭配使用,来分析 jmap 生成的堆转储快照。
jstack
(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主
要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。
在代码中可以用 java.lang.Thread 类的 getAllStackTraces()方法用于获取虚拟机中所有线程的 StackTraceElement 对象。使用这个方法可以通过简单的几行
代码就完成 jstack 的大部分功能,在实际项目中不妨调用这个方法做个管理员页面,可以随时使用浏览器来查看线程堆栈。