나는 코드를 작성하여 글을 쓰면서 글자를 표시하고 날기 위해 작성했습니다. 문제는 많은 메모리를 소비합니다.JavaFX의 메모리 누수 최적화
이미 청취자의 매개 변수를 path
개체를 공유하고 업데이트
- 에 의해 그것을 조금 최적화.
- 의 메모리 사용을 줄이는 방법에 대한 아이디어는 새로운 문자가
를 인쇄 할 때마다 GC 호출하지만 여전히 많은 메모리를 사용하기 때문에?
미리 감사드립니다.
package sample;
import javafx.animation.PathTransition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
Pane root = new Pane();
Scene scene = new Scene(root);
root.setCache(false);
primaryStage.setTitle("Hello World");
primaryStage.setScene(scene);
Path path = new Path();
root.widthProperty().addListener((observableValue, oldSceneWidth, newSceneWidth) -> SetPathElements(path, root));
root.heightProperty().addListener((observableValue, oldSceneWidth, newSceneWidth) -> SetPathElements(path, root));
Duration duration = Duration.millis(1000);
scene.setOnKeyPressed(event -> {
System.gc();
Text textNode = new Text(event.getText());
textNode.setFont(Font.font(50));
textNode.setFill(Color.ORANGE);
root.getChildren().add(textNode);
PathTransition pathTransition = new PathTransition();
pathTransition.setDuration(duration);
pathTransition.setPath(path);
pathTransition.setCycleCount(1);
pathTransition.setNode(textNode);
pathTransition.setOnFinished(event1 -> {
root.getChildren().remove(textNode);
pathTransition.setNode(null);
pathTransition.setPath(null);
textNode.setFont(null);
textNode.setFill(null);
});
pathTransition.play();
});
primaryStage.show();
}
private void SetPathElements(Path path, Pane root) {
path.getElements().clear();
double w = root.getWidth();
double h = root.getHeight();
path.getElements().add(new MoveTo(w/2, h));
path.getElements().add(new LineTo(w/2, -40));
}
}
편집 # 1
OS : 아치 리눅스 64 비트 플랫폼 : 인텔 i7-3rd 세대 8 기가 바이트 램 IDE : 인 IntelliJ JDK : 1.8.0_102
누수의 증거 : 약 100자를 타이핑 한 후 50MB에서 1.3GB로 점프했습니다.
편집 # 2
나는 jvisualvm을 사용하여 힙 크기를 확인하고는 힙이 크게 확장하지만, 사용 된 부분이 50메가바이트
당신은 단지 50MB로 당신 어플리케이션을 실행할 수 있습니다. 얼마나 많은 메모리를 소비하고 있다고 말합니까? – ravthiru
몇 글자 만 쓰면 메모리가 증가합니다. –
@ ShadyAtef 또한 최대 힙을 50m로 설정하여 실행했습니다. 메모리 누수가 발생하면 메모리 부족 오류가 발생합니다. 나는 몇 분 동안 타이핑을 계속했고 괜찮 았어. 여기에 메모리 누수가 있다는 증거는 무엇입니까? –