2010-02-11 3 views
5

Tôi có một Tomcat với một số ứng dụng đang chạy. Tôi không thể khởi động lại Tomcat nhưng tôi muốn theo dõi việc sử dụng các tệp lớp.Có thể đăng nhập nếu một lớp trong JVM được sử dụng không?

Tôi muốn đăng nhập nếu một lớp được chỉ định được sử dụng. Điều này có thể không? Làm thế nào tôi có thể hoàn thành nó?

Cách sử dụng lớp: Nếu một đối tượng cho lớp này được khởi tạo hoặc phương pháp được gọi là vv

Làm rõ: Tôi không thể khởi động lại ứng dụng. Mọi giải pháp với việc biên dịch lại mã đang chạy không được chấp nhận. Điều đó làm cho vấn đề trở nên khó khăn.

Gỡ lỗi từ xa/JMX chưa được bật. Nó sẽ là một nỗ lực tương tự như biên dịch lại ứng dụng để kích hoạt nó.

Nền tảng là RHEL, 64 bit.

+3

Vui lòng làm rõ ý của bạn về việc lớp học có được "sử dụng" hay không. –

+0

Bạn có thể xác nhận nền tảng này không? –

+1

Gỡ lỗi từ xa, JMX hay bất kỳ thứ gì đã được thiết lập trên phiên bản Tomcat chưa? Nếu không, có thể bạn không may mắn ... – Nate

Trả lời

1

Tôi muốn đăng nhập nếu một lớp được chỉ định được sử dụng; tức là nếu một đối tượng cho lớp này được khởi tạo hoặc các phương pháp được gọi là v.v.

Trình lược tả bộ nhớ sẽ cho bạn biết trường hợp có thể truy cập của lớp có thể tồn tại ngay khi bạn chạy hồ sơ. Trình lược tả thực thi có thể cho bạn biết rằng một phương thức hoặc hàm tạo được gọi trong một khoảng thời gian nào đó ... mặc dù nó cũng có thể bỏ lỡ một cuộc gọi, do cách mà profilers làm việc.

Trình nạp lớp của webapp có thể lý thuyết cho bạn biết nếu một lớp đã được tải, nhưng tôi nghi ngờ có cách gọi phương thức của trình nạp lớp không liên quan đến khởi động lại. Ngoài ra, không có cách nào để biết nếu một phương thức có EVER được gọi hay một cá thể có EVER được tạo ra ngoài việc thêm các móc giám sát vào lớp. Và thêm những móc sẽ đòi hỏi phải khởi động lại.

Và tất nhiên có những cách khác mà một lớp có thể được "sử dụng" mà không đòi hỏi phải xây dựng trường hợp hoặc gọi phương thức của nó.

Vì vậy, tùy thuộc vào những gì bạn đang thực sự cố gắng tìm ra, bạn có thể không may mắn.

1

Tôi nghĩ bạn cần lược tả điều đó. Profiler sẽ cho phép bạn xem những lớp nào được sử dụng. Hoặc các lập trình viên fav - System.out.println :)

+0

Tôi sẽ thử lược tả, nhưng tôi không chắc liệu nó có hoạt động hay không. – guerda

+1

Tôi nghĩ hồ sơ yêu cầu cài đặt trên JVM yêu cầu khởi động lại để áp dụng. –

0

Nếu bạn có quyền truy cập vào tệp nguồn, bạn có thể chỉ cần đặt một số câu lệnh tường trình trong hàm khởi tạo của lớp (giả sử instantiation ngụ ý sử dụng lớp).

Nếu instantiation đối tượng không phải là những gì bạn có nghĩa là "việc sử dụng các tập tin lớp", thì có lẽ bạn có nghĩa là bạn muốn biết khi một lớp được nạp bởi JVM? Nếu có, static initialization blocks có thể giúp bạn; bạn có thể đặt các bản ghi nhật ký ở đó.

+1

nếu anh ta không thể khởi động lại Tomcat, anh ta cũng không thể cập nhật mã ứng dụng. – Thilo

+0

Bạn không chắc chắn như vậy. Tôi dường như nhớ bỏ vào .jar's vào thư mục Tomcat của bạn để triển khai động. –

+0

Tôi không chắc chắn âm thanh, vì OP không rõ ràng trong các yêu cầu của anh ấy. Nếu khởi động lại Tomcat, việc triển khai lại có thể cũng bị cấm (vì có thể đang cập nhật nguồn ở vị trí đầu tiên). – Thilo

0

Nếu bạn muốn biết nó một cách có lập trình thì tôi không nghĩ rằng điều đó là tầm thường.

Nhưng bạn có thể thực hiện một số phản ánh để biết, bằng cách gọi phương thức này.

ClassLoader#findLoadedClass() 

Nếu phương thức trả về null, điều đó có nghĩa là lớp học không được tải và do đó không được sử dụng. Vấn đề tất nhiên, là phương pháp được bảo vệ, vì vậy bạn cần phải sử dụng sự phản chiếu.

-1

Bạn có thể xác định một khối tĩnh trong lớp

class X { 
static { 
    System.out.println("class X has been loaded"); 
} 
... 
} 

sẽ được gọi một lần khi đối tượng lớp được nạp.

Nếu bạn không thể chỉnh sửa mã, và bạn có một JRE 6, bạn có thể thử công cụ jmap

jmap -histo <pid> 

nó sẽ in một biểu đồ của đống bạn, bao gồm tất cả các lớp được nạp.

Sử dụng jps bạn có thể tìm hiểu các pid

+0

Ý tưởng hay. Đối với vấn đề của tôi, nó sẽ không hoạt động vì tôi không thể biên dịch lại ứng dụng. – guerda

0

Nếu bạn đang ở trên Solaris hay OS X, sau đó một cuộc điều tra DTrace sức mạnh vào tùy chọn.

Ngoài ra, nếu bạn không thể đính kèm trình gỡ lỗi hoặc trình hồ sơ hoặc công cụ giám sát khác vào JVM đã chạy (tùy thuộc vào các tùy chọn bạn cần để chỉ định khi khởi động), bạn sẽ không may mắn.

+0

Solaris cũng có 'pfiles' hoặc' truss'. –

-1

Với JRockit JVM bạn có thể bắt đầu ứng dụng của mình bằng -Xverbose: class = info để nhận thông tin về tải lớp học.

+0

JVM của Sun cũng hỗ trợ cờ đó. – Thilo