2014-10-09 12 views
6

Tôi đang theo dõi ứng dụng Java của mình (viết bằng JDK 1.7) sử dụng VisualVM. Sau đây là biểu đồ hiển thị mức sử dụng bộ nhớ heap trong khoảng thời gian mà ứng dụng này chạy.VisualVM: Biểu đồ Sử dụng Bộ nhớ Heap Lý tưởng

enter image description here

Nhìn vào biểu đồ này những người thấy rằng có rất nhiều gai trong đó. Những đột biến này cho biết việc tạo ra các đối tượng bằng ứng dụng. Một khi ứng dụng được thực hiện với chúng, nó sẽ phá hủy chúng bằng cách sử dụng gc (được gọi ngầm trong trường hợp này).

Ngoài ra, đây là một ảnh chụp màn hình của bộ nhớ profiler khi ứng dụng vẫn chạy

enter image description here

Đối với tôi bản chất lên xuống của đồ thị chỉ ra việc sử dụng hiệu quả của các đối tượng java. Liệu suy luận này có đúng không?

Bản chất lý tưởng của đồ thị sử dụng đống mà người dùng nên nhắm đến là gì?

Có cách nào khác để tôi có thể cải thiện việc sử dụng bộ nhớ heap bằng ứng dụng của mình không?

+2

Rất nhiều đột biến cho chương trình hiển thị phù hợp sẽ tạo ra nhiều đối tượng sống ngắn hơn theo thời gian. Có thể, điều này có thể được tối ưu hóa. –

+0

Việc sử dụng bộ nhớ của bạn trông hoàn toàn tốt đẹp –

+0

@VictorSorokin JVM GC xử lý rất nhiều đối tượng sống ngắn khá tốt. Đây không phải là một vấn đề. – pickypg

Trả lời

3

Với tôi bản chất lên xuống của biểu đồ cho thấy việc sử dụng các đối tượng java hiệu quả. Liệu suy luận này có đúng không?

Tôi sẽ nói việc sử dụng hiệu quả bộ thu gom rác. Tôi khuyên bạn nên tạo ít đối tượng hơn có thể hiệu quả hơn.

Bản chất lý tưởng của đồ thị sử dụng đống mà người dùng nên nhắm đến là gì?

Điều đó tùy thuộc vào đơn đăng ký của bạn. Tôi có xu hướng nhắm đến cái gần như hoàn toàn bằng phẳng.

Có cách nào khác để tôi có thể cải thiện việc sử dụng bộ nhớ heap bằng ứng dụng của mình không?

tải

  • tạo ít rác. Sử dụng hồ sơ bộ nhớ của bạn để tìm ra nơi rác đang được tạo ra.
  • làm cho heap lớn hơn để nó không GC thường xuyên.
  • di chuyển dữ liệu giữ bạn khỏi đống (bạn dường như không có nhiều)

Trong trường hợp của bạn, tùy chọn tốt nhất là nên giảm lượng rác bạn đang sản xuất.

+0

Tôi đang thực sự tạo lại cùng một loại đối tượng java khi tôi yêu cầu chúng. Nó sẽ giúp tái sử dụng các đối tượng được tạo ra nhưng không khởi tạo (thiết lập sau đó để null) chúng khi không cần thiết. Trong trường hợp này, jvm sẽ không đánh dấu chúng là rác. Do đó gc sẽ ít được gọi thường xuyên hơn. – davison

+0

@davison nó có thể giúp đỡ nếu bạn tái chế hầu hết các đối tượng. Nếu bạn tái chế chỉ là một đối tượng cấp cao nhất nó có thể không giúp đỡ. Nếu bạn chưa sử dụng một trình lược tả thương mại như YourKit, bạn có thể thấy rằng có 10 điều tốt hơn để tối ưu hóa trước tiên. Bạn có thể nhận được một giấy phép eval cho YourKit và các hồ sơ khác. Nếu tôi không đo, tôi chỉ đoán thôi. –

+1

@davison bạn có thể loại bỏ các Iterator này bằng cách sử dụng vòng lặp được lập chỉ mục. –

1

Miễn là kích thước heap giữ gần như giống nhau theo thời gian, bạn vẫn ổn. Heap được sử dụng nên đi lên và xuống do bản chất của việc tạm dừng gc thế giới trong Sun JVM. Có vẻ như rất nhiều đối tượng sống ngắn được tạo ra trong ứng dụng của bạn, nó có thể không hiệu quả, nhưng đôi khi bạn cần tạo chúng. Đó là lối sống của Java: D

Các vấn đề liên quan