는 OutOfMemoryError가 생성됩니다. 이 코드는 하나의 변수 할당 (첫 번째 배열에서 사용 된 스택 프레임을 다시 작성하고 가비지 수집을 위해 배열을 만들 수 있음)로 작동하도록 할 수 있습니다. 이 퍼즐은 here이라고 설명했습니다.자바 메모리 퍼즐
{
byte[] data1 = new byte[size];
}
int i = 0;
byte[] data2 = new byte[size];
질문 : 왜 다음 코드가 여전히 작동하지 않습니까?
Object o = new Object();
synchronized (o) {
byte[] data1 = new byte[size];
}
int i = 0;
byte[] data2 = new byte[size];
그리고 다음 작품 :
Object o = new Object();
synchronized (o) {
byte[] data1 = new byte[size];
}
int i = 0;
synchronized (o) {
byte[] data2 = new byte[size];
}
yuck ...이 동작은 가비지 수집기의 구현에 전적으로 의존하지 않습니까? 이 동작이 결정적이지 않은 것처럼 보입니다 (즉, JLS로 지정되어 있지 않다). 내가 잘못? – Tom
JLS에서는 GC를 전혀 수행하지 않고 구현할 수 있습니다 (GC에 대한 계약은 어떻게 지정하겠습니까?). –
기사에 링크 된 기사를 보면 GC에 의존하지 않는 것 같지만 생성 된 바이트 코드 (스택에 배열 참조가 너무 길게 유지됨)가 있습니다. 한편이 기사에서는 BEA와 IBM VM 또는 Sun의 실험용 새 가비지 수집기에서도 오류가 발생하지 않는다고 설명합니다. 혼란스러운 ... – Thilo