现场工程师出手--虚拟化软件预留内存过大导致其他程序崩溃问题

本文主要是介绍现场工程师出手--虚拟化软件预留内存过大导致其他程序崩溃问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目场景:

一位学生有一台笔记本电脑,安装了Android,Kafka虚拟机很多软件。笔记本配置了20GB内存,固态硬盘,但最近很卡,Android Stuido经常闪退,一些游戏也无法运行。


问题描述

由于Android Studio是很耗内存的软件,首先想到观察内存,发现可用内存不足5%,资源监视器大量“硬中断”报警,说明存在大量的内存分配失败。同时页面缓存也涨到快10GB,更说明是内存不够了。这直接导致开启一些大型3D游戏时卡顿(大量的Page交换),安卓仿真器崩溃。使用进程工具统计所有进程的内存,发现总共才占了6GB不到,那另外12GB内存是谁占用了?


原因分析:

考虑到同学启动了一个debain的虚拟机作为一个本地服务器,测试一些新版本Kafka的功能。会不会是虚拟机的问题呢? 同学也说本来以为是的,但是把虚拟机的内存从8G下降到2GB,还是会内存爆满。

在现场,我再次终止虚拟机后,内存果然全部释放干净了。但这个虚拟机总共才2GB的内存配置,怎么可能占用如此多的内存呢?

我们试着复现现象:

  1. 重启笔记本,不启动虚拟机时,一切正常。
  2. 启动虚拟机,开启数据吞吐测试程序。这个程序会不断从虚拟机内存里吞吐大量的数据。
  3. 资源管理器发现内存缓慢涨大,并轻松突破了2GB的限制,持续膨胀。
  4. 最终内存全部用光,故障浮现。

这难道是虚拟机本身有内存泄露?由于几次测试,观察到除了正常的系统占用,内存增量基本是16GB左右就不再涨大,狐疑这个16GB是怎么回事。如果是软件故障,应该不会有上限,至少应该把页面文件都撑爆了再退出。但这个现象是由虚拟机占用的内存到达16GB就停止增长了。此时,若不运行别的软件,系统还是正常的。

抱着试一试的态度,在虚拟机设置页面瞎点,改了一堆参数,也没有用。结果,即将黔驴技穷的时候,在虚拟机的“全局配置”选项菜单里,有一个“预留内存”的选项,恰好是16GB多。

把这个预留内存下移到4GB,问题解决。


解决方案:

“预留内存”只要比虚拟机的配置内存大就行了。像同学开1个2GB的Debain,设置个4GB足够了。

可能技术背景解释

不是很熟悉这款软件,但有个猜测:

  1. 这个“预留内存”应该是指由虚拟机统管的全部内存。
  2. 虽然客户OS只有 2GB内存,但因为IO频繁,虚拟机软件为避免碎片化,会用所有的16GB预留内存来周转数据。
  3. 增长期,随着频繁的IO,内存不断涨大。2GB客户机里的new每次都在宿主的这16GB缓存的尾部新增长,而不是重用2GB的空间。
  4. 稳定期,16GB空间用完,回到头部去找新的空闲位置。

原理上图中,虽然蓝色的虚拟机2GB内存大小不变,但是在虚拟机预留内存中的位置却时刻变化,并逐步遍历了所有的预留内存。因此,这个“预留内存”如果不是专门用来跑虚机的电脑,千万不要设置太大。如果要吃鸡或者GTA,应该非常谨慎地设置内存。

这篇关于现场工程师出手--虚拟化软件预留内存过大导致其他程序崩溃问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978068

相关文章

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2