1

我在while循环中有这个语句,我注意到在windows任务管理器中,java应用进程使用的内存不断增加,大约每秒几k。String.format 是否存在内存问题?

String str = String.format("%dDays %02d : %02d : %02d",days,hours,minutes,seconds);
4

3 回答 3

1

如果之后你没有str在任何地方使用,那只是垃圾收集器没有运行,所以应该释放的内存还没有被收集。这可能是因为 Java 不需要它(因为它还有一些保留页面),但由于运行垃圾收集器是一项昂贵的任务,Java 在开始回收内存之前必须使用一定数量的内存。

于 2013-01-15T00:21:19.433 回答
0

如果您执行以下操作应该会有所帮助:

String days = "Monday";
String hours = "10:00pm";
String minutes = "60";
String seconds = "01";

while(condition){
     String str = String.format("%dDays %02d : %02d : %02d",days,hours,minutes,seconds);
}

这将传递对字符串的引用,而不是为循环中每次迭代的每个字符串占用 32 位。如果您无法确定循环中的字符串,请尝试切换到字符或字节(如果可能),这将减少您使用的内存量。

如果你想强制垃圾收集器运行(非常不安全)看这里

http://stackoverflow.com/questions/1481178/forcing-garbage-collection-in-java
于 2013-01-15T00:37:09.947 回答
0

我将假设您不保留对您创建的字符串的引用。

基本上,该调用每次运行时都会创建一个新对象。这些对象保留在内存中,直到 Java 虚拟机决定执行垃圾回收。JVM 在确定有必要之前不会这样做。必要的通常是当您的内存使用量超过某个阈值时。该阈值将取决于您的机器和启动 JVM 的设置。

于 2013-01-15T00:21:40.213 回答