Tag: 内存

什么是内存碎片?

我曾经听说过在C ++dynamic内存分配的环境中使用了几次“内存碎片”。 我发现了一些关于如何处理内存碎片的问题,但是找不到直接处理内存的问题。 所以: 什么是内存碎片? 如何判断内存碎片对我的应用程序是否有问题? 什么样的节目最有可能遭受? 处理内存碎片的常见方法是什么? 也: 我听说使用dynamic分配很多可以增加内存碎片。 这是真的? 在C ++的上下文中,我理解所有的标准容器(std :: string,std :: vector等)都使用dynamic内存分配。 如果在整个程序中使用这些(特别是std :: string),内存碎片更可能是一个问题? 内存碎片怎么处理在一个STL沉重的应用程序?

内存alignment的目的

诚然,我不明白。 假设你有一个长度为1字节的内存字的内存。 为什么不能在一个不alignment的地址(即不能被4整除)的单个存储器访问中访问一个4字节长的variables,就像alignment地址一样?

如何在Java中监视计算机的CPU,内存和磁盘使用情况?

我想在Java中监视以下系统信息: 当前CPU使用率**(百分比) 可用内存*(免费/总计) 可用磁盘空间(免费/总计) *请注意,我的意思是整个系统可用的全部内存,而不仅仅是JVM。 我正在寻找一种跨平台的解决scheme(Linux,Mac和Windows),它不依赖我自己的调用外部程序或使用JNI的代码。 虽然这些是可行的select,但如果有人已经有了更好的解决scheme,我宁愿不自己维护特定于操作系统的代码。 如果有一个免费的库,它以可靠的,跨平台的方式做到这一点,这将是伟大的(即使它使外部调用或使用本机代码本身)。 任何build议,非常感谢。 为了澄清,我想获得整个系统的当前CPU使用率,而不仅仅是Java进程。 SIGAR API提供了我正在寻找的所有function,所以这是迄今为止我的问题的最佳答案。 但是,由于它是根据GPL许可的,我不能将其用于我原来的目的(封闭源代码,商业产品)。 Hyperic有可能将SIGAR许可用于商业用途,但我没有仔细研究过它。 对于我的GPL项目,我将来肯定会考虑SIGAR。 对于我目前的需求,我倾向于以下几点: 对于CPU使用率,OperatingSystemMXBean.getSystemLoadAverage()/ OperatingSystemMXBean.getAvailableProcessors()(每个CPU的平均负载) 对于内存,OperatingSystemMXBean.getTotalPhysicalMemorySize()和OperatingSystemMXBean.getFreePhysicalMemorySize() 对于磁盘空间,File.getTotalSpace()和File.getUsableSpace() 限制: getSystemLoadAverage()和磁盘空间查询方法仅在Java 6下可用。另外,某些JMXfunction可能不适用于所有平台(即,据报道getSystemLoadAverage()在Windows上返回-1)。 虽然最初是根据GPL授权的,但它已经改为 Apache 2.0 ,通常可以用于封闭源代码的商业产品。

Linux下Java的虚拟内存使用情况,使用的内存太多

我在Linux下运行的Java应用程序有问题。 当我启动应用程序,使用默认的最大堆大小(64mb),我看到使用顶部应用程序,240 MB的虚拟内存分配给应用程序。 这就造成了一些与计算机上的其他软件有关的问题,这是相对资源有限的。 据我所知,保留的虚拟内存不会被使用,因为一旦我们达到了堆的限制,就会抛出一个OutOfMemoryError。 我在Windows下运行相同的应用程序,我发现虚拟内存大小和堆大小是相似的。 有什么办法可以在Linux下configuration虚拟内存用于Java进程吗? 编辑1:问题不是堆。 问题是,如果我设置一个128M的堆,例如,仍然Linux分配210 MB的虚拟内存,这是不需要的,永远。** 编辑2:使用ulimit -v可以限制虚拟内存的数量。 如果大小设置在204 MB以下,那么应用程序将不会运行,即使它不需要204MB,只有64MB。 所以我想了解为什么java需要这么多的虚拟内存。 这可以改变吗? 编辑3:系统中还有其他几个正在运行的应用程序。 系统确实有一个虚拟内存限制。 (来自评论,重要的细节)

在.NET中使用后将对象设置为Null / Nothing

一旦你完成了它们,你应该把所有的对象都设置为null (VB.NET中Nothing ) 我知道,在.NET中,处理实现IDisposable接口的对象的任何实例都是必要的,以释放一些资源,尽pipe对象在处置后仍然可以是某种东西(因此在表单中是isDisposed属性),所以我认为它可以仍然驻留在记忆中,或至less部分存在? 我也知道,当一个对象超出范围时,它将被标记为垃圾收集器的下一个传递的收集(尽pipe这可能需要时间)。 所以考虑到这一点,将它设置null速度释放内存的系统,因为它不需要解决它不在范围内,并且是否有任何不良副作用? MSDN文章从来没有在例子中做到这一点,目前我这样做,因为我不能看到伤害。 不过,我遇到了各种意见,所以任何意见都是有用的。

了解Cocoa和Objective-C的引用计数

我只是开始看Objective-C和Cocoa,以期玩iPhone SDK。 我对C的malloc和free概念很合适,但Cocoa的引用计数scheme让我颇为困惑。 一旦你了解它,我就会被告知它非常优雅,但是我还没有完成。 如何release , retain和autorelease工作以及有关使用约定是什么? (或者说失败了,你读了什么帮助你得到了它?)

java.lang.OutOfMemoryError:Java堆空间

我正在执行multithreading程序时出现以下错误 java.lang.OutOfMemoryError: Java heap space 上述错误发生在其中一个线程中。 根据我的知识,堆空间仅由实例variables占用。 如果这是正确的,那么为什么这个错误在运行正常之后发生,因为在创build对象时分配了实例variables的空间。 有没有办法增加堆空间? 我应该对我的程序做些什么改变,以便占用更less的堆空间?

在Android中检测应用程序堆大小

如何以编程方式检测Android应用程序可用的应用程序堆大小? 我听说有一个函数可以在SDK的更高版本中执行此操作。 无论如何,我正在寻找适用于1.5及以上的解决scheme。

CLR 4.0中单个对象的大小仍然限制在2 GB?

据我了解,在.NET中的单个实例有2 GB的限制。 由于我迄今为止主要在32位操作系统上工作,所以我没有付出太多的关注。 在32上,反正它或多或less是一个人为的限制。 不过,我很惊讶地发现这个限制也适用于64位.NET 。 由于List<T>等集合使用数组来存储项目,这意味着运行在32位上的.NET应用程序与在64位上运行的相同应用程序相比,能够在列表中容纳两倍的引用types项目。 这是令人惊讶的IMO。 有谁知道这个限制是否在CLR 4.0中解决(我目前没有安装4.0版本)。

如何测量应用程序或进程的实际内存使用情况?

这个问题在这里详细介绍。 如何衡量Linux中的应用程序或进程的内存使用情况? 从Linux上理解内存使用的博客文章中, ps并不是一个准确的工具。 为什么ps是“错误的” 根据你如何看它, ps不报告进程的真实内存使用情况。 它真正在做的是显示每个进程如果是唯一运行的进程将占用多less真实内存。 当然,典型的Linux机器在任何时候都有数十个进程在运行,这意味着由ps报告的VSZ和RSS数字几乎肯定是错误的 。