Java 如何使用Runtime.freemory()和GC跟踪JVM上的任何对象实例化
我在1.6.0_27-b07(Sun的JRE)中使用默认GC,因为我无法通过Runtime.getRuntime().freemory()检测到内存的增加。有人能解释一下如何做到这一点吗?我必须使用不同的GC吗?哪一个 下面的简单程序为分配的内存打印0:(:)(Java 如何使用Runtime.freemory()和GC跟踪JVM上的任何对象实例化,java,optimization,memory,garbage-collection,benchmarking,Java,Optimization,Memory,Garbage Collection,Benchmarking,我在1.6.0_27-b07(Sun的JRE)中使用默认GC,因为我无法通过Runtime.getRuntime().freemory()检测到内存的增加。有人能解释一下如何做到这一点吗?我必须使用不同的GC吗?哪一个 下面的简单程序为分配的内存打印0:(:)( import java.util.HashSet; 导入java.util.Set; 公共类备忘录{ 私有静态集=新HashSet(); 公共静态void main(字符串[]args){ long mem=Runtime.getRun
import java.util.HashSet;
导入java.util.Set;
公共类备忘录{
私有静态集=新HashSet();
公共静态void main(字符串[]args){
long mem=Runtime.getRuntime().freemory();
//现在创建一组对象并将它们保存在集合中
对于(int i=0;i<100;i++){
集合。添加(“foo”+i);
}
long allocated=mem-Runtime.getRuntime().freemory();
System.out.println(“内存已分配:+已分配);//=>给出0!!!!
}
}
这些对象将被分配到为短期对象保留的空间中,并且只有在它们存活一段时间后才会移动到主堆中
如果您想确切地了解应用程序创建的所有对象的情况,您确实需要使用探查器
这里有一些更多信息:尝试
新字符串(“foo”+i)
而不是“foo”+i
。文本字符串将存储在字符串池中。@Eng.Fouad Nope,这没有什么区别。这与David Tinker说的有关。@Eng.Fouad您可能会混淆intern()
方法,但是字符串(String)构造函数只是确保引用的char[]正是字符串的大小。您将能够通过JMX更好地监控内存使用情况。请参阅后续问题,因为freeMemory无法使用=>了解您,但我希望跟踪程序中的任何对象创建。我是否应该将GC更改为将所有内容写入堆的其他内容,以便使用freeMemory()跟踪它?这只是为了基准测试,不是为了生产。我不认为更改GC会有帮助。内存统计将取决于GC上次发生的时间等。我正为此提出一个新问题,因为freeMemory不能使用=>
import java.util.HashSet;
import java.util.Set;
public class MemoryUtils {
private static Set<String> set = new HashSet<String>();
public static void main(String[] args) {
long mem = Runtime.getRuntime().freeMemory();
// now create a bunch of objects and save them in the set
for (int i = 0; i < 100; i++) {
set.add("foo" + i);
}
long allocated = mem - Runtime.getRuntime().freeMemory();
System.out.println("Memory allocated: " + allocated); // ===> GIVES 0 !!!!
}
}