2016-10-24 5 views
3

나는 코드를 작성하여 글을 쓰면서 글자를 표시하고 날기 위해 작성했습니다. 문제는 많은 메모리를 소비합니다.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로 점프했습니다. Memory leakage proof


편집 # 2

나는 jvisualvm을 사용하여 힙 크기를 확인하고는 힙이 크게 확장하지만, 사용 된 부분이 50메가바이트 enter image description here

+1

당신은 단지 50MB로 당신 어플리케이션을 실행할 수 있습니다. 얼마나 많은 메모리를 소비하고 있다고 말합니까? – ravthiru

+0

몇 글자 만 쓰면 메모리가 증가합니다. –

+0

@ ShadyAtef 또한 최대 힙을 50m로 설정하여 실행했습니다. 메모리 누수가 발생하면 메모리 부족 오류가 발생합니다. 나는 몇 분 동안 타이핑을 계속했고 괜찮 았어. 여기에 메모리 누수가 있다는 증거는 무엇입니까? –

답변

5

자바 FX에서 메모리 누수가 ~을 초과하지 않는 것을 나타냅니다 Mesa> = 11.0 (최신 리눅스 배포판을 의미). JavaFX 개발자는 Mesa의 버그라고 말하지만 Mesa에서 버그 보고서를 찾을 수 없었습니다 (JavaFX 외부에서 어떻게 재현할지 모르기 때문에). 지금과 같은
유일한 솔루션입니다 -
1. 이전 리눅스
2. 엔비디아 GPU (키가 메사 (10) 이하를 가지고있다) - 그들은 자신의 OpenGL 구현을 가지고 메사에 의존하지 않는 .
3. Windows를 사용하십시오.

업데이트 (2016 년 11 월)
이 문제는 메사 및/또는 X.org의 최신 버전에서 해결 된 것 같습니다. Mesa 13.0 및 X.org> = 1.18.4 으로 업데이트하면이이 문제를 해결해야합니다.

관련 링크 :

0

다음은 문제가 해결되지 않는 메사 13.0.4까지 업그레이드하지만 해결 방법이 있습니다.

-Dprism.order=j2d 또는 -Dprism.order=sw VM 인수를 사용하여 프로그램을 실행하는 경우 JavaFX 렌더링 엔진은 OpenGL을 사용하지 않으므로 누출이 발생하지 않습니다. 물론이 경우 응용 프로그램 성능이 크게 저하됩니다.

+0

X.org도 업그레이드 했습니까? 오직 메사 만 업데이트하는 것만으로는 충분하지 않으며 나에게도 문제를 해결하지는 못했지만 업데이트 된 X.org * 및 * 메사를 사용하면 문제가 해결되었습니다. – Itai

+0

전체 시스템을 업그레이드했습니다 – elmot

+0

시스템 (Linux 배포판일까요?)이 새 버전을 패키지하지 않은 경우 전체 시스템을 업그레이드하면 트릭이 수행되지 않습니다. 정확한 버전을 확인하십시오. – Itai