2011-04-26 8 views
3

제 의심을 분명히하십시오.Java에서 가비지 컬렉터에 대한 오브젝트 적합성을 계산하는 방법은 무엇입니까?

class A{ 
Long weight = 1000L; 
} 
public class B extends A{ 
public static void main (String[] args){ 
    B b = new B(); 
    B c = new B(); 
    b = null; 
    c = null;//going to gc. 
} 
} 

위의 코드에서 "going to gc"에 도달하는 동안 가비지 수집기에 적합한 객체의 수는 얼마입니까? args [], b, c 및 2 개의 Long 객체를 완전히 아는 한 5 개가 적합합니다. 그러나 일부는 완전히 말합니다. 4. 그들은 힙에 두 개의 Long 객체가 생성되지 않고 하나만 생성된다는 것을 말합니다.

제 의심을 분명히하십시오.

+1

JVM에서 -128에서 127 사이의 값을 캐시하는 Long 클래스의 내부 캐시를 기반으로하는 것이 아니라 자체적으로 Long 개체를 캐시 할 수 있으므로 질문에 대답 할 수 없습니다. 물론이 사실을 무시하면 , Jigar Joshi의 답이 맞습니다. – MeBigFatGuy

답변

3

4 Object [2 of B, Long of 2]가 생성되고 4 개 모두 GC 준비가됩니다. 라인에서

c = null;//going to gc. 
때문에 인수가 준비되지 않습니다 args의 라이브 참조가 될 것

+0

답변 해 주셔서 감사합니다. 그래서. main()이 실행 된 후 5가됩니다. 맞습니까? – Manoj

+0

0

글쎄, b.weight == c.weight이면 응답은 4입니다. 그렇지 않으면 대답은 5입니다. 시도해보십시오.

1

Java 언어 사양 섹션 5.1.7 복싱 변환에 따르면

boxing 된 값 p가 true 인 경우 false, 1 바이트, \ u0000 ~ \ u007f 범위의 char 또는 int 또는 -128과 127 사이의 짧은 숫자, 그럼 r1과 r2는 p의 두 복싱 변환의 결과가되도록합시다. r1이 r2와 동일한
인 경우 항상 입니다.

따라서이 원칙이 1000L의 긴 자동 차단에도 적용되는 경우에만 해당됩니다. 그렇지 않은 경우 거짓입니다. 권리] 당신의 질문자가 최대한 멀리 볼 수 잘못

기회는 당신이 것을하고,

질문의 전제가 될 수 있지만, JLS는 오랫동안 오토 박싱, 127 이상도 번호를 포함하지 않는 것 같습니다.

어쨌든 JLS에 명시된 조건 하에서 자동 시동이 가능한 시나리오를 지적하고자했습니다. 질문에 대한 조건이 요구 사항을 충족시키지 않아 귀하의 이해 가능한 개체 수에 동의합니다.

+0

일부 구현에서는 long 또한 autoboxed입니다 ... Long.valueOf (long)의 구현을 살펴보십시오 –

+0

아니요있을 것입니다 Long의 두 개의 다른 객체 [this] (http://stackoverflow.com/questions/5581913/wrapper-class-andoperator) –

0

약간 까다 롭습니다.

'b', 'c'는 가비지 수집됩니다. 무게의 값이 범위 [-128, 127], 오토 박싱은 각각 'A'에 대한 새로운 롱 인스턴스를 할당합니다 외부에 있기 때문에 당신이 인 경우에

(http://www.jdocs.com/harmony/5.M5/java/lang/Long.html#823 참조) 일부 반사 메커니즘을 사용하여 B.main을 호출하고 클래스 B 또는 해당 Method 인스턴스 등을 참조하지 않고 클래스 A, 클래스 B를 모든 Method 인스턴스 등과 함께 보유합니다.+ a_bunch

호출자가 전달 된 args 배열을 사용하지 않으면 args; +1

0

두 개의 Long 개체가 있습니다.

System.out.println(System.identityHashCode(b.weight)); 
System.out.println(System.identityHashCode(c.weight)); 

당신은 그들이 두 개의 서로 다른 개체에있어 의미하는 두 개의 서로 다른 아이덴티티 해시 코드를 얻을 것이다 : 당신이 bcnull로 설정하기 전에 다음 줄을 추가하여 확인할 수 있습니다.

0

오직 4 개의 개체 만 gc에 적합합니다. at line c = null; // gc로 이동합니다. 중단 점을 설정하고 Eclipse에서 코드를 디버그하면 얼마나 많은 객체가 생성되는지 보여줍니다.

관련 문제