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内存用量的再学习的更多相关文章

  1. 2万字长文包教包会 JVM 内存结构 保姆级学习笔记

    写这篇的主要原因呢,就是为了能在简历上写个"熟悉JVM底层结构",另一个原因就是能让读我文章的大家也写上这句话,真是个助人为乐的帅小伙....嗯,不单单只是面向面试学习哈,更重要的 ...

  2. java的线程安全、单例模式、JVM内存结构等知识学习和整理

    知其然,不知其所以然 !在技术的海洋里,前路漫漫,我一直在迷失着自我. 欢迎访问我的csdn博客,我们一同成长! "不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!" 博 ...

  3. JVM内存管理学习总结(一)

    I.JVM进程的生命周期 JVM实例的生命周期和java程序的生命周期保持一致,即一个新的程序启动则产生一个新的JVM进程实例,程序结束则JVM进程实例伴随着消失.那么程序启动和程序终止就是JVM实例 ...

  4. jvm内存JVM学习笔记-引用(Reference)机制

    在写这篇文章之前,xxx已经写过了几篇关于改jvm内存主题的文章,想要了解的朋友可以去翻一下之前的文章 如果你还不了解JVM的基本概念和内存划分,请阅读JVM学习笔记-基础知识和JVM学习笔记-内存处 ...

  5. java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

  6. java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)

    概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...

  7. 这一次,终于系统的学习了 JVM 内存结构

    最近在看< JAVA并发编程实践 >这本书,里面涉及到了 Java 内存模型,通过 Java 内存模型顺理成章的来到的 JVM 内存结构,关于 JVM 内存结构的认知还停留在上大学那会的课 ...

  8. 学习记录--JVM内存分析

    今天刷牛客网的题时,看到了两位大神关于JVM内存分析的讲解,就顺手记录学习一下. JVM内存模型图 方法区域存放了所加载的类的信息(名称.修饰符等).类中的静态变量.类中定义为final类型的常量.类 ...

  9. JVM基础学习(一):JVM内存模型

    在Java进阶知识的学习中,JVM都是避不过去的一关,我个人对于JVM的理解其实就是相当于在操作系统的外层再加了一层中间层,从来屏蔽了具体硬件之间的不同实现,使得Java实现了最重要的特性:一次编译, ...

  10. Jvm 内存浅析 及 GC个人学习总结

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

随机推荐

  1. .NET MAUI (微软 .Net 6 跨多平台应用 UI)框架的研究学习

    针对 .NET MAUI (微软 .Net 6 跨多平台应用 UI)框架的研究学习,使用VS2022  C# 和 XAML 创建本机移动和桌面应用,开发一套代码可以发布在 Android . iOS ...

  2. (转)Harbor 启用镜像扫描功能方法

    A demo environment with the latest Harbor stable build installed. For additional information please ...

  3. 快速上手Linux核心命令(二):关机、重启

    @ 目录 前言 一.在命令行下查看命令帮助 man 命令 --help 命令 info命令 二.Linux关机.重启 shutdown reboot.halt.poweroff 前言 从这篇开始,我们 ...

  4. 鲲鹏基础软件开发赛道openLooKeng赛题火热报名中,数十万大奖等您来收割

    随着云计算.物联网.移动计算.智慧城市.人工智能等领域的发展,各类应用对大数据处理的需求也发生着变化.以实时分析.离线分析.交互式分析等为代表的计算引擎逐渐为各大企业行业发展所看重.作为鲲鹏产业生态的 ...

  5. 带你读AI论文丨用于细粒度分类的Transformer结构—TransFG

    摘要:本文解读了<TransFG: A Transformer Architecture for Fine-grained Recognition>,该论文针对细粒度分类任务,提出了对应的 ...

  6. 一起玩转玩转LiteOS组件:Opus

    摘要:Opus编码器是一个开源的有损声音编码格式,适用于网络实时声音传输,标准格式为RFC 6716,相对于其他编码格式来说,保真性更好. 本文分享自华为云社区<LiteOS组件尝鲜-玩转Opu ...

  7. 使用appuploader工具发布证书和描述性文件教程

    使用APPuploader工具发布证书和描述性文件教程 之前用AppCan平台开发了一个应用,平台可以同时生成安卓版和苹果版,想着也把这应用上架到App Store试试,于是找同学借了个苹果开发者账号 ...

  8. HanLP — HMM隐马尔可夫模型 -- 语料库

    隐马尔可可夫模型(Hidden Markov Model,HMM)是统计模型,用于描述一个含有隐含未知参数的马尔可夫过程. HMM由初始概率分布.状态转移概率分布和观测概率分布确定. BMES =&g ...

  9. PPT 没有电脑如何制作PPT

    没有电脑如何制作PPT

  10. 【django-vue】七牛云上传视频 搜索接口 支付宝sdk二次封装 下单接口 前端支付页面 支付成功回调接口

    目录 上节回顾 课程详情接口 choice字段 今日内容 1 文件存储 1.1 七牛云上传文件 2 搜索导航栏 2.1 Header.vue 3 搜索接口 4 搜索页面 5 支付宝支付介绍 5.1 支 ...