JVM内存学习 2.0
先说一下结果
1. Linux的内存分配是惰性分配的. APP申明了 kernel并不会立即进行初始化和使用.
2. JVM的内存主要分为, 堆区, 非堆区, 以及jvm使用的其他内存. 比如直接内存等.
3. top看到的内存与pmap 查询出来的内存基本一样. top的RES和pmap的RSS基本相同.
4. 堆区如果进行了合理的设置. 占用RSS或者是RES的比率在 70-77左右.
5. 如果使用的功能比较集中, 可能codecache等内存使用量会少, 堆区占比会高
如果全部功能遍历, 那么codecache 以及本地内存的缓存等就会比较大, 堆区的占比就会小.
6. 如果使用容器的话 75% 应该算是一个基本合理的数值.
摘要
最近中午帮某项目写docker下的启动脚本.
自己定义了几个参数. 但是感觉不太放心
怕出现因为堆外内存导致OOM的问题
撑着有一个bug 需要不停的重启服务. 我就简单学习总结了下.
主要用的工具其实就3类
1. jinfo,jcmd等命令查看JVM的信息.
增加native_memory_track的设置. 查看summary等信息.
2. pmap 从操作系统层查看内存的分配情况.
3. top 等命令查看进程状态的信息.
启动之前的结果
[root@centos7ver2009 gscloud]# jinfo 16732
Attaching to process ID 16732, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.222-b10
Java System Properties:
caf.startup.server.path.name = server
java.runtime.name = OpenJDK Runtime Environment
hibernate.jdbc.time_zone = Asia/Shanghai
java.vm.version = 25.222-b10
sun.boot.library.path = /gscloud/server/runtime/java/x86_64-linux/jre/lib/amd64
java.protocol.handler.pkgs = org.springframework.boot.loader
LOG_FILE_MAX_SIZE = 5MB
java.vendor.url = http://java.oracle.com/
java.vm.vendor = AdoptOpenJDK
path.separator = :
file.encoding.pkg = sun.io
java.vm.name = OpenJDK 64-Bit Server VM
sun.os.patch.level = unknown
sun.java.launcher = SUN_STANDARD
user.country = CN
user.dir = /gscloud
java.vm.specification.name = Java Virtual Machine Specification
PID = 16732
java.runtime.version = 1.8.0_222-b10
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
os.arch = amd64
java.endorsed.dirs = /gscloud/server/runtime/java/x86_64-linux/jre/lib/endorsed
CONSOLE_LOG_CHARSET = UTF-8
spring.profiles.active = prod
line.separator =
java.io.tmpdir = /tmp
java.vm.specification.vendor = Oracle Corporation
os.name = Linux
FILE_LOG_CHARSET = UTF-8
sun.jnu.encoding = UTF-8
java.library.path = /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
spring.beaninfo.ignore = true
java.class.version = 52.0
java.specification.name = Java Platform API Specification
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
os.version = 3.10.0-1160.el7.x86_64
user.home = /root
user.timezone = Asia/Shanghai
LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE = 5242880
catalina.useNaming = false
java.awt.printerjob = sun.print.PSPrinterJob
file.encoding = UTF-8
java.specification.version = 1.8
catalina.home = /tmp/tomcat.5200.6719909097640900997
user.name = root
java.class.path = ./server/runtime/caf-bootstrap.jar
com.sun.org.apache.xml.internal.dtm.DTMManager = com.sun.org.apache.xml.internal.dtm.ref.DTMManagerDefault
loader.path = ./server/runtime/3rd,./server/runtime/libs
server.runtime.path.name = /gscloud/server
java.vm.specification.version = 1.8
sun.arch.data.model = 64
sun.java.command = ./server/runtime/caf-bootstrap.jar --spring.config.location=./server/runtime/
java.home = /gscloud/server/runtime/java/x86_64-linux/jre
user.language = zh
java.specification.vendor = Oracle Corporation
awt.toolkit = sun.awt.X11.XToolkit
java.vm.info = mixed mode
java.version = 1.8.0_222
java.ext.dirs = /gscloud/server/runtime/java/x86_64-linux/jre/lib/ext:/usr/java/packages/lib/ext
sun.boot.class.path = /gscloud/server/runtime/java/x86_64-linux/jre/lib/resources.jar:/gscloud/server/runtime/java/x86_64-linux/jre/lib/rt.jar:/gscloud/server/runtime/java/x86_64-linux/jre/lib/sunrsasign.jar:/gscloud/server/runtime/java/x86_64-linux/jre/lib/jsse.jar:/gscloud/server/runtime/java/x86_64-linux/jre/lib/jce.jar:/gscloud/server/runtime/java/x86_64-linux/jre/lib/charsets.jar:/gscloud/server/runtime/java/x86_64-linux/jre/lib/jfr.jar:/gscloud/server/runtime/java/x86_64-linux/jre/classes
java.awt.headless = true
java.vendor = AdoptOpenJDK
catalina.base = /tmp/tomcat.5200.6719909097640900997
com.zaxxer.hikari.pool_number = 1
file.separator = /
java.vendor.url.bug = http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding = UnicodeLittle
sun.font.fontmanager = sun.awt.X11FontManager
sun.cpu.endian = little
sun.cpu.isalist =
VM Flags:
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=528482304 -XX:MaxHeapSize=8434745344 -XX:MaxNewSize=2811232256 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=176160768 -XX:OldSize=352321536 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
Command line: -Dloader.path=./server/runtime/3rd,./server/runtime/libs -Dserver.runtime.path.name=server -Dspring.profiles.active=prod
修改启动配置节
- 增加本地内存监控情况分析.
增加启动配置节:
-XX:NativeMemoryTracking=summary
-XX:+UnlockDiagnosticVMOptions
-XX:+PrintNMTStatistics
然后进行验证.
启动成功后查看堆区信息:
jcmd 3153 GC.heap_info
3153:
PSYoungGen total 2737664K, used 839841K [0x0000000718700000, 0x00000007c0000000, 0x00000007c0000000)
eden space 2732032K, 30% used [0x0000000718700000,0x000000074b5a9668,0x00000007bf300000)
from space 5632K, 99% used [0x00000007bfa80000,0x00000007bffff070,0x00000007c0000000)
to space 6656K, 0% used [0x00000007bf300000,0x00000007bf300000,0x00000007bf980000)
ParOldGen total 3923968K, used 3679249K [0x00000005c9400000, 0x00000006b8c00000, 0x0000000718700000)
object space 3923968K, 93% used [0x00000005c9400000,0x00000006a9d044b0,0x00000006b8c00000)
Metaspace used 930784K, capacity 955800K, committed 956056K, reserved 1904640K
class space used 94743K, capacity 100007K, committed 100016K, reserved 1048576K
查看JVM信息- 注意这个是启动成功还未使用时的情况
3153:
Native Memory Tracking:
Total: reserved=11485532KB, committed=8832628KB
- Java Heap (reserved=8237056KB, committed=6669312KB)
(mmap: reserved=8237056KB, committed=6669312KB)
- Class (reserved=1924213KB, committed=975501KB)
(classes #129334)
(malloc=21621KB #196626)
(mmap: reserved=1902592KB, committed=953880KB)
- Thread (reserved=257096KB, committed=257096KB)
(thread #250)
(stack: reserved=255924KB, committed=255924KB)
(malloc=816KB #1253)
(arena=356KB #495)
- Code (reserved=275156KB, committed=144832KB)
(malloc=25556KB #33396)
(mmap: reserved=249600KB, committed=119276KB)
- GC (reserved=309146KB, committed=303022KB)
(malloc=8198KB #3979)
(mmap: reserved=300948KB, committed=294824KB)
- Compiler (reserved=649KB, committed=649KB)
(malloc=518KB #3554)
(arena=131KB #6)
- Internal (reserved=254240KB, committed=254240KB)
(malloc=254208KB #150391)
(mmap: reserved=32KB, committed=32KB)
- Symbol (reserved=186444KB, committed=186444KB)
(malloc=181993KB #2017141)
(arena=4451KB #1)
- Native Memory Tracking (reserved=37718KB, committed=37718KB)
(malloc=90KB #1100)
(tracking overhead=37628KB)
- Arena Chunk (reserved=3815KB, committed=3815KB)
(malloc=3815KB)
通过top的方式进行查看
top -Hp 3153 -bn 1 |head -n 10
top - 17:22:12 up 105 days, 44 min, 6 users, load average: 0.86, 1.33, 1.58
Threads: 250 total, 1 running, 249 sleeping, 0 stopped, 0 zombie
%Cpu(s): 16.7 us, 20.8 sy, 0.0 ni, 61.5 id, 0.0 wa, 0.0 hi, 1.0 si, 0.0 st
KiB Mem : 32946140 total, 4115820 free, 19413000 used, 9417320 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 12976944 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3153 root 20 0 14.4g 8.0g 116096 S 0.0 25.5 0:00.00 java
3154 root 20 0 14.4g 8.0g 116096 S 0.0 25.5 25:46.31 java
3155 root 20 0 14.4g 8.0g 116096 S 0.0 25.5 0:27.38 java
通过pmap查看内存使用情况
pmap -d $pid |tail -n 10
Address Kbytes RSS Dirty Mode Mapping
00007f45727c2000 4 0 0 r---- [ anon ]
00007f45727c3000 4 4 4 rw--- [ anon ]
00007f45727c4000 4 4 4 r---- ld-2.17.so
00007f45727c5000 4 4 4 rw--- ld-2.17.so
00007f45727c6000 4 4 4 rw--- [ anon ]
00007ffddc929000 132 44 44 rw--- [ stack ]
00007ffddc9d4000 8 4 0 r-x-- [ anon ]
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------- ------- -------
total kB 15106724 8408168 8292060
查看一个运行很多自动化的机器的内存使用情况
SQLSERVER数据库测试环境:
pmap的数值: 23686180
GC.heap_info的数值: 16683520
比率约为: 70%
机器的压力较大. 内存 94%
达梦数据库测试环境:
pmap的数值: 15449264
GC.heap_info的数值: 2005504+6867968
比率约为: 57%
机器的压力较小. 内存 80%
需要注意的是: 第二个是没有设置 Xmx的设置.
第一个设置了XMX还比较好一些.
一个压测环境:
pmap的数值: 21518128
GC.heap_info的数值: 11086848+5490688
比率约为: 77%
机器的压力较小. 内存 50%
这个环境跑的功能不是很多, 所以估计codecache等部分的占用会少一些.
JVM内存学习 2.0的更多相关文章
- 记一次线上事故的JVM内存学习
今天线上的hadoop集群崩溃了,现象是namenode一直在GC,长时间无法正常服务.最后运维大神各种倒腾内存,GC稳定后,服务正常.虽说全程在打酱油,但是也跟着学习不少的东西. 第一个问题:为什么 ...
- JVM内存管理学习总结(一)
I.JVM进程的生命周期 JVM实例的生命周期和java程序的生命周期保持一致,即一个新的程序启动则产生一个新的JVM进程实例,程序结束则JVM进程实例伴随着消失.那么程序启动和程序终止就是JVM实例 ...
- jvm内存JVM学习笔记-引用(Reference)机制
在写这篇文章之前,xxx已经写过了几篇关于改jvm内存主题的文章,想要了解的朋友可以去翻一下之前的文章 如果你还不了解JVM的基本概念和内存划分,请阅读JVM学习笔记-基础知识和JVM学习笔记-内存处 ...
- java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...
- java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)
概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...
- 2万字长文包教包会 JVM 内存结构 保姆级学习笔记
写这篇的主要原因呢,就是为了能在简历上写个"熟悉JVM底层结构",另一个原因就是能让读我文章的大家也写上这句话,真是个助人为乐的帅小伙....嗯,不单单只是面向面试学习哈,更重要的 ...
- Jvm 内存浅析 及 GC个人学习总结
从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...
- 【JVM学习笔记一】JVM内存分布
Overview 学习JVM首先需要了解一下JVM管理的内存是如何分布的,在看了<深入理解Java虚拟机>和一些博文之后,我准备自己记录一下学习的过程. 下图是JVM中运行时数据区的大致示 ...
- JVM内存回收机制——哪些内存需要被回收(JVM学习系列2)
上一篇文章中讨论了Java内存运行时的各个区域,其中程序计数器.虚拟机栈.本地方法栈随线程生灭,且创建时需要多少内存,基本上在译期间就决定的了,所以在内存回收时无需特殊的关注.而堆和方法区则不同,首先 ...
- java的线程安全、单例模式、JVM内存结构等知识学习和整理
知其然,不知其所以然 !在技术的海洋里,前路漫漫,我一直在迷失着自我. 欢迎访问我的csdn博客,我们一同成长! "不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!" 博 ...
随机推荐
- 超详细API插件使用教程,教你开发AI垃圾分类机器人
本文分享自华为云社区[案例教学]华为云API对话机器人的魅力-体验AI垃圾分类机器人,作者:华为云PaaS服务小智. 体验用Huawei Cloud API开发AI垃圾分类机器人,并学习AI自然语言的 ...
- Volcano 监控设计解读,一看就懂
摘要:Volcano 方便AI,大数据,基因,渲染等诸多行业通用计算框架介入,提供高性能任务调度引擎,高性能异构芯片管理,高性能任务运行管理等能力. Volcano 是一个 Kubernetes 云原 ...
- IAP:物联网终端软件升级技术
摘要:IAP是利用自己的程序代码实现升级程序(新的APP)从外部接口(可以是串口.I2C.SPI.网口等等)写入到flash中,再通过flash读写操作,将新的APP覆盖原有APP程序,在重新从新的A ...
- 当物联网遇上云原生:K8s向边缘计算渗透中
摘要:K8s正在向边缘计算渗透,它为边缘侧的应用部署提供了便利性,在一定程度上转变了边缘应用与硬件之间的关系,将两者的耦合度降低. 本文分享自华为云社区<云原生在物联网中的应用[拜托了,物联网! ...
- Filebeat的安装和使用(Windows)
Filebeat是什么 1.Filebeat是什么?Filebeat是用于转发和集中日志数据的轻量级传送工具. Filebeat监视用户指定的日志文件或位置,收集日志事件,并将日志数据转发到Elast ...
- gunicorn 高性能wsgi服务器
参考: https://zhuanlan.zhihu.com/p/102716258 Gunicorn是什么 Gunicorn Green Unicorn 是一个 UNIX 下的 WSGI HTTP ...
- Sunshine + Moonlight 纯软件实现全平台设备作 Linux 副屏
目录 初识 Moonlight 部署 Sunshine 服务端与 Moonlight 客户端 创建虚拟显示屏 写一个创建屏幕的脚本(可选) 将副屏进行串流 已知问题 最近,我想要通过视频学习一些技术知 ...
- vue 路由跳转页面不刷新
vue 路由跳转页面不刷新 点击打开视频讲解地址在router-view 里边添加 :key="$route.fullPath"
- 自动化测试复习巩固第一天,requests的用法
如何快速发送post请求 因为我用的python语言,所以大家需要在本地安装python语言和pycharm,如何安装请自行查找教程,这里不做过多赘述 这里需要提前下载安装好需要的第三方库reques ...
- STM32CubeMX教程19 I2C - MPU6050驱动
1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) 野火DAP仿真器 keil µVision5 IDE(MDK-Arm) ST- ...