首页 > 其他分享 >JVM异常现象解析

JVM异常现象解析

时间:2024-10-12 20:44:30浏览次数:1  
标签:解析 操作系统 占用 归还 内存 JVM 异常现象 空闲

1、Java进程内存不回落

异常现象:针对 Java 应用进程进行压力测试,在压测过程中进程内存逐渐升高,但在压测结束后,进程占用内存仍然一直很高不回落,奇怪的是此时堆内存占用其实很低。即 Java应用一直占用高内存并且在空闲时也并未将内存归还给操作系统,这与通常的认知不同。

“JVM 的垃圾回收,只是一个逻辑上的回收,回收的只是 JVM 申请的那一块逻辑堆区域,将数据标记为空闲之类的操作,不是调用 free 将内存归还给操作系统”

 

 

1.1、操作系统与JVM的内存分配

JVM 的自动内存管理,其实只是先向操作系统申请了一大块内存,然后自己在这块已申请的内存区域中进行“自动内存管理”。JAVA 中的对象在创建前,会先从申请的这一大块内存中划分出一部分来给这个对象使用,在 GC 时也只是这个对象所处的内存区域数据清空,标记为空闲而已。JVM 归还内存给操作系统的代价比较大,所以不会轻易进行,JVM 不会在每次 GC 后都进行内存的归还。

虽然代价高,但 JVM 还是提供了这个归还内存的功能。JVM 提供了-XX:MinHeapFreeRatio和-XX:MaxHeapFreeRatio 两个参数,用于配置这个归还策略。

  • MinHeapFreeRatio:表示空闲内存最少保留的比例值,当使用内存越来越大,空闲区域小于比值时,会进行扩容,扩容的上限为 Xmx。如果是在收缩过程,剩余内存达到这个阈值后,就会停止收缩。
  • MaxHeapFreeRatio:代表当空闲区域达到该值时,会进行“缩容”,缩容的下限为Xms

不过虽然有这个归还的功能,不过因为这个代价比较昂贵,所以 JVM 在归还的时候,是线性递增归还的,并不是一次全部归还。而且经过实测,这个归还内存的机制,在不同的垃圾回收器,甚至不同的 JDK 版本中还不一样!

 

一般为了避免 JVM 频繁的扩容缩容,我们会将 Xms 和 Xmx 配置为相等的大小,避免这个扩容的操作。

那是不是只要把 Xms 和 Xmx 配置成一样的大小,这个 JAVA 进程一启动就会占用这个大小的内存呢?并不是的,不会的,哪怕你 Xms6G,启动也只会占用实际写入的内存。这是因为进程在申请内存时,操作系统并不是直接分配物理内存给进程的,而是分配一块虚拟空间,到真正往这块虚拟空间写入数据时才会通过缺页异常(Page Fault)处理机制分配物理内存。可以简单地认为操作系统的内存分配是“惰性”的,分配并不会发生实际的占用,有数据写入时才会发生内存占用。所以哪怕配置了Xms6G,启动后也不会直接占用 6G 内存,实际占用的内存取决于你有没有往这 6G 内存区域中写数据的。

 

标签:解析,操作系统,占用,归还,内存,JVM,异常现象,空闲
From: https://www.cnblogs.com/wenxuehai/p/18461462

相关文章

  • 从组会尴尬到学术突破:Transformer助力跨域推荐解析
    最近学习了Transformer模型,突然意识到我常阅读的一篇论文中也使用了Transformer。回想起上次开组会时,老师问我论文中的模型是什么,我当时没有答上来,现在才发现其实用的就是Transformer。这种学习过程让我深感,学得越多,知识之间的联系就会越清晰,许多概念最终都能融会贯通。这......
  • BUUCTF_MISC题解析(7)
    7.wireshark下载文件发现里面是一个pcap格式的文件。而pcap格式就是网络分析工具保存的网络数据包,是捕获的从网卡发送或者接收的每一个数据包的离线网络流量。 在wireshark官网上下载wireshark,wireshark是网络封包分析工具。将文件用wireshark打开,发现有三个部分,上半部分绿......
  • 记录一篇 jvm内容:主要为 堆方向
    运行时数据区:Java虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域。根据《java虚拟机规范》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区。 Java堆(JavaHea......
  • 使用Lua语言破解滑块验证码的完整流程解析
    本文将使用Lua语言来破解滑块验证码,带领大家一步步实现验证码破解,包括获取图片、计算滑块移动距离、生成滑动轨迹等。下载验证码图片首先,我们要获取滑块的前景图片和背景图片。使用Lua中的socket.http来进行HTTP请求并下载图片。lualocalhttp=require("socket.ht......
  • R星平台新下载游戏出现“找不到VCRUNTIME140.dll无法执行代码”的原因解析
    当玩家在R星(RockstarGames)平台新下载并尝试运行游戏时,如果遇到“找不到VCRUNTIME140.dll无法执行代码”的错误提示,这通常意味着系统中缺少必要的动态链接库文件VCRUNTIME140.dll。以下是对该问题的详细原因解析:一、VCRUNTIME140.dll文件的重要性VCRUNTIME140.dll是Microsof......
  • 《GESP2级2306》 解析
    一、单选题(每题2分,共30分)1.高级语言编写的程序需要经过以下(D)操作,可以生成在计算机上运行的可执行代码。A.编辑B.保存C.调试D.编译在高级语言编程过程中,要生成在计算机上运行的可执行代码,需要经过一系列的操作。针对给出的选项,我们可以逐一分析:A.编辑-这是......
  • 《GESP3级2306 单选题判断题》 解析
    描述一、单选题(每题2分,共30分)1.高级语言编写的程序需要经过以下(D)操作,可以生成在计算机上运行的可执行代码。A.编辑B.保存C.调试D.编译这是一道关于程序开发流程的问题。我们来逐一分析各个选项,并确定哪个操作是生成可执行代码的关键步骤。‌编辑(A选项)‌:编辑......
  • buildozer.spec 文件的详细解析
    文章目录1.基础信息2.需求3.权限4.输出5.图标和主题6.其他设置7.额外平台设置8.其他重要选项8.1调试模式8.2运行时设置9.完整范例10.使用buildozer总结buildozer.spec文件是Kivy应用的打包配置文件,用于在使用Buildozer创建Android或其他平台的......
  • 深入解析Spring AI框架:在Java应用中实现智能化交互的关键
    今天我们的SpringAI源码分析主题即将结束。我已经对自己感兴趣的基本内容进行了全面的审视,并将这些分析分享给大家。如果你对这个主题感兴趣,可以阅读以下几篇文章。每篇文章都层层递进,深入探讨相关内容。考虑到长文可能让大家感到疲惫,我采用了逐步推进的方式,确保每一篇都简明易懂......
  • 【有啥问啥】逆向工程(Reverse Engineering,RE):深度解析与技术方法
    逆向工程(ReverseEngineering,RE):深度解析与技术方法引言逆向工程(ReverseEngineering,简称RE),作为现代科技领域中的一项重要技术,其影响力已远远超越了传统的硬件拆解范畴。在软件安全、产品设计优化、知识产权保护,以及教育与研究等多个领域,逆向工程都展现出了其独特的价值和......