簡體   English   中英

如何在jvm中創建多個Integer.MAX_VALUE對象?

[英]How to create more than Integer.MAX_VALUE objects in a jvm?

從這個討論中,我需要編寫一個程序來知道問題的答案:“如果對象多於int的maxvalue,那么jvm將什么分配給對象地址?”,

使用eclipse.ini中的以下設置

-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20131025-1931
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
256M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms6144m
-Xmx6144m

及以下程序,

class SubClass {
    int x = 4;
    int getX(){
        return x;
    }
}

    public class Dummy2 {

        public static void main(String[] args){

            SubClass obj[] = null;
            obj = new SubClass[Integer.MAX_VALUE];
            for(int i = 0; i < Integer.MAX_VALUE; i++){
                obj[i] = new SubClass();
            }

            SubClass objRef1 = new SubClass();
            System.out.println(objRef1);
            System.out.println(objRef1.hashCode());

            SubClass objRef2 = new SubClass();
            System.out.println(objRef2);
            System.out.println(objRef2.hashCode());




        }

    }

出現錯誤:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

我的目標是查看對象地址的值以及為最后兩個對象生成的哈希碼。

我正在使用在64位Windows 7操作系統上運行的64位jvm,該操作系統為每個本機用戶級別的進程提供8TB的虛擬空間。 硬件具有8GB RAM芯片。

請幫我!!

這里有很多誤解。

  • Object.hashCode()是隨機生成的數字,存儲在對象的標頭中,並且在對象移動時不會改變。
  • Windows不允許JVM使用虛擬內存,您不能創建大於主內存的JVM堆。
  • 您至少需要20 GB的JVM內存才能容納20億個元素。
  • 一個數組不能超過Integer.MAX_VALUE個元素,但是您可以擁有一個數組數組(或多個數組)

我的目標是查看對象內部地址的值以及為最后兩個對象生成的哈希碼。

它們是隨機的,因此它們與第一個元素之間沒有區別。

我想你是在問這個問題

您不必創建多個Integer.MAX_VALUE對象。 您只需要創建一些,直到發生碰撞為止。 您可以相對輕松地做到這一點。

public static void main(String[] args) throws Exception {
    final int LENGTH = Integer.MAX_VALUE / 256;
    Object[] values = new Object[LENGTH];
    int count = 0;
    for (int i = 0; i < Integer.MAX_VALUE; i++) {
        Object o = new Object();
        int hashCode = o.hashCode();
        if (hashCode > LENGTH)
            continue;
        if (values[hashCode] != null) {
            System.out.println("found after " + count + ": " + values[hashCode] + " same hashcode as " + o);
            System.out.println(values[hashCode] == o);
            System.exit(0);
        } else {
            System.out.println(hashCode);
            values[hashCode] = o;
            count++;
        }
    }
}

例如,在我的計算機上,此操作在4712個新實例且其hashCode小於Integer.MAX_VALUE / 256之后停止。 這意味着兩個不符合GC條件的Object實例具有相同的hashCode

以上印刷品

...
5522036
4166797
5613746
found after 4712: java.lang.Object@6aca04 same hashcode as java.lang.Object@6aca04
false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM