一丶背景

项目出现内存报警,当我们导出大文件excel的时候。以下是相关参数与猜想。

jvm参数:-Xms8192m

excel文件大小:一个二十多万行的excel数据。

报警条件:物理内存高于80%会触发报警

相关猜想:按理说堆内存我们一来就分配好8个g的物理内存,导出文件触发的堆内存增长应该不会引起物理内存的增长。

二丶结论

此次报警,属于正常能预期到的现象,我们线上程序并未受到影响。我们jvm参数配置Xms8192m,实际上分配的是虚拟地址空间,并不是实际的物理内存,导出excel的时候堆空间大量增长,那么对应的虚拟地址就会去大量的命中实际的物理内存,所以就算我们堆空间的内存降下去后,实际命中的物理内存也分配给了对应的堆内存,导致物理内存永久下降。

三丶虚拟地址空间

我们的进程其实是运行在虚拟地址空间里,cpu的寻物理内存址过程其实是对虚拟地址的地址翻译后再找到实际的物理地址。

为什么我们使用虚拟地址呢?

  1. 让每个进程拥有了相同的、独立内存空间,相互之间不会干扰

    • 如果没有虚拟地址,每个进程直接对物理内存进行操作,势必会存在各个进程相互影响而无法正常进行。
  2. 方便各个进程之间内存共享

    • 可以映射到不同的物理内存。其实不同进程的虚拟地址也可以映射到相同的物理内存以实现内存共享。
    • 比如每个操作系统的进程,都会需要跟内核程序打交道。有了内存共享,多个进程间就可以共用内核程序,而不需要为每一个进程在物理内存里加载一份内核程序。
  3. 不连续的物理空间可以映射成连续的虚拟地址空间

    • 可以将碎片化的物理内存映射到连续的虚拟地址。
  4. 进程分配的内存空间只有在实际使用时,才会触发缺页异常来分配实际物理空间,从而最大程度减少了内存空间的浪费。

    • 在我们使用虚拟地址空间时,如果没有对应的物理内存,就会出现我们常见的缓存不命中的情况。专业术语叫缺页异常。这时内核的缺页异常处理程序,将会帮助我们分配物理内存,如果物理内存不足,它将会选择一个物理内存页作为牺牲,写回磁盘上,这也就是我们所说的交换分区(linux叫做交换区,window上叫做虚拟内存)。

四丶jvm与虚拟地址空间

JVM进程,本质上就是一个用c++写的普通进程,起开始申请的地址其实是一个虚拟地址空间,并不是实际的物理内存,必须在分配的虚拟地址空间实际使用才会触发分配实际的物理内存。

五丶相关佐证

 从下图可以看出我们生产环境配置的物理内存的使用是远远小于我们分配的jvm参数配置Xms8192m,说明并不是随着程序的启动就分配了对应的物理内存。

六丶总结

我们生产环境监控的物理内存是监控包含了一部分的堆内存的大小,但是我们堆内存设置为-Xms8192m -Xmx8192m -Xmn2048m。实际上这个监控意义不大,因为这个年老代内存的增长是随着程序的运行时必定增长的。

七丶扩展-缺页

看完上述后相信有人肯定还有一些疑问,缺页到命中物理内存是怎么一个过程,那么首先我们的需要了解一些概念,虚拟内存,虚拟页,物理页,物理内存,页表,DRAM。

虚拟内存

  • 虚拟内存被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组,本质时磁盘上的对象,而每个自己对应的地址,我们就理解为虚拟地址。

虚拟页

  • 就是虚拟内存分割为固定大小的块,我们就叫做虚拟页,由上可以得知。虚拟页实际上时在磁盘上的

物理页:

  • 物理内存分割为固定大小的块,叫做物理页

DRAM:

  • 虚拟内存系统的缓存,在主存中缓存虚拟页,说通俗点,就是物理内存对应的虚拟系统(自己理解)

页表

  • 页表就是一个页表条目的数组,功能是将虚拟页映射到物理页,我们每次读取虚拟地址时,实际上读取的就是页表。页表可以形象的理解为虚拟页和物理页的一个管理,DRAM缓存内存时,如果缓存了物理地址,那么虚拟地址就能直接映射到物理地址,如果页表上没有缓存物理页,那么就是缺页异常,需要进行一次页面调度

页面调度过程缺页异常

  • 当我们去用虚拟内存地址时,我们DRAM没有缓存到物理页时,会触发一个缺页异常,内核会选择一个空闲的物理页作为牺牲页,并且将虚拟页磁盘的上复制到对应的物理页,那么这个虚拟页就缓存到了对应的物理页,虚拟地址就能直接映射物理地址了,完成了一次页面调度

八丶参考书籍

《深入理解计算机系统-第三版》

一次线上内存报警的研究相关推荐

  1. android线上内存监控_如何在Android上监控(和减少)您的数据使用情况

    android线上内存监控 Increasingly sophisticated phones and data-hungry applications make it easier than eve ...

  2. 一次jvm导致线上内存占用过高问题定位

    背景:8G物理内存,8核CPU,jvm使用的G1垃圾回收器. 问题:线上内存占用告警,内存占用超过85%,且现象一直持续. 分析 看一下jvm启动参数配置: -Xms6144m -Xmx6144m - ...

  3. 中国线上驾驶游戏市场深度研究分析报告

    [报告篇幅]:109 [报告图表数]:142 [报告出版时间]:2021年12月 报告摘要 2020年中国线上驾驶游戏市场规模达到了  亿元,预计2027年将达到  亿元,未来几年年复合增长率(CAG ...

  4. 线上内存溢出原因排除

    [分析] 如果机器比较紧缺,第一时间要恢复应用,可以直接先将该节点下线,保存线程栈快照,和堆内存快照.然后进行重启. 生产机器一般都是集群部署,如果只是某一台出现这种情况,可以不着急立即重启,保存现场 ...

  5. java内存溢出怎么排查_java线上内存溢出问题排查步骤

    一般线上遇到比较头疼的就是OOM内存溢出问题,我们都会先看错误日志,如果错误日志能够定位出哪个类对象导致内存溢出,那么我们只需要针对问题修改bug就好.但是很多时候我们单凭日志无法定位出内存溢出问题, ...

  6. 内存泄露(十)-- KOOM(高性能线上内存监控方案)

    KOOM介绍 OOMMonitor 介绍 KOOM线上APM监控最全剖析 一文看懂快手KOOM高性能监控方案 KOOM 浅析 [开源库剖析]KOOM V1.0.5 源码解析 目录 KOOM 功能 1. ...

  7. JVM垃圾回收与一次线上内存泄露问题分析和解决过程

    前言 内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果. Java是由C++发展来的,抛弃 ...

  8. BitArray虽好,但请不要滥用,又一次线上内存暴增排查

    一:背景 1. 讲故事 前天写了一篇大内存排查在园子里挺火,这是做自媒体最开心的事拉,干脆再来一篇满足大家胃口,上个月我写了一篇博客提到过使用bitmap对原来的List<CustomerID& ...

  9. java线上CPU、内存打满处理

    java线上内存打满处理 1.环境说明 2.mac 启动jvisualvm 3.模拟堆内存溢出 4. JVM参数-XX:+HeapDumpOnOutOfMemoryError 5.执行模块方法 6.发 ...

最新文章

  1. pytorch 学习中安装的包
  2. vsftpd.conf详解
  3. oracle学习笔记(十八) PL/SQL 游标
  4. 计算机一级b类论理,计算机一级B论理参考题.doc
  5. Qt Creator预览版
  6. ios html清除缓存,iOS开发之1行代码实现缓存计算及清除缓存
  7. linux vim 手册,Vim 参考手册
  8. java游戏背景_游戏背景音乐主要风格
  9. LA3713 Astronauts
  10. Java小白 学习笔记(二)——2020版Java语言基础
  11. JavaScript 鼠标移动事件
  12. VSLAM学习记录-求导:李群与李代数
  13. 小组取什么名字好_生日日期做网名,取什么名字好?
  14. 项目实战-----产品经理要做什么?
  15. 梦幻无穷的幻灯片切换效果
  16. PHP多人聊天系统,ttltCha​tPHP多人在线聊天系统软件源码 v0.0.12
  17. 全球正规外汇交易平台大全
  18. 怎么才能把windows里的文件复制到虚拟机的linux中去
  19. BILSTM原理介绍
  20. C型电磁阀连接器电磁阀插头,8mm针距

热门文章

  1. python list索引_Python按照索引访问list
  2. 动态设置 GridView Web 服务器控件列宽
  3. SQL语言基本语句介绍
  4. 【译】理解 JavaScript 中函数调用和 this
  5. Flask的上下文管理机制
  6. 揭开webRTC媒体服务器的神秘面纱——WebRTC媒体服务器开源项目介绍
  7. 中继技术助威 Wi-Fi网路涵盖范围三级跳
  8. VMware系列:将物理机热迁移到ESXi中(必藏喔)
  9. Linux下快捷键使用
  10. bzoj1588[HNOI2002]营业额统计