我们的 Oracle 数据库运行在 64 位 Windows Server 2003 Enterprise Edition 上,具有 32GB RAM。
数据库已配置为使用 10GB 作为 SGA(目标 = 最大 = 10GB)和 5GB 作为缓存。启动时,任务管理器将显示大约 12GB 的可用内存。在此服务器上,唯一运行的应用程序是数据库。白天,我们会看到可用内存一直下降到 4MB。
我们想找出哪个应用程序占用了可用内存。任务管理器和 perfmon 上的内存使用量均未增加。我们怀疑某个进程占用了可用内存但未释放。我们该怎么做?
答案1
检查分配给内核/驱动程序的内存。可能是驱动程序泄漏了内存。服务器是虚拟机吗?如果是虚拟机,并且您有半虚拟化内存管理器(如 VMware Tools 附带的内存管理器),气球驱动程序可以占用一些可用内存,供其他虚拟机使用。检查主机上的内存是否过量使用。
答案2
我们怀疑某个进程正在占用可用内存并且没有释放它。
听起来不太可能,如果是这样的话它应该出现在 Perfmon 和 Taskmanager 中。
如果你运行一个需要大量内存的进程会发生什么?(例如http://www.soft.tahionic.com/download-memalloc/index.html- 我还没有尝试过)它可以不使用页面文件来分配它吗?如果是这样,那么就没有其他正常进程使用内存,它可能会用于一些幕后机会性系统使用,如缓存。
我相信 Windows 不会清空已分配的内存,除非有其他程序请求它。否则您昂贵的 RAM 只是浪费在未使用的地方。
现在,当一个进程需要新的 RAM 页时,备用列表是系统最后查看的地方。它首先查看零页列表或空闲页列表,具体取决于要对新页执行什么操作。只有当这两个列表都为空时,备用列表才会被搜查。因此,与此同时,如果一个进程对最近丢弃的页面发生故障,以至于该页面仍在备用列表中,则可以将该页面弹回工作集,并解决页面故障,而无需转到磁盘。备用列表可以被视为每个人工作集的一种系统范围的扩展。或者换句话说,它是一种页面缓存。由于这一点,再加上共享内存机制和其他一些因素,通常只有大约 10% 的页面错误需要磁盘读取来解决。大多数都在内存中解决。” -http://arstechnica.com/civis/viewtopic.php?p=10593745#p10593745