문제

나는이 질문이 전에 질문을 받았을 것이라고 생각했지만 여기서는 그것을 찾을 수 없었다 ...

SWIG를 사용하여 C ++ 클래스 주변에 JNI 래퍼를 만듭니다. Java가 클래스의 Finalize ()라고 부르는 것처럼 보이지 않는 것을 제외하고는 모두 잘 작동합니다. 클래스의 소멸자는 최종 파일 I/O를 수행하므로 불행히도 이것은 단순한 메모리 누출이 아닙니다.

Google을 통해 검색하면 Java를 GC로 강제하고 물체를 파괴하는 방법은 없습니다. 진실?

SWIG 파일을 조작하고 C ++ Destructor라고하는 Java 함수를 만들 수 있다는 것을 알고 있지만이 클래스는 여러 다른 플랫폼/언어로 최종 사용자가 사용하므로 Java 전용을 추가하면 기술이 불일치합니다. 작가는 좋아하지 않을 것입니다.

도움이 되었습니까?

해결책

System.gc ()로 GC를 강제로 강제로 할 수 없습니다. 또한 예를 들어 앱이 짧은 시간 동안 만 실행되고 최종화기가 전혀 실행되지 않는 경우 GC 실행이있을 것이라고 보장하지는 않습니다 (종료 할 때 JVM이 실행되지 않음). Close () 또는 Destroy () 또는 클래스의 모든 기능을 만들어야 하며이 클래스의 인스턴스를 사용하여 전화를 걸 때, 바람직하게는 마침내 블록에서 나옵니다.


MyClass x = null;
try{
    x = new MyClass();
    x.work();
} finally {
    if (x!=null)
        x.close();
}

다른 팁

Java Finalizers는 제 생각에 대부분 쓸모가 없으며 C ++ Destructors를 대체하지는 않습니다. 불행히도 Java는 C ++ RAII를 대체 할 수 없습니다.

Java 결승을 강요하려고 노력하지 마십시오. 당신이 무엇이든 겪을 때, 그것을 처리 할 모든 함수. 그게 당신이 할 수있는 전부입니다.

당신이 코드에 의존하는 경우 finalize 방법 일정 시간에 실행하려면 접근 방식을 재고해야합니다. 여기서 문제는 언제 알지 못한다는 것입니다 finalize 물체가 언제 쓰레기를 수집 할 것인지 모르기 때문에 JVM에 의해 호출됩니다.

다른 프로젝트에서 수업이 재사용되기 때문에 고려해야 할 한 가지는 최종 사용자가 수집되지 않거나 쓰레기 수집이 수집되지 않는 방식으로 클래스의 인스턴스를 사용할 수 있다는 것입니다. 클래스 인스턴스에 대한 정적 참조를 만드는 것과 같은 가능성은 낮습니다. 나는 a를 만드는 것 같아요 close 또는 destroy 방법은 Java 객체와 관련된 C ++ 클래스의 인스턴스가 사용하는 자원이 적절하게 출시되도록하기위한 가장 안전한 베팅입니다.

재사용이 우려되므로 C ++ 소멸자가 리소스가 릴리스되었는지 확인하고 그렇지 않은 경우 동일한 코드를 호출 할 수 있습니다.

class MyThing {
  public:
    void close();
    ~MyThing();

  private:
    bool released = false;
};

void
MyThing::close() {
  // close logic here
  this->released = true;
}

MyThing::~MyThing() {
  if (!released) {
    this->close();
  }
}

이런 식으로, 기존 C ++ 코드는 희망적으로 크게 변경 될 필요가 없으며 JNI를 통해 실행되는 기본 코드의 맥락에서 리소스가 결정적인 방식으로 릴리스되도록 할 수 있습니다.

SWIG 생성 코드를 살펴본 후 SWIG 사람들이 실제로이 문제를 처리했음을 알 수 있습니다. 프로그래머와 GC가 객체를 삭제하는 가능성을 잘 관리하는 것으로 보입니다.

이와 같은 문제는 C#이 선택한 이유입니다. idisposable 결정 론적 최종화를위한 패턴.

동일한 패턴을 따르고 Java 사용자에게 적응하는 것이 좋습니다.

C ++ 클래스에서 리소스를 처리하는 별도의 공개 방법을 만듭니다. 가까이에 전화하거나 처분하거나 무언가를 처분하십시오.

C ++ Destructor가 공개 방법을 호출하고 C ++ 클래스의 관리/GC 사용자에게 메모리 누출을 피하기 위해 방법을 호출해야한다고 말하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top