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博客,我们一同成长! "不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!" 博 ...
随机推荐
- 10个安全问题带你了解OWASP 定义的大模型应用
摘要:OWASP 的一群研究人员,总结目前大模型中可能存在的TOP10安全风险,很好的揭示了我们在大模型应用中需要防护的目标,以及如何采取相应的防护措施. 本文分享自华为云社区<OWASP 定义 ...
- 共赴元宇宙新纪元,华为云VR开发应用大赛总决赛倒计时7天!
摘要:"第三届华为云VR开发应用暨沈阳元宇宙开发应用大赛"总决赛即将于2月13日在沈阳市和平区揭幕. 由沈阳市和平区人民政府.华为技术有限公司共同主办的"第三届华为云VR ...
- MindSpore实践:对篮球运动员目标的检测
摘要:本文讲述的是MindSpore对篮球运动员目标的检测应用,通过AI技术辅助对篮球赛场进行分析. 本文分享自华为云社区<MindSpore大V博文系列:AI对篮球运动员目标的检测>,原 ...
- 云图说|每个成功的业务系统都离不开APIG的保驾护航
摘要:华为云API网关(APIG)是为企业开发者及合作伙伴提供的高性能.高可用.高安全的API托管服务, 帮助企业轻松构建.管理和部署不同规模的API. 本文分享自华为云社区<[云图说]第243 ...
- 使用Plist编辑器——简单入门指南
本指南将介绍如何使用Plist编辑器.您将学习如何打开.编辑和保存plist文件,并了解plist文件的基本结构和用途.跟随这个简单的入门指南,您将掌握如何使用Plist编辑器轻松管理您的plis ...
- 高性能 Jsonpath 框架,Snack3 3.2.57 发布
Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计.其下一切数据都以ONode表示,ONode也 ...
- Windows Service 服务中,不能访问挂载目录(网络映射盘)
SpringBoot Windows 自启动 - 通过 Windows Service 服务实现 Windows Service 服务中,不能访问挂载目录(网络映射盘) 在Windows操作系统中,系 ...
- SQL SERVER数据分组后取第一条数据——PARTITION BY
MySQL 数据分组后取第一条数据 SQL SERVER (mssql) 数据分组后取第一条数据 SQL 如下 找状态=1的数据,按 HospitalId,DeptId 组合并倒序排序,每组里面取第一 ...
- 【Redis】哈希类型 列表类型 集合类型 有序集合 慢查询 pipeline与事务 发布订阅 Bitmap位图 HyperLogLog
目录 昨日回顾 今日内容 1 哈希类型 2 列表类型 3 集合类型 4 有序集合(zset) 5 慢查询 6 pipeline与事务 7 发布订阅 8 Bitmap位图 9 HyperLogLog 作 ...
- 升讯威在线客服系统:与QQ、微信的区别和优势
本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 请访问:https://kf.shengxunwei.com 文章目录列 ...