Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8127844

T2KCompositeFontResource.strikeMap infinite growth causes OOME

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: P4
    • Resolution: Fixed
    • Affects Version/s: 7u6
    • Fix Version/s: 7u6
    • Component/s: javafx
    • Labels:

      Description

      The following program fails with OOME after about 10 minutes:

      public class StrikeDescLeakTest extends Application {
          
          private static final int ROW_COUNT = 30;
          private static final int COLUMN_COUNT = 20;
          private static final int NODE_WIDTH = 50;
          private static final int NODE_HEIGHT = 22;
          private static final int SCENE_WIDTH = NODE_WIDTH * COLUMN_COUNT;
          private static final int SCENE_HEIGHT = NODE_HEIGHT * ROW_COUNT;
                  
          public static void main(String[] args) {
              launch(args);
          }

          @Override
          public void start(Stage primaryStage) throws Exception {
              Group group = new Group();

              final ArrayList<Label> labels = new ArrayList<Label>();
              for (int j = 0; j < ROW_COUNT; j++) {
                  for (int i = 0; i < COLUMN_COUNT; i++) {
                      Label label = new Label("(" + j + "," + i + ")");
                      label.setPrefSize(NODE_WIDTH, NODE_HEIGHT);
                      label.setTranslateX(i * NODE_WIDTH);
                      label.setTranslateY(j * NODE_HEIGHT);
                      group.getChildren().add(label);
                      labels.add(label);
                  }
              }
              
              Timeline timeline = new Timeline();
              timeline.setCycleCount(Timeline.INDEFINITE);
              EventHandler<ActionEvent> handler = new EventHandler<ActionEvent>() {
                  @Override
                  public void handle(ActionEvent e) {
                      for (Label label : labels) {
                          double size = Math.random() * 50 + 10;
                          label.setFont(Font.font("Arial", size));
                      }
                  }
              };
              timeline.getKeyFrames().add(
                      new KeyFrame(Duration.millis(100), handler));
              timeline.play();
              
              Scene scene = new Scene(group, SCENE_WIDTH, SCENE_HEIGHT);
              scene.setFill(Color.GRAY);

              primaryStage.setScene(scene);
              primaryStage.show();
          }
      }

      Every 100 milliseconds the program generates 600 unique fonts and applies them to 600 labels. The program does not explicitly retain generated fonts anywhere and so is expected to be able to run forever.

      Profiling shows that the program causes T2KCompositeFontResource.strikeMap to grow infinitely. Interestingly, the values stored in T2KCompositeFontResource.strikeMap are WeakReferences to FontStrikes, so FontStrikes go away nicely as the program progresses. The problem is, map entries are still referenced strongly, thus causing the map to grow infinitely as more and more unique fonts get generated by the program.

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                prr Philip Race
                Reporter:
                vbaranov Vasiliy Baranov (Inactive)
              • Votes:
                0 Vote for this issue
                Watchers:
                2 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved:
                  Imported: