Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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内联初始化字符串数组内存分配?_Java_String_Heap_Permgen - Fatal编程技术网

堆上的Java内联初始化字符串数组内存分配?

堆上的Java内联初始化字符串数组内存分配?,java,string,heap,permgen,Java,String,Heap,Permgen,String[]stringArray=新字符串[]{“abc”,“xyz”} 执行这一行时,在PERMGEN空间中创建了两个字符串文本“abc”和“xyz”。由于初始化有一个新的操作符,我不确定堆上是否分配了内存 谢谢大家。除了字符串文字,所有对象都是在堆上创建的。在Java7中,字符串文本也在堆上创建 从理论上讲,转义分析可以防止在堆上创建新的对象,或者使用堆栈。这在实践中很少发生 在回答EJP的问题时,我并没有资助一个非平凡的例子,但是 从第22页开始 从理论上讲,这个特性已经存在了一段

String[]stringArray=新字符串[]{“abc”,“xyz”}

执行这一行时,在PERMGEN空间中创建了两个字符串文本“abc”和“xyz”。由于初始化有一个新的操作符,我不确定堆上是否分配了内存


谢谢大家。

除了字符串文字,所有对象都是在堆上创建的。在Java7中,字符串文本也在堆上创建

从理论上讲,转义分析可以防止在堆上创建
新的
对象,或者使用堆栈。这在实践中很少发生


在回答EJP的问题时,我并没有资助一个非平凡的例子,但是

从第22页开始

从理论上讲,这个特性已经存在了一段时间,但在Java7中,它并不是特别有效(即使找到一个人为的例子也很难),找到人为的例子更容易

如果添加
-XX:-DoEscapeAnalysis
,这不是默认值

Memory used for 20,000,000 iterations was 320,000,928 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes
Memory used for 20,000,000 iterations was 320,000,144 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes

当您执行此操作时,您将得到:

  • permgen中的两个字符串文本
  • 堆中的两个字符串对象
  • 堆中的一个字符串数组对象

即使实际的文本字符串保存在permgen的字符串池中,字符串对象仍然存储在堆中

还有所有的现场参考资料。谢谢彼得。因此,“字符串文本也在堆上创建。”这意味着有两个字符串池副本(heap和permgen),或者它只是在堆上创建的,只是为了防止由于
string.intern()
或大量字符串文本而导致permgen填充。
string s1=“Java”字符串s2=新字符串(“Java”)`System.out.println(s1==s2);'这返回false,但您说的文字是在堆中分配的内存,但我认为您的意思是字符串池在堆中分配,但是使用new在堆上分配的字符串与在池中创建的字符串文字(位于堆上)不同。当您使用新字符串(“Java”)时,我是否正确;,它保证了新对象的创建。因此,s1==s2返回false,而不管它们存储在何处。运行这个程序,希望它消除一些疑问,strings1=newstring(“Java”);字符串s2=新字符串(“Java”);System.out.println(s1==s2)@但在本例中,它仅适用于数组对象(字符串[])。字符串位于permgen空间(在Java6中)。字符串包含在其他地方。
public class UsesWrappersMain {
    public static void main(String... args) {
        for (int j = 0; j < 10; j++) {
            long used = used(), count = 0;
            for (int i = 0; i < 2000; i++) {
                count += printSum();
            }
            // add an object to show it is working
            byte[] b = new byte[16];
            long used2 = used();
            System.out.printf("Memory used for %,d iterations was %,d bytes%n", count, used2 - used);
        }
    }

    private static int printSum() {
        int count = 0;
        for (float i = 0; i < 10000; i++) {
            // definitively not autoboxed.
            Float j = new Float(i);
            count++;
        }
        return count;
    }

    private static long used() {
        return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
    }
}
Memory used for 20,000,000 iterations was 480,888 bytes
Memory used for 20,000,000 iterations was 32 bytes
Memory used for 20,000,000 iterations was 32 bytes
Memory used for 20,000,000 iterations was 32 bytes
Memory used for 20,000,000 iterations was 32 bytes
Memory used for 20,000,000 iterations was 32 bytes
Memory used for 20,000,000 iterations was 32 bytes
Memory used for 20,000,000 iterations was 0 bytes
Memory used for 20,000,000 iterations was 0 bytes
Memory used for 20,000,000 iterations was 0 bytes
Memory used for 20,000,000 iterations was 320,000,928 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes
Memory used for 20,000,000 iterations was 320,000,144 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes
Memory used for 20,000,000 iterations was 320,000,032 bytes