当前位置: 首页 > 面试题库 >

调查内存使用情况时,GC_FOR_ALLOC是否更“严肃”?

米树
2023-03-14
问题内容

我目前正在调查Android应用程序中的垃圾回收问题,并且很好奇是否与其他GC消息(例如GC_CONCURRENT)相比,GC_FOR_ALLOC所指示的问题更大。

据我了解,GC_CONCURRENT正在执行垃圾收集器应做的事情。堆已达到特定限制,最好去清理内存。

GC_FOR_ALLOC向我建议,如果我尝试创建一个对象并且没有剩余的内存可以做,那么将会发生更严重的事情。

GC消息是否具有优先级或“严重性”级别?


问题答案:

从某种意义上讲,GC_FOR_ALLOC它比更为严重GC_CONCURRENT,因为这GC_FOR_ALLOC意味着没有足够的可用内存来满足分配请求,因此必须进行垃圾回收,而GC_CONCURRENT这仅意味着GC感觉像在运行,通常是因为可用内存量变得低于分配后的某个阈值。

但是,A GC_FOR_ALLOC本身并不表示您的应用程序有问题:

  • Android应用程序以一个小的堆开始,当应用程序需要越来越多的内存时,该堆会增长(达到一定程度),并且GC_FOR_ALLOC在增加堆大小之前先完成一个堆。在这种情况下GC_FOR_ALLOC是完全正常的。
  • 如果分配内存的速度快于并发GC有时间释放内存,这GC_FOR_ALLOC是不可避免的。而且,分配内存的速度没有比并发GC释放内存的速度固有的错误。

在Android上GC_BEFORE_OOM,更严重的GC类型是,当分配请求失败后GC_FOR_ALLOC,甚至在应用程序堆增长到允许的最大大小时,也会执行GC
。当发生这种情况时,作为最后的选择,Dalvik将在尝试最后一次分配内存之前,也尝试释放SoftReferences,如果失败,则抛出OutOfMemory异常。

如果您想查看此逻辑的代码tryMalloc(),请参阅dalvik.git / vm / alloc /
Heap.cpp中的代码。

无论如何,如果您不介意的话,我怀疑查看logcat输出是调试垃圾回收问题的最有效方法。我不知道您遇到什么具体问题,但是您是否研究过DDMS中的“分配跟踪器”之类的hprof- conv工具,并借助该工具分析堆转储?(例如,请参见http://android-
developers.blogspot.se/2011/03/memory-analysis-for-
android.html
入门)。



 类似资料:
  • 问题内容: 是否有一个准则来估计a消耗的内存量? 寻找类似于这些准则的估计内存使用情况的东西。 问题答案: 如果您查看源代码中的字段,则有: 的评论说 用于存储规范的字符串表示形式(如果已计算)。 假设您不调用,它将保留为零字节。因此是(8 + 4 + 4)= 16个字节+ 。 本身是4 + 4 + 4 + 4 + 4 = 20字节+ 。 20 + 16总共提供了36个字节加上大小,该大小始终是表

  • 问题内容: 我正在使用Linux,go和os /exec运行一些命令。我想知道一个进程的实时内存使用情况。这意味着我可以在启动进程后的任何时间(而不是在运行之后)随时请求内存使用情况。 (这就是为什么在回答测量使用golang可执行文件运行的内存使用量是 不是 一种选择对我来说) 例如: 我不需要非常精确的值,但是如果它的错误范围小于10兆字节,那就太好了。 有没有办法做到这一点,或者我需要某种命

  • 问题内容: 我在此处粘贴一些代码,这些代码使用boost iostream进行mmap并写入映射的文件: 当我在具有8个处理器和16GB RAM的centos 6机器上执行此操作时,我观察到以下内容: 当将数据插入到内存映射文件中时,RES(来自顶部命令)不断增加,直到14GB。我的印象是,当我映射文件时,VIRT将增加而不是RES。那么当我们写入mmap文件时,是先将其写入内存,然后再提交到磁盘

  • 问题内容: 有什么工具可以知道我的Java应用程序已使用了多少个本机内存?我的应用程序内存不足:当前设置是:-Xmx900m 计算机,Windows 2003 Server 32位,RAM 4GB。 还在Windows上将boot.ini更改为/ 3GB,会有什么不同吗?如果设置为Xmx900m,则可以为此进程分配多少最大本机内存?是1100m吗? 问题答案: (就我而言,我使用的是Java 8)

  • 问题内容: 我目前正在测试将密钥插入数据库Redis(在本地)中。我有超过500万个密钥,而且我只有4GB的RAM,所以一时我达到了RAM的容量并交换了数据(并且我的PC掉了)。 我的问题是:如何在具有Redis数据库的计算机上监视内存使用情况,并以此方式发出警报,不再在Redis数据库中插入某些密钥? 谢谢。 问题答案: 关于内存使用情况,建议您查看redis.io 常见问题解答以及有关将red

  • 本文向大家介绍python中使用psutil查看内存占用的情况,包括了python中使用psutil查看内存占用的情况的使用技巧和注意事项,需要的朋友参考一下 有的时候需要对python程序内存占用进行监控,这个时候可以用到psutil库,Anaconda中是自带的,如果import出错,可以用pip install psutil(安装在python中)或conda install psutil(