2012-06-27 37 views
5

Có cách nào để phát hiện sự kết thúc của giai đoạn khởi động của JVM không?phát hiện sự kết thúc của giai đoạn khởi động của JVM

chỉnh sửa ::

như vậy để cung cấp bối cảnh hơn một chút, những gì tôi đang cố gắng làm là để cụ JDK. Và đây là một công cụ thổi đầy đủ ghi lại mọi lệnh mã byte LOAD, STORE, INVOKE. Khi các lệnh được thực hiện, dữ liệu của chúng được gửi đến một phương thức tĩnh, được nạp từ xbootclasspath. Phương thức tĩnh này nắm bắt tất cả thông tin này và lưu trữ tất cả các thông tin này như một dấu vết để thực hiện phân tích sau này.

Bây giờ, khi tôi làm điều này cho JDK, tôi không muốn làm phiền cách thức các lớp được nạp trong JVM, điều này có thể dẫn đến sự cố chương trình. Tôi đã đoán rằng cách tốt nhất để đi về nó là để phát hiện các điểm trong thời gian khi JVM được thực hiện bootstrapping, để tôi có thể an toàn bật thiết bị của tôi sau đó. (Tôi có kế hoạch không cụ bất kỳ mã nào, trong khi việc khởi động đang diễn ra.) Đây có phải là cách đúng đắn để đi về nó không?

+0

Bạn có nghĩa là từ bên trong mã java chưa được tải của bạn? Hoặc từ một chương trình bên ngoài? là để tải/hồ sơ? –

+4

Khi JVM tải chậm, điều này không bao giờ thực sự xảy ra. Bạn có thể có các lớp được tải lần đầu tiên khi tắt máy. –

+0

@PeterLawrey Điều đó có đúng với các lớp lõi của rt.jar không? –

Trả lời

2

Ngoài bình luận trước đây của tôi về nhìn vào FERRARIMAJOR tôi muốn nói một vài điều:

  • Cả hai công cụ này là chỉ có sẵn để tải về như biên soạn tài liệu lưu trữ JAR Java.
  • Vì vậy, tôi đã viết cho các nhà khoa học đã tạo ra những công cụ này ngày hôm nay và hỏi họ câu hỏi của chúng tôi. Ngay khi tôi nhận được câu trả lời, tôi sẽ báo cáo lại ở đây.
  • Dù sao, tôi đã xem xét kiến ​​trúc của FERRARI và nghĩ rằng tôi có thể đã tìm ra cách họ làm điều đó.

Vì vậy, đây là đoán giáo dục của tôi (vẫn chưa được kiểm tra) về những gì bạn có thể làm:

  • Instrument lớp JDK của bạn.
  • Thêm một lớp đơn giản BootstrapLock như được mô tả bên dưới.
  • Đóng gói lại thiết bị + lớp mới thành một sửa đổi rt.jar.
  • Viết một chút giả Java agent như được mô tả bên dưới.
public class BootstrapLock { 
    private static volatile boolean inBootstrap = true; 

    public static boolean inBootstrap() { 
     return inBootstrap; 
    } 

    public static synchronized void setEndOfBS() { 
     inBootstrap = false; 
    } 
} 

public class DummyAgent { 
    public static void premain(String options, Instrumentation ins) { 
     BootstrapLock.setEndOfBS(); 
    } 
} 

Vì vậy, về cơ bản logic như sau:

  • Đại lý được nạp trước lớp ứng dụng chính, nhưng sau khi bootstrapping.
  • Do đó, thực tế là tác nhân đang hoạt động có nghĩa là quá trình khởi động kết thúc.
  • Do đó tác nhân có thể tắt điểm đánh dấu toàn cầu inBootstrap.
  • Các lớp học cụ thể của bạn có thể kiểm tra điểm đánh dấu để xác định xem mã thiết bị bổ sung của họ có nên bị bỏ qua hay không.

Tôi không chắc liệu tôi có đủ thời gian để kiểm tra điều này sớm hay không, nhưng ít nhất tôi muốn đăng câu trả lời ở đây để có thể bạn, Vijai, cũng có thể xem xét và cung cấp phản hồi. Bốn mắt nhìn hơn hai ...


Cập nhật: Một trong những tác giả FERRARI đã trả lời thắc mắc của tôi và xác nhận giải thích của tôi ở trên. Bạn chỉ có thể sử dụng một tác nhân java làm điểm đánh dấu của JVM khi đã hoàn tất việc khởi động của nó. Có lẽ bạn thậm chí không cần lớp bổ sung, nhưng chỉ cần kiểm tra xem tác nhân đã được tải vào JVM chưa. Nó sẽ làm cho mọi việc trở nên đơn giản hơn, tôi chỉ không biết liệu nó có hoạt động tốt hay không. Chỉ cần kiểm tra nó.

+0

nhưng ngay cả khi tác nhân đã được tải, tại sao bảo đảm thực tế là việc khởi động hoàn tất? có lẽ tôi đang thiếu một cái gì đó cơ bản ở đây. cảm ơn vì câu trả lời! – vijay

+1

Để chính xác hơn, nó không được kết nối với tải lớp, nhưng để gọi phương thức 'premain' của đại lý. Khi phương thức này được gọi, bạn có thể gọi bất kỳ loại mã JVM nào. Đây cũng là điều mà những kẻ FERRARI nói. Đọc lại những gì tôi đã viết theo "về cơ bản logic là như sau". – kriegaex

+0

nó có vẻ rõ ràng hơn bây giờ, nhưng một nghi ngờ cuối cùng: những gì bạn có nghĩa là bởi bất kỳ loại mã JVM? bạn có nghĩa là một khi tiền được gọi, người ta có thể giả định một cách an toàn rằng việc thực thi mã thiết bị của tôi sẽ không làm hỏng JVM? – vijay

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