2013-01-15 2 views
0

나는 Java에서 초보자이고 영어로 충분하지 않아서, 모두가 나를 용서할 수 있기를 바랍니다.Java : 완전히 삭제 객체

질문 1 : 나는 ArrayList (J2SE) 또는 Vector (J2ME)를 가지고 있는데, 나는 클래스를 가지고있다. (예 : Bullet), 내가 불을 땐 그 클래스의 인스턴스를 목록에 추가하고 총알이 명중 한 후에 목표물, 나는 그들을 파괴하고 목록에서 제거해야합니다. 나는 물어보고 싶다. 내가 제거해야 할 객체를 완전히 삭제하는 방법 : 그 객체가 가져온 모든 메모리를 비우는 것 (C++의 delete 포인터와 동일). 일반적인 객체의 경우 "= null"을 사용할 수 있지만이 객체는 List 내부에 있으므로 이와 같이 사용할 수 없습니다. 나는 System.gc()를 사용하려고 시도하지만 나쁜 생각이다. gc()를 사용하지 않는 것보다 프로그램이 느려지고 메모리가 증가한다. List.remove (bullet_index) 만 사용하면 메모리가 조금 증가하지만 감소하지는 않습니다.

질문 2 : "총알 수 제한 없음"으로 총을 맞고 메모리가있는 다른 아이디어가 있습니까?

나는 간단한 2D 샷팅 게임을 만들고 있습니다.

답변

3

간단하게 할 수 없습니다. Java는 garbage collector을 통해 메모리 할당 및 할당 해제를위한 관리 환경을 제공하는 JVM에서 작동합니다.

사용하지 않는 객체를 할당 해제하여 메모리를 정리하도록 JVM에 알릴 수는 있지만 일반적으로 사용되지는 않습니다. 목록에서 Bullet 인스턴스를 제거하기 만하면 다른 참조가 없으면 결국 메모리가 해제됩니다.

메모리를 실제로 저장하려면 동일한 인스턴스를 다시 사용하는 방법에 대해 생각해야합니다. 화면에서 동시에 정확한 총알 크기를 사용하려는 경우이 작업을 수행 할 수 있습니다. 만료 된 목록을 나열하여 다른 목록에 추가 할 수 있습니다. 그런 다음 목록에서 속성을 설정하여 새 글 머리 기호를 선택합니다. 이 방법으로 특정 임계 값 이상을 피할 수 있습니다.

+0

개체를 재사용 할 경우 "개체 풀"이라는 용어를 연구하고 싶다고 생각하면됩니다. 특히 탄환과 같은 임시 물건에 특히 좋습니다. –

1

자바가 메모리 관리되므로 안정적으로 메모리를 확보 할 수 없습니다. 객체에 대한 포인터가있는 한 메모리를 해제 할 수 없습니다. 객체를 null로 설정하면 아무 것도 가리 키지 않지만 반드시 그 시점에서 가비지 수집된다는 의미는 아닙니다. Java의 메모리 관리에 대한 자세한 설명은 this을 확인하십시오.

또한 동기화 된 벡터를 사용하지 마십시오. 일반적으로 새로운 코드에서는 사용되지 않습니다.

+0

불행히도 Java ME는'Vector' 이외의 콜렉션을 제공하지 않습니다. 그것은 매우 고통 스럽습니다. – ApproachingDarknessFish