2014-06-24 14 views
37

Tôi có một ứng dụng JavaFX giảm thiểu đến khay khi nhấn nút X. Tôi đã theo dõi ứng dụng thông qua VisualVM cho các xu hướng bộ nhớ.JavaFX 8 Rò rỉ bộ nhớ khi ẩn Giai đoạn

Phần lạ là khi ứng dụng đang mở hoặc thu nhỏ thành thanh tác vụ, bộ nhớ luôn được GC trở lại bộ nhớ ban đầu được sử dụng. Tuy nhiên, khi nó được thu nhỏ xuống khay (stage.hide(), systemTray.show()), bộ nhớ được GCed, nhưng trong một xu hướng tăng (rò rỉ).

Trong VisualVM, không gian thế hệ cũ tiếp tục tăng lên, và khi nó chạm tối đa sau một thời gian, ứng dụng sẽ không phản hồi và CPU tăng lên 80%.

Tôi nhận thấy rằng nếu tôi stage.show() trên ứng dụng bằng cách nhấp đúp vào biểu tượng khay, v.v. GC sẽ xóa mọi thứ trở lại bình thường. Tuy nhiên, nếu để lại trong thời gian dài, nó sẽ chỉ đơn giản là không GC các gen cũ.

Kết xuất vùng heap hiển thị javafx.scene.Scene#7javafx.scene.Node[]#2 là có không gian được giữ lại nhiều nhất. Cả hai sẽ không xuất hiện nếu sân khấu không bị ẩn. Trong tham chiếu, nó hiển thị this[] -> dirtyNodes().

this  - value: javafx.scene.Node[] #2 
<- dirtyNodes  - class: javafx.scene.Scene, value: javafx.scene.Node[] #2 
<- value  - class: javafx.scene.Node$ReadOnlyObjectWrapperManualFire, value: 
javafx.scene.Scene #7 

Điều gì gây ra điều này và làm cách nào tôi có thể giải quyết vấn đề này?

+0

Tôi đã giảm đáng kể lượng bộ nhớ bị rò rỉ khi giai đoạn bị ẩn bằng cách xóa hình ảnh GIF duy nhất và một trên sân khấu. Tuy nhiên, vấn đề vẫn xảy ra. Tôi nghi ngờ rằng chủ đề nền cập nhật giao diện người dùng khi nó bị ẩn đang khiến cảnh/nút giữ tham chiếu đến giá trị cũ. Thực hành tốt nhất để cập nhật các ứng dụng như thế nào? Ứng dụng của tôi giống như một ứng dụng trò chuyện với ~ 50 người dùng trực tuyến bất kỳ lúc nào. – staticvoid

+10

có thể là lỗi fx - bạn có thể xem xét báo cáo trong trình theo dõi vấn đề fx, tốt nhất với ví dụ ngắn gọn để thể hiện hành vi – kleopatra

+1

Tôi đồng ý với @kleopatra, có vẻ như lỗi sản phẩm và chỉ nhà phát triển mới có thể giúp bạn ở đó. Theo dõi lỗi JavaFX có tại đây: https://javafx-jira.kenai.com/ –

Trả lời

-1

Java có nhiều tính năng như tham khảo Yếu: https://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html

mềm tham khảo: https://docs.oracle.com/javase/7/docs/api/java/lang/ref/SoftReference.html

những cho phép bạn đặc biệt nhắm vào VM - >> gì để rác thu thập.

cũng có truy cập đồng thời API http://winterbe.com/posts/2015/04/07/java8-concurrency-tutorial-thread-executor-examples/

rằng có sử dụng Executor Dịch vụ và sợi tổng hợp.

và cho bộ nhớ ứng dụng hạn chế trong java Phần mềm nên gọi

System.gc() // garbage collector

tại Khoảng không phân biệt để gọi tự động của nó

Bạn có thể sử dụng lớp Runtime để sắp xếp cân bằng tải cho các dự án https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

public Process exec(String command) 


       throws IOException 
//-------------------------------------------------------- 
    Executes the specified string command in a separate process. 

public void gc() 

//---------------------------------------------------------- 
Runs the garbage collector. Calling this method suggests that the Java virtual machine expends effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. When control returns from the method call, the virtual machine has made its best effort to recycle all discarded objects 
This is a convenience method. An invocation of the form exec(command) behaves in exactly the same way as the invocation exec(command, null, null). 

thr eading luôn luôn là một vấn đề với các ứng dụng chuyên sâu bộ nhớ và trong JavaFX mọi thành phần của một cảnh là các chủ đề chặt chẽ ràng buộc với một cảnh nhưng khi thực hiện, nó dường như bị ràng buộc lỏng lẻo.

Nếu có nhu cầu chạy dài thì tốt hơn nên xử lý một số tác vụ chuyên sâu của bộ xử lý ở phía Gốc (JNI). Hơn nữa, một kiến ​​trúc SẠCH sẽ lợi

https://www.google.co.in/webhp?sourceid=chrome-instant&rlz=1C1CHBF_enIN736IN736&ion=1&espv=2&ie=UTF-8#q=clean+code& *

+1

Tôi không thích câu trả lời này nhiều. Đó là một chút mơ hồ về những gì có thể xảy ra. Phần thực sự thú vị là đoạn bên dưới khối màu xám lớn, nơi bạn bắt đầu nói về 'Scene', nhưng không có gì khác là Java FX cụ thể. Tuy nhiên, trong trường hợp không có bất kỳ giải pháp hợp lý nào khác, bạn là người nhận tiền thưởng. Xin chúc mừng. –

1

Tôi không bao giờ đã tìm và trả lời cho điều này. Thay vào đó, tôi sẽ null nút trên ẩn và khôi phục lại nó trên xem. Đối với các nút động chuyên sâu/nhiều nút, tôi đã tạo một bản đồ băm để lưu trữ chúng trong bộ nhớ.

Điều này đã trở thành một thói quen cho tôi trong javafx8 để vứt bỏ tất cả đồ họa và gán lại trên chế độ ẩn & xem từ bản đồ băm. Bộ nhớ bổ sung và việc sử dụng cpu không đáng kể trên các máy tính để bàn hiện đại. Sử dụng phương pháp này, tôi đã có 0 ứng dụng sử dụng CPU và các ứng dụng bộ nhớ thấp (~ 100m) chạy khi ẩn trên win8/10.

+0

Cảm ơn bạn đã quay lại. Một trong những đồng nghiệp của tôi đã phát hiện ra điều gì đã gây ra rò rỉ bộ nhớ trong trường hợp tôi có, và tôi không nghĩ rằng nó cũng đã xảy ra trong trường hợp của bạn. Nó không phải là cần thiết để làm những gì bạn đã làm, tất nhiên. Nhưng nếu nó phù hợp với bạn, điều đó thật tuyệt. –