首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在没有任何请求的情况下,freeMemory()每隔一小时就会下降一次。

在没有任何请求的情况下,freeMemory()每隔一小时就会下降一次。
EN

Stack Overflow用户
提问于 2014-07-22 03:12:22
回答 1查看 174关注 0票数 0

当我将war部署到云服务器(PasS,128 my )时遇到了一个问题,然后我的应用程序中有两个定时器。

  1. Timer1将每一小时执行一次任务来记录我的内存(以及#2中描述的地图)。
  2. 每次我创建一个Room对象时,我都会将这个空间放入一个Map中,所以当我启动一个Roomto从地图中删除该对象时,我有一个Timer2来创建一个任务。

我碰巧知道我不应该用计时器。

但是问题是,我检查Timer1记录的日志,我的freeMemory每小时下降一次,总内存是相同的。

我读过What are Runtime.getRuntime().totalMemory() and freeMemory()?,所以我知道总内存和freeMemory意味着什么。根据日志,我用过的内存在上升!

PS:我不使用任何新的Runnable或线程来处理任何长期运行的逻辑.

日志类似于:

代码语言:javascript
复制
2014-07-22 04:39:27  [ Timer-10:44100005 ] - [ INFO ]  
maxMemory()=128
totalMemory() = 75
freeMemory()= 44
2014-07-22 04:39:27  [ Timer-10:44100005 ] - [ INFO ]  Now there are Existing Room of : 0

2014-07-22 05:39:27  [ Timer-10:47700005 ] - [ INFO ]  
maxMemory()=128
totalMemory() = 75
freeMemory()= 41
2014-07-22 05:39:27  [ Timer-10:47700005 ] - [ INFO ]  Now there are Existing Room of : 0

2014-07-22 06:39:27  [ Timer-10:51300006 ] - [ INFO ]  
maxMemory()=128
totalMemory() = 75
freeMemory()= 39

每当这个服务器接收到一个请求时,我都会记录下来,所以我确信没有传递请求,但是为什么空闲内存会下降。

1. Timer1就是这样工作的:

代码语言:javascript
复制
@Override
public void init() throws ServletException {
    super.init();
    LogUtil.info("CoreServlet inits");
    memoryTimer=new Timer(true);
    //check the memory every 1 hour,first time will be delayed to 15 mins later
    memoryTimer.schedule(new checkMemoryTask(),TimeConstant.FIFTHTEEN_MINUTES_MILISECONDS,TimeConstant.ONE_HOUR_MILISECONDS);
    commandService = CommandService.getInstance();
}

2. Timer2就是这样工作的。

代码语言:javascript
复制
public Room newRoom() {
    Integer randomNumObject;

    LogUtil.debug("Trying to new a room with the random number");
    //generate a random number util the number is not a existing room number    
    do {
        randomNumObject=generateRandom(4);//4 digits room number
    } while (roomMap.containsKey(randomNumObject));//roomNum is existing, continue to find  

    Room newRoom=new Room(randomNumObject);//use this number to create a new room

    roomMap.put(randomNumObject, newRoom);
    //abandon the room after 15 MINTES
    roomClearTimer.schedule(new abandonRoomTask(randomNumObject.intValue()), TimeConstant.FIFTHTEEN_MINUTES_MILISECONDS);
    LogUtil.info(newRoom+" is scheduled to be abandoned 15 MINUTES later");
    return newRoom;
}
EN

回答 1

Stack Overflow用户

发布于 2014-07-22 03:57:16

这里不一定有真正的问题。

正如freeMemory()的Javadoc声明的那样:

返回Java虚拟机中的空闲内存量。调用gc方法可能会增加freeMemory返回的值。

实际上,在Java程序中通常发生的情况是,当您分配新对象时,空闲内存量减少了同样的数量。当空闲内存量达到阈值时(由JVM决定),GC会在场景后面运行,并回收一堆垃圾。这会导致空闲内存再次恢复。

如果垃圾回收后立即释放的内存数量不断下降,则只会出现问题(例如内存泄漏)。

在您的具体情况下,freeMemory()向下移动的原因是对象正在被分配。(Timer2似乎是新对象的一个可能来源,但它也可能是web容器代码。)

如果那些物体不收集垃圾这才是个问题..。最终。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24878270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档