none
从任务管理器中发现:进程占用内存从7G逐渐降低到1G,然后又升到7G,这是怎么回事? RRS feed

  • 问题

  • OS Name: Windows 2003; OS Version: 5.2; OS Architecture: amd64

    进程为:Java HotSpot(TM) 64-Bit Server VM (1.5.0_20-b02, mixed mode);

    怎么会出现这种情况? 该进程对应的软件没有短时间的释放并短时间快速增长内存的功能。

    谢谢!

    2012年12月5日 12:08

答案

  • 请问一下,你指的内存值,是任务管理器里的哪个标题?WorkingSet还是CommitSize?

    2012年12月19日 6:59
  • 这个问题,可能要从这个Java VM程序本身考虑,它是不是Java虚拟机,用于宿主Java App的?如果是,其是否有定期的垃圾回收机制?如果是,多久一次?是否吻合你的问题发生周期?

    另外,Windows下,进程的WorkingSet突然缩小,我所知至少有三种情况:

    1. 进程本身释放内存。这也就是前面需要考虑的那几个问题的可能性。

    2. 当系统物理内存被全部吃满后,进程间会互抢内存,且Windows的内存管理遵循LIFO(后进先出)机制:如果有进程急需使用内存,则系统会先将某些进程中Idle了最久的Page踢出WorkingSet(即物理RAM)丢到PageFile去,腾出的RAM就被应用于这些正急需touch物理内存的进程。也许你的JavaVM就是这么个不幸的被踢者(当时是否有启动别的什么大Memory Consumer的应用?如数据库、磁盘备份等)

    3. 另一个程序使用了EmptyWorkingSet这个WinAPI去对你的这个进程进行了一次显式的WorkingSetTriming。这个操作,VMMap就可以做。

    当然,Windows的内存管理不止这么简单,但都是有原则的。如果以上这些情况都不满足你的真实情形,那么我们再进一步分析研究吧,办法还是有滴~


    2012年12月25日 1:40

全部回复

  • 当时该对应用做了哪些操作?

    在IT的路上,You'll never walk alone

    2012年12月6日 7:18
  • 谢谢回复!

    应用系统和平时一样的操作。

    任务管理器打开着,一直在监控外,没人做任何操作。


    2012年12月7日 6:04
  • 是否有知道原因的?多谢!
    2012年12月17日 13:00
  • 类似现象有规律吗?每次都这样?

    在IT的路上,You'll never walk alone

    2012年12月18日 3:39
  • 请问一下,你指的内存值,是任务管理器里的哪个标题?WorkingSet还是CommitSize?

    2012年12月19日 6:59
  • 多谢两位回复:

    1、没有规律,半个月或者几天出现一次。

    2、任务管理器里的workingset的大小。

    2012年12月21日 12:52
  • 多谢两位回复:

    1、没有规律,半个月或者几天出现一次。

    2、任务管理器里的workingset的大小。


    2012年12月21日 12:52
  • 多谢两位回复:

    1、没有规律,半个月或者几天出现一次。现在也就出现过两次,每次都这样

    2、任务管理器里的workingset的大小。


    2012年12月21日 12:53
  • 这个问题,可能要从这个Java VM程序本身考虑,它是不是Java虚拟机,用于宿主Java App的?如果是,其是否有定期的垃圾回收机制?如果是,多久一次?是否吻合你的问题发生周期?

    另外,Windows下,进程的WorkingSet突然缩小,我所知至少有三种情况:

    1. 进程本身释放内存。这也就是前面需要考虑的那几个问题的可能性。

    2. 当系统物理内存被全部吃满后,进程间会互抢内存,且Windows的内存管理遵循LIFO(后进先出)机制:如果有进程急需使用内存,则系统会先将某些进程中Idle了最久的Page踢出WorkingSet(即物理RAM)丢到PageFile去,腾出的RAM就被应用于这些正急需touch物理内存的进程。也许你的JavaVM就是这么个不幸的被踢者(当时是否有启动别的什么大Memory Consumer的应用?如数据库、磁盘备份等)

    3. 另一个程序使用了EmptyWorkingSet这个WinAPI去对你的这个进程进行了一次显式的WorkingSetTriming。这个操作,VMMap就可以做。

    当然,Windows的内存管理不止这么简单,但都是有原则的。如果以上这些情况都不满足你的真实情形,那么我们再进一步分析研究吧,办法还是有滴~


    2012年12月25日 1:40
  • 多谢回复!

    这种情况和JVM GC的频率不吻合,GC频率高的多。估计可以排除GC的问题。

    至于第二点,下次出现时再确认,但是从任务管理器里面看,整体内存确实是先释放再增加,并没有出现平稳的情况(即JVM进程释放,另外一个进程使用,总和不变)。我也一直希望是这种情况,但这种应用服务器基本上都是专用,没有其他耗内存的软件。病毒防护之类不应该消耗那么多内存吧?因为没看见那个进程的内存消耗涨上去了。

    第三点,不了解这个API,也没有使用过,应该没有安装过相关的软件。

    2013年9月6日 22:33