Java String.format()是否存在内存泄漏

Java String.format()是否存在内存泄漏,java,memory,memory-leaks,string.format,Java,Memory,Memory Leaks,String.format,在while循环中,我注意到在windows任务管理器中,java应用程序进程使用的内存一直在增加,大约每秒几k。String.format是否存在内存问题 String str = String.format("%dDays %02d : %02d : %02d",days,hours,minutes,seconds); 如果此后没有在任何地方使用str,那只是因为垃圾收集器没有运行,所以应该释放的内存还没有被收集。这可能是因为Java不需要它(因为它还有一些保留页)然而,Java在开始回收

在while循环中,我注意到在windows任务管理器中,java应用程序进程使用的内存一直在增加,大约每秒几k。String.format是否存在内存问题

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

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

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

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


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

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


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

如果您执行以下操作,则会有所帮助:

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

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

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

垃圾收集器在有理由运行之前不会运行,您可能还没有达到该限制,因此Java不会从缓冲区收集释放的内存。您如何处理每个
str
?我将str放在JLabel上,正如您所说,这一定是GC的工作方式
java.util.Formatter
将在其构造函数中使用StringBuilder,如果这对您有帮助的话。垃圾收集器只有在有理由运行时才会运行,你可能还没有达到这个限制,所以Java没有从缓冲区收集释放的内存。你如何处理每个
str
?我把str放在一个JLabel上,正如你所说,这一定是GC的工作方式
Java.util.Formatter
将在其构造函数中使用StringBuilder,如果这对你有帮助的话。我只是把str放在一个JLabel上,我完全同意你说的是GCI只是把str放在一个JLabel上,我完全同意你说的是GC