2013-08-06 10 views
2

언제나 내 질문에 다른 질문이 있으면 유감입니다 ... 다소 구체적이어서 검색하기가 어렵습니다. 나는 자바 프로그래밍과 언어 학습입니다. 실험이라는 하나의 클래스 인 을 디자인했으며 모든 실험에 대한 공통 함수와 기본 매개 변수를 정의합니다. 특정 실험마다 실험 A라고 말한 다음 실험을 하위 클래스로 지정합니다. 실험 A를 실행할 때마다 ExperimentA의 인스턴스를 만들고 매개 변수를 전달한 후 생성자는 실험에 정의 된 기본 매개 변수를 재정의합니다. 두 가지 질문이 있습니다. 나는 그들이 아마 코드를 보지 않고도 을 해결하기가 어렵다는 것을 알고 있지만, 그것을 생각해 보았습니다. 시도해 볼만한 가치가있었습니다. 또한, 내가 관련성이 있다고 생각했기 때문에 두 게시물을 동일한 게시물에 게시했습니다.Java for 루프에서 메모리 누수가 발생했습니다.

1) 위의 디자인이 합리적입니까? 처음에는 인터페이스를 사용하고 싶었지만 인터페이스의 값은 상수 여야하며 매개 변수를 무시할 수 없음을 알았습니다. 변경 매개 변수와 동일한 유형의 여러 후속 실험을 실행할 때

2) 훨씬 더 긴급하게 나에게 수수께끼, I는 메모리의 문제가 있습니다 것은 누수. E1 객체에 의해 유지되었다

몇 가지 이유를 들어
for(int na:ArrayOfIntegers) { 
    Experiment e1 = new ExperimentA(na,otherArgs); 
    Experiment.runExperiment(e1); 
} 

, 객체는 E1이 새로운 ExperimentA 객체에 할당 된 후에도 힙 활성 상태로 유지된다. 나는 이것이 매우 일반적인 질문이라는 것을 알고 있지만, 나는 Java에 익숙하지 않으며, 문제가 무엇인지에 대한 추측이 나를 도울 수있다. 유일한 실수는 제가 개인적으로 사용하지 않고 getters를 사용하는 대신 Experiment public의 기본 변수를 만드는 것입니다.하지만이 상황에서 어떻게 문제가 발생하는지는 알 수 없습니다. 기본적으로 runExperiment() 함수가 실행되고 다른 ExperimentA 객체가 만들어진 후 e1 객체에 대한 참조가 없습니다. 어떤 아이디어?

미리 감사드립니다.

+0

[이 질문에]보십시오 (http://stackoverflow.com/questions/13531004/java-outofmemoryerror-strange-behaviour) –

+0

얼마나 정확하게 개체가 살아 있는지 확인합니까? 힙 검사에 무엇을 사용합니까? – Sethiel

+0

난 메모리 분석기 도구를 사용하고 유출 용의자 보고서로 이동하십시오. – onkel

답변

0

귀하의 Experiment 클래스는 정적이며, 귀하는 e1을 해당 메소드에 전달합니다.

runExperiment의 내용은 무엇입니까? 예를 들어 배열에 매개 변수를 저장하는 코드가 있습니까?

생성 된 개체에 대한 참조가 있으면 가비지 수집 할 수 없습니다. Experiment은 정적이지만 내부 구조에는 이미 수행되고 일회용 인 실험을 정리하는 관리 루틴이 있어야한다고 가정합니다.

+0

예, 생성자에 전달 된 매개 변수는 내부 공용 변수에 저장됩니다. for 루프 이후에는 e1에 대한 참조가 없으므로 runExperiment()가 완료된 후 객체를 정리하면 안됩니까? runExperiment()는 많은 객체를 생성하지만 이러한 객체는 실험 클래스에서만 참조됩니다. 그러나 내가 볼 수있는 것은 ExperimentA의 각 인스턴스에 의해 생성 된 모든 객체가 가비지 수집되지 않는다는 것입니다. 그리고 ExperimentA 이외의 다른 객체에 의해 참조되지 않기 때문에 나는 이것에 당혹 스럽습니다. – onkel

0

1) Experiment라는 클래스와 "실행"과 같은 메서드가있는 별도의 IExperiment 인터페이스를 통해 기본 매개 변수를 사용할 수 있다고 생각하십니까? 그런 식으로 기본 매개 변수를 더 구성 할 수 있습니다. 다른 옵션이있을 수 있습니다. 문제의 예가 도움이 될 것입니다.

2) getter에서 객체를 반환하면 호출자에게 해당 객체에 대한 참조가 제공됩니다. 그것은 더 이상 getBar (의 호출에 의해 필요할 때까지 그래서 예 "바"에서) 놀아 것 :

public class Foo { 
    private Bar bar; 
    ... 
    public Bar getBar() { return bar; } 
} 

대신 바의 복제를 반환 할 수 있습니다.Bar 클래스에서 clone()의 기본 구현을 재정의하여 딥 복사 (모든 개인 값은 원래 Bar와 독립적입니다)되도록해야 할 수 있습니다.

+0

내 작업은 변경된 매개 변수로 반복 된 실험을 실행해야한다는 것입니다. 각각의 실험은 디스크에 많은 양의 데이터를 기록하고 모든 작성자를 닫은 후 for-loop는 다음 실험으로 이동합니다. 로그가 닫혀 있는지 확인하기 때문에 실험에서 생성 된 많은 개체가 모두 필요하지 않으므로 어떤 이유로 인해 개체가 파괴되지 않는다는 점만 제외하면 파손되어야합니다. – onkel

+0

Woops, 줄 바꿈을하고 싶었지만 대신 게시가 끝났습니다. 특정 실험 구현으로 하위 클래스로 분류되는 추상 부모 클래스를 사용하는 아키텍처는 각 실험에서 다른 매개 변수를 재정의해야 할 수도 있기 때문입니다. 실험이 매개 변수를 무시하지 않으면 항상 추상 부모 클래스에 지정된 미리 정의 된 기본값을 사용해야합니다. 인터페이스를 매개 변수를 정의하는 데 사용하는 경우 인터페이스 변수가 일정하기 때문에 실험에서 매개 변수를 무시하지 않으면 기본 매개 변수로 되돌릴 수있는 유연성이 없습니다. – onkel

+0

나는 그것을 역시했다! 실험 논리와 같고 실험에 제공해야하는 값은 분리 할 수 ​​있습니다. 여기에는 데이터를 표현하는 하나의 클래스와 그 데이터로 무엇인가를 수행하는 하나의 클래스가 있습니다. 기본적으로 기본 매개 변수 인 POJO를 만들고, 호출자가 필요에 따라 해당 값을 수정할 수 있도록 설정자를 추가하고 매개 변수 개체를 허용하는 인터페이스를 실험에 구현하십시오. – Hanra091