Java 如何在jvm中创建多个Integer.MAX_值对象?

Java 如何在jvm中创建多个Integer.MAX_值对象?,java,memory-management,jvm,heap,Java,Memory Management,Jvm,Heap,由此,我需要编写一个程序来知道问题的答案:“如果有比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

由此,我需要编写一个程序来知道问题的答案:“如果有比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());




        }

    }
我的目标是查看对象地址的值和为最后两个对象生成的哈希代码

我使用运行在64位Windows 7操作系统上的64位jvm,该操作系统为每个本机用户级进程提供8TB的虚拟空间。硬件采用8GB RAM芯片


请帮帮我

这里有很多误解

  • hashCode()是一个随机生成的数字,存储在对象的头中,当对象移动时它不会改变
  • Windows不允许JVM使用虚拟内存,您不能创建大于主内存的JVM堆
  • 20亿个元素至少需要20 GB的JVM内存
  • 一个数组不能有多个Integer.MAX_值元素,但可以有一个数组数组(或数组,或数组)
我的目标是查看对象的内部地址的值以及为最后两个对象生成的哈希代码


它们是随机的,因此它们与第一个元素之间没有区别。

这里有许多误解

  • hashCode()是一个随机生成的数字,存储在对象的头中,当对象移动时它不会改变
  • Windows不允许JVM使用虚拟内存,您不能创建大于主内存的JVM堆
  • 20亿个元素至少需要20 GB的JVM内存
  • 一个数组不能有多个Integer.MAX_值元素,但可以有一个数组数组(或数组,或数组)
我的目标是查看对象的内部地址的值以及为最后两个对象生成的哈希代码


它们是随机的,所以它们和第一个元素之间没有区别。

我想你是在问关于

您不必创建超过
Integer.MAX\u 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++;
        }
    }
}

我想你是在问关于你的问题

您不必创建超过
Integer.MAX\u 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++;
        }
    }
}


可能不相关,但您可能应该在程序的VM参数(即运行配置)中指定最大堆大小,而不是在eclipse文件中。您说的“对象的内部地址”是什么意思?@realponsign没有任何意义,我删除了这个词):现在,你能帮我回答吗?可能没有关系,但你可能应该在程序的VM参数(即运行配置)中指定最大堆大小,而不是在eclipse文件中。你说的“对象的内部地址”是什么意思?@realpoinsist没有任何意义,我删除了这个词):现在,你能帮我回答吗?
Windows不允许JVM使用虚拟内存,你不能创建比主内存大的JVM堆。
你确定吗@如果你愿意,你可以试试,看看会发生什么;)试试什么?你是在建议一些eclipse设置吗?@overexchange我并不是说过度提交托管内存在linux上也很有效。不同之处在于,在linux上,它可能会锁定,您可以终止进程。在windows上,您更可能需要一个电源循环。无论哪种方式,你都不希望主内存的堆超过80%。我不在乎RAM芯片是不是4GB芯片,这就是我想说的
Windows不允许JVM使用虚拟内存,你不能创建一个比主内存大的JVM堆。
你确定吗@如果你愿意,你可以试试,看看会发生什么;)试试什么?你是在建议一些eclipse设置吗?@overexchange我并不是说过度提交托管内存在linux上也很有效。不同之处在于,在linux上,它可能会锁定,您可以终止进程。在windows上,您更可能需要一个电源循环。我不在乎RAM芯片是否是4GB芯片,这就是我在我的机器上试图说的,上面的程序总是说
:java.lang.ArrayIndexOutOfBoundsException:8388607
,它是intmax/256,我正在尝试intmax/8。你在用64位jvm运行吗?@与上面的代码交换过多?应该使用
if(hashCode>LENGTH)
@overexchange Yes,64位JVM来保护您。调整
LENGTH
以适应可用内存量。
Object[]值=新对象[LENGTH]给定给这些对象的哈希代码可以大于长度值,对吗?所以我仍然不清楚条件(hashCode>LENGTH)@overexchange,为了不耗尽内存,我们设置了一个较小的
LENGTH
。但是,
hashCode
可以返回大于
长度的值。如果我们看到这样一个
hashCode
,我们就跳过它。这就是为什么我放了一个
continue
。在我的机器上,上面的程序总是说
:java.lang.ArrayIndexOutOfBoundsException:8388607
,它是intmax/256,我现在正在尝试intmax/8。你在用64位jvm运行吗?@与上面的代码交换过多?应该使用
if(hashCode>LENGTH)
@overexchange Yes,64位JVM来保护您。调整
LENGTH
以适应可用内存量。
Object[]值=新对象[LENGTH]给定给这些对象的哈希代码可以大于长度值,对吗?所以我仍然不清楚条件(hashCode>LENGTH)@overexchange,为了不耗尽内存,我们设置了一个较小的
LENGTH
。但是,
hashCode
可以返回大于
长度的值。如果我们看到这样一个
hashCode
,我们只是滑雪
...
5522036
4166797
5613746
found after 4712: java.lang.Object@6aca04 same hashcode as java.lang.Object@6aca04
false