Как создать больше, чем Integer.MAX_VALUE объектов в jvm?

1

Из этого обсуждения мне нужно написать программу, чтобы узнать ответ на вопрос: "Если есть больше объектов, чем maxvalue int, то что 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-разрядную jvm, работающую на 64-битной ОС Windows 7, которая обеспечивает виртуальное пространство 8 ТБ для каждого процесса пользовательского уровня. Аппаратное обеспечение имеет 8 ГБ ОЗУ.

Пожалуйста, помогите мне!!

  • 1
    Может быть не связано, но вы, вероятно, должны указать максимальный размер кучи в аргументах виртуальной машины программы (т. Е. В конфигурации выполнения), а не в файле eclipse.
  • 0
    Что вы подразумеваете под "внутренним адресом объекта"?
Показать ещё 1 комментарий
Теги:
memory-management
jvm
heap

2 ответа

3
Лучший ответ

Я предполагаю, что вы просите об этом.

Вам не обязательно создавать больше объектов 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 hashCode меньше Integer.MAX_VALUE/256. Это означает, что два экземпляра Object, которые не имели возможности для GC, имели одинаковый hashCode.

Вышеприведенные отпечатки

...
5522036
4166797
5613746
found after 4712: java.lang.Object@6aca04 same hashcode as java.lang.Object@6aca04
false
  • 0
    в моей машине эта программа всегда говорит :java.lang.ArrayIndexOutOfBoundsException: 8388607 который является intmax / 256, я сейчас пытаюсь с intmax / 8. RU работает с 64-битной JVM?
  • 0
    @overexchange С точным кодом выше? Вы должны быть защищены с помощью if (hashCode > LENGTH) .
Показать ещё 9 комментариев
4

Здесь есть несколько заблуждений.

  • Object.hashCode() - произвольно сгенерированное число, которое хранится в заголовке объекта и не изменяется при перемещении объекта.
  • Windows не позволяет JVM использовать виртуальную память, вы не можете создать кучу JVM, которая больше основной памяти.
  • вам нужно как минимум 20 ГБ памяти JVM для 2 миллиардов элементов.
  • Массив не может иметь больше, чем элементы Integer.MAX_VALUE, но вы можете иметь массив массивов (или массивов, массивов)

Моя цель - увидеть значение внутреннего адреса объекта и хэш-код, сгенерированный для двух последних объектов.

Они случайны, поэтому между ними и первыми элементами нет разницы.

  • 0
    Windows doesn't allow the JVM to use virtual memory, you can't create a JVM heap which is larger than main memory. ты уверен? msdn.microsoft.com/en-us/library/windows/desktop/...
  • 0
    @overexchange вы можете попробовать, если хотите, и посмотреть, что получится;)
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню