2008-11-18 39 views
5

Khi tôi gọi một phương thức tĩnh như:Java: `Phương pháp static`

Something.action(); 

Từ một trường hợp không được tạo ra trong bao lâu sẽ Class của phương pháp tĩnh được tổ chức trong bộ nhớ?

Nếu tôi gọi cùng một phương thức, Lớp sẽ được tải lại cho mỗi cuộc gọi vì không có trường hợp nào tồn tại?

Và chỉ có các phương thức tĩnh riêng lẻ được nạp khi được gọi hoặc là tất cả các phương thức và phương thức tĩnh của một Lớp được nạp vào bộ nhớ mặc dù chỉ có một phương thức tĩnh có thể được sử dụng?

Trả lời

11

Trừ khi bạn đã định cấu hình bộ sưu tập rác của khoảng trống, lớp sẽ nằm trong bộ nhớ cho đến khi thoát vm. Lớp đầy đủ được nạp với tất cả các phương thức tĩnh.

+0

Điều này không đúng, mặc dù đây là mô hình tinh thần hợp lý của việc tải lớp. Một số máy ảo sẽ tự động dỡ bỏ các lớp không sử dụng để giảm kích thước bộ nhớ cư trú; tuy nhiên, việc tối ưu hóa như vậy sẽ chỉ đi vào hoạt động với các quy trình chạy rất dài và chỉ trên các máy ảo thực hiện nó. –

4

Lớp nằm trong bộ nhớ cho đến khi trình nạp lớp tải lớp đó nằm trong bộ nhớ. Vì vậy, nếu lớp được nạp từ trình nạp lớp hệ thống, lớp đó sẽ không bao giờ được tải xuống như tôi biết.

Nếu bạn muốn dỡ bỏ một lớp, bạn cần phải:

  1. tải lớp và tất cả các lớp tham chiếu đến lớp rằng việc sử dụng một classloader tùy chỉnh
  2. Sau khi bạn đã làm xong với lớp, phát hành tất cả các tham chiếu đến lớp - nghĩa là đảm bảo không có trường hợp đối tượng của lớp đó xung quanh
  3. Bỏ lớp và tất cả các lớp tham chiếu đến lớp đó bằng cách phát hành cá thể lớp trình tùy chỉnh đã tải các lớp đó.
1

Lớp học sẽ được tải khi lớp người gọi sẽ được tải. Và nó vẫn ở đó cho đến khi lối ra của máy ảo như krosenvold nói.

2

Trong một số cấu hình, lớp này thậm chí còn được tải trước khi bạn thực hiện cuộc gọi. Chúng tôi đã sử dụng BES (Borland Enterprise Server) và chúng tôi đã gặp sự cố với các máy chủ sản xuất Solaris của chúng tôi, nơi tất cả các lớp được tham chiếu được tải đệ quy khi khởi động ứng dụng của chúng tôi. Điều đó có nghĩa, khi lớp chính của ứng dụng của chúng tôi được tải, máy chủ ứng dụng đã tải tất cả các lớp được tham chiếu trong phần nhập của lớp đó ... đệ quy. Là một lưu ý phụ, trừ khi bạn đang chạy trong một môi trường hạn chế bộ nhớ, hoặc nếu bạn đang tải rất nhiều và nhiều lớp không cần thiết, bạn không nên quan tâm quá nhiều đến việc sử dụng bộ nhớ của các lớp được nạp trong bộ nhớ.

+0

Một số vấn đề bạn đã gặp phải với các lớp tham chiếu được tải "sớm" là gì? Tôi tò mò loại vấn đề nào sẽ xảy ra. –

+0

Vấn đề là chúng tôi đã có cùng một thư viện chạy trên máy chủ và trên máy khách. Một số đường dẫn mã sẽ không được thực hiện trên máy chủ, vì vậy chúng tôi đã cố gắng xóa các thư viện không cần thiết mà sẽ không được gọi. Ngay cả khi mã không được gọi, ứng dụng sẽ gặp sự cố khi khởi động. – Guillaume

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