JVM内存用量的再学习
JVM内存用量的再学习
背景
最近解决一个SQLServer的问题耗时很久.
最终找到了一个看似合理的问题解释.
但是感觉不能只是总结于数据库方面
因为为了解决这个问题增加了很多监控措施.
所以想就这这个问题, 总结一下这次问题诊断过程中学习到的JVM相关知识.
一个JVM的监控图表
堆区信息

类加载

栈信息

内存学习
启动脚本为:
-javaagent:./jmx_prometheus_javaagent-0.17.2.jar=8080:simple-config.yml -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 -XX:+SafepointTimeout -XX:SafepointTimeoutDelay=2000 -XX:+UseCountedLoopSafepoints -XX:-UseBiasedLocking -XX:+UnlockDiagnosticVMOptions -XX:GuaranteedSafepointInterval=0 -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDetails -XX:-DisableExplicitGC -XX:+PrintGC -XX:+PrintGCDateStamps -XX:-UseGCOverheadLimit -XX:+PrintGCTimeStamps -Xloggc:./dump/gclog -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./dump -XX:NativeMemoryTracking=detail -XX:+UnlockDiagnosticVMOptions -Xmx24g -Xms24g
关于监控的学习和了解
第一部分: 关于堆区
堆区设置的是24G内存
可以看到因为没有设置 老年代和青年带的比率, 就是按照默认的 2:1 进行分配
老年代 16G内存 青年代8G内存.
幸存者区域 也是按照青年代的 8:1:1 进行默认分配,也就是只有青年代的 10%的代傲, 最大值是 805MB.
内存的使用之, 基本上也达到了 16+8 =24G的堆区最大值.
第二部分: 关于非堆区
1. 元数据区占用了 1.87GB, 接近 2GB的内存用量.
2. 压缩元类区域: 200MB左右.
3. Code cache 占用了 基本上默认的最大 240MB
监控到的费堆区合计使用了 2.5GB左右.
通过acuator 或者是 jvm exporter 监控信息获得:
两者合计为: 26.5GB
另外线程数数量较多, 最大值有 800个线程数 理论上Linux下面每一个线程至少要1MB的内存
所以这一块栈区的内存用量也不小, 也有接近1GB的区域.
第三部分:
同时进入系统查看 top 或者是 ps命令查看内存信息
1. top 后输入 大写的M 查看内存使用量较高的进程.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
32087 root 20 0 34.1g 29.6g 146164 S 27.6 62.7 1507:15 java
RES的内存足有 29.6G 比刚才计算的 26.5G 要多3GB的空间.
2. 使用 ps -aux |grep java 进行查看
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 32087 243 62.7 35740952 31017360 ? Sl 12月04 1507:17
内存用量其实也是 30G左右.
简单总结
设置堆区为 24G, 实际上堆区占整个进程的内存用量为:
24/30 = 80%
换句话说, 如果是容器内. 我们这样一个重型应用. 设置内存到32G的pod 的limit值
不建议 堆区的占用量超过80% 设置不建议超过 75%
因为我ps 和 top 查看时堆区的内存应该已经下降了, 其他区域内存的占比要比
(30-24) 的6GB的使用量还要搞.
这6GB 不仅仅包含监控中看到的 非堆区还有栈区 以及 GC使用的内存还有一部分直接内存
但是这一块应该是不包含加载到系统里面的缓存数据.
另外监控中还可以看到. 类的数量其实非常多.
程序启动完时就已经有了 16万个类, 运行完所有的功能后 类已经有 27.5万个类
计划下次有时间总结一一下 类和对象的关系.
JVM内存用量的再学习的更多相关文章
- 2万字长文包教包会 JVM 内存结构 保姆级学习笔记
写这篇的主要原因呢,就是为了能在简历上写个"熟悉JVM底层结构",另一个原因就是能让读我文章的大家也写上这句话,真是个助人为乐的帅小伙....嗯,不单单只是面向面试学习哈,更重要的 ...
- java的线程安全、单例模式、JVM内存结构等知识学习和整理
知其然,不知其所以然 !在技术的海洋里,前路漫漫,我一直在迷失着自我. 欢迎访问我的csdn博客,我们一同成长! "不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!" 博 ...
- 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++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...
- 这一次,终于系统的学习了 JVM 内存结构
最近在看< JAVA并发编程实践 >这本书,里面涉及到了 Java 内存模型,通过 Java 内存模型顺理成章的来到的 JVM 内存结构,关于 JVM 内存结构的认知还停留在上大学那会的课 ...
- 学习记录--JVM内存分析
今天刷牛客网的题时,看到了两位大神关于JVM内存分析的讲解,就顺手记录学习一下. JVM内存模型图 方法区域存放了所加载的类的信息(名称.修饰符等).类中的静态变量.类中定义为final类型的常量.类 ...
- JVM基础学习(一):JVM内存模型
在Java进阶知识的学习中,JVM都是避不过去的一关,我个人对于JVM的理解其实就是相当于在操作系统的外层再加了一层中间层,从来屏蔽了具体硬件之间的不同实现,使得Java实现了最重要的特性:一次编译, ...
- Jvm 内存浅析 及 GC个人学习总结
从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...
随机推荐
- Shell脚本实践总结
对比大小 符号用法:(必须使用双括号) < 小于 (( "$a" < "$b" )) <= 小于等于 (( "$a&q ...
- 6.elasticsearch中search template和alias
什么是search template 顾名思义,查询模版,就是提前设定好查询的DSL,再次查询时,只需要指定对应的模版,然后传入相应的参数就好.一是可以每次不用构建复杂的DSL,二是可以供开发直接使用 ...
- Next.js 开发指南 路由篇 | App Router
前言 路由(routers)是应用的重要组成部分.所谓路由,有多种定义,对于应用层的单页应用程序而言,路由是一个决定 URL 如何呈现的库,在服务层实现 API 时,路由是解析请求并将请求定向到处理程 ...
- 关于helloworld
我们的helloworld是从一个源程序开始的,该源程序由程序员通过编译器创建并保存的文件,文件名就是hello.c.这个hello.c的源程序,实际上是有0和1组成的序列.每一个0和1都成为一位,这 ...
- 工作中常用的一些Linux指令,简单易记还实用(三)
成功路上最大的困难就是坚持,每天坚持看一道算法,每周坚持看一本好书! 工作中,离不开Linux系统,很多刚步入职场的小白,往往对于Linux操作系统的使用都显得生疏,最主要的就是对一些常用的指令记忆不 ...
- libGDX游戏开发之文理打包(八)
libGDX游戏开发之文理打包(八) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网和googl ...
- SQL 的递归查询
在一般的业务场景中,特别是针对相关的业务线相关的功能开发时,可能会遇到一些具有层级关系的数据关联结构.比如,一个员工可能属于一个领导管辖,而同时,这个领导也被另一个更高级别的领导管辖--,而本质上这些 ...
- Git 的底层原理
前言 基于 Git 的使用,已经在前文有过相关的介绍,使用 Git 用作日常的开发基本上是足够的.现在,本文将详细介绍一些有关 Git 的实现原理. 底层命令与上层命令 一般情况下,正常使用的 ...
- JavaScript 常见错误与异常处理
一.为什么要了解常见JS错误 1.调试和故障排除: 了解常见的JavaScript错误可以帮助你更好地调试和故障排除代码.当你遇到错误时,能够快速识别错误类型并找到解决方法,可以节省大量的时间和精力. ...
- 案例解读华为隐私计算产品TICS如何实现城市跨部门数据隐私计算
摘要:本文介绍华为可信智能计算服务TICs是如何助力城市跨部门数据实现隐私计算的. 本文分享自华为云社区<基于华为隐私计算产品TICS实现城市跨部门数据隐私计算,助力实现普惠金融>,作者: ...