Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Runtime.freemory()和GC跟踪JVM上的任何对象实例化_Java_Optimization_Memory_Garbage Collection_Benchmarking - Fatal编程技术网

Java 如何使用Runtime.freemory()和GC跟踪JVM上的任何对象实例化

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

我在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.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 !!!!

    }
}