Из этого обсуждения мне нужно написать программу, чтобы узнать ответ на вопрос: "Если есть больше объектов, чем 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 ГБ ОЗУ.
Пожалуйста, помогите мне!!
Я предполагаю, что вы просите об этом.
Вам не обязательно создавать больше объектов 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
:java.lang.ArrayIndexOutOfBoundsException: 8388607
который является intmax / 256, я сейчас пытаюсь с intmax / 8. RU работает с 64-битной JVM?
if (hashCode > LENGTH)
.
Здесь есть несколько заблуждений.
Моя цель - увидеть значение внутреннего адреса объекта и хэш-код, сгенерированный для двух последних объектов.
Они случайны, поэтому между ними и первыми элементами нет разницы.
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/...