Theo this question, cách tiêu chuẩn để xác định kích thước bộ nhớ của một đối tượng trong Java là bằng cách sử dụng java.lang.instrumentation. Sau một số nghiên cứu, có vẻ như không có cách cụ thể nào để đạt được điều này, vì vậy phương pháp Java cũng nên áp dụng ở đây.xác định kích thước của đối tượng: cách tốt nhất để sử dụng thiết bị đo đạc trong scala/sbt
Thật không may, đối với một lập trình viên Scala không có nền Java, nó không hoàn toàn đơn giản để thích ứng với kỹ thuật này trong Scala. Câu hỏi của tôi là:
Câu hỏi 1
gì chính xác đang xảy ra ở đây? Tôi đoán lý do tại sao chúng tôi phải đặt một lớp như ObjectSizeFetcher
trong một JAR riêng biệt là để đảm bảo rằng nó được tải bằng cách nào đó trước khi chương trình thực tế mà chúng tôi muốn sử dụng nó. Tôi cho rằng không thể sử dụng thiết bị mà không có mục nhập Premain-Class
và thông số -javaagent:TheJarContainingObjectFetcher.jar
?
Câu hỏi 2
Có một cách đơn giản để thực hiện khối lượng công việc hoàn thành trong SBT? Hiện tại tôi chỉ thấy một giải pháp hơi cồng kềnh: đầu tiên tôi phải thiết lập một dự án SBT thứ cấp nơi tôi xác định ObjectSizeFetcher
và gói nó vào một JAR. Cho đến nay tôi đã không tìm ra cách tự động thêm mục nhập Premain-Class
vào JAR trong quá trình đóng gói, vì vậy tôi sẽ phải giải quyết thủ công. Hơn tôi có thể thêm JAR kết quả cho các thư viện địa phương của dự án mà tôi muốn sử dụng getObjectSize
. Đối với dự án này, tôi phải kích hoạt fork in run
và sử dụng javaOptions in run += "-javaagent:TheJarContainingObjectFetcher.jar"
. Có một luồng công việc đơn giản hơn (và ít xâm nhập) hơn để nhanh chóng sử dụng thiết bị đo đạc trong một dự án SBT hiện có không? Có lẽ tôi có thể nói trực tiếp với SBT về một số Premain-Class
để làm cho JAR phụ này không cần thiết?
Câu hỏi 3
Bạn có đề nghị một cách hoàn toàn khác nhau để đánh giá việc sử dụng bộ nhớ của một đối tượng trong Scala?
Tôi ước đã có một cách gọn gàng hơn để thực hiện điều đó cho Scala trong SBT giao diện REPL .... – matanster