当我将war部署到云服务器(PasS,128 my )时遇到了一个问题,然后我的应用程序中有两个定时器。
Timer1将每一小时执行一次任务来记录我的内存(以及#2中描述的地图)。Timer2来创建一个任务。我碰巧知道我不应该用计时器。
但是问题是,我检查Timer1记录的日志,我的freeMemory每小时下降一次,总内存是相同的。
我读过What are Runtime.getRuntime().totalMemory() and freeMemory()?,所以我知道总内存和freeMemory意味着什么。根据日志,我用过的内存在上升!
PS:我不使用任何新的Runnable或线程来处理任何长期运行的逻辑.
日志类似于:
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就是这样工作的:
@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就是这样工作的。
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;
}发布于 2014-07-22 03:57:16
这里不一定有真正的问题。
正如freeMemory()的Javadoc声明的那样:
返回Java虚拟机中的空闲内存量。调用gc方法可能会增加freeMemory返回的值。
实际上,在Java程序中通常发生的情况是,当您分配新对象时,空闲内存量减少了同样的数量。当空闲内存量达到阈值时(由JVM决定),GC会在场景后面运行,并回收一堆垃圾。这会导致空闲内存再次恢复。
如果垃圾回收后立即释放的内存数量不断下降,则只会出现问题(例如内存泄漏)。
在您的具体情况下,freeMemory()向下移动的原因是对象正在被分配。(Timer2似乎是新对象的一个可能来源,但它也可能是web容器代码。)
如果那些物体不收集垃圾这才是个问题..。最终。
https://stackoverflow.com/questions/24878270
复制相似问题