2012-03-01 13 views
10

Được rồi, vì vậy tôi đã phát triển ở Java trong hơn một năm nay và đang nỗ lực tìm hiểu sâu hơn về ngôn ngữ và tốt nhất thực hành.Java Statics Nguyên thủy, đối tượng, phương pháp và Heap (Quản lý bộ nhớ và thực hành tốt nhất)

Vì vậy, đây là những gì tôi biết:

  • Java "đi theo loại" - đó là nguyên thủy vượt qua bằng cách sao chép và vượt qua tham chiếu đối tượng bằng cách sao chép (tài liệu tham khảo trỏ đến đối tượng của họ trên heap).

  • Biến mẫu gốc và tham chiếu trực tiếp trong đối tượng lớp của chúng trong phần tử gốc và cục bộ và tham chiếu trực tiếp trên ngăn xếp (trong khung ngăn xếp tương ứng).

  • Không gian bộ nhớ Perm Gen. là nơi lưu trữ dữ liệu meta lớp (được sử dụng để phản ánh).

  • Heap có một không gian Eden nơi các đối tượng mới là địa điểm, một không gian trẻ nơi các đối tượng đã tồn tại GC được lưu giữ và một không gian có người ở.

Vì vậy, đây là những gì tôi muốn hiểu:

  • đâu tĩnh và tĩnh nguyên thủy cuối cùng và tài liệu tham khảo sống mà JVM có thể sử dụng một trường hợp duy nhất?

  • Các đối tượng cuối cùng tĩnh và tĩnh được lưu trữ trong Heap (tôi cho rằng chúng được chuyển sang sở hữu)?

  • Điều gì được coi là phương pháp hay nhất về số lượng tham chiếu cuối cùng tĩnh trong một ứng dụng?

  • Việc tạo các tham chiếu cuối cùng tĩnh hơn có làm giảm lượng không gian Heap trong JVM không?

Tôi đã đọc nhiều cách giải thích khác nhau về vấn đề này (tất cả khác nhau) và rất thích nếu một cựu chiến binh dày dạn trong ngôn ngữ Java có thể cung cấp một lời giải thích tốt. Cảm ơn trước!

+1

câu hỏi này SO có một số thông tin về các lớp học tĩnh http://stackoverflow.com/questions/3849634/ static-alloc-in-java-heap-stack-và-vĩnh viễn-thế hệ – fasseg

Trả lời

5

Không gian trẻ bao gồm không gian eden và không gian sống sót.

Nguyên tắc và tham chiếu cuối cùng tĩnh và tĩnh tồn tại ở đâu mà JVM có thể sử dụng một cá thể đơn lẻ?

Nó không được xác định, nhưng trong Sun/Oracle JVM, trường tĩnh sống trong một đối tượng đặc biệt cho các trường lớp. Bạn có một cá thể cho mỗi trình nạp lớp để các trường tĩnh có thể có nhiều phiên bản.

Là các đối tượng cuối cùng tĩnh và tĩnh được lưu trữ trong Heap (Tôi cho rằng chúng được chuyển sang sở hữu)?

Trong Sun/Oracle Java 7 chúng là. Họ có thể ở trong Perm Gen hoặc bất cứ nơi nào khác.

Điều gì được coi là phương pháp hay nhất về số lượng tham chiếu cuối cùng tĩnh trong một ứng dụng?

Giữ chúng ở mức tối thiểu.

Sẽ tạo thêm tham chiếu cuối cùng tĩnh giảm lượng không gian Heap trong JVM?

Nếu bạn có thể thay đổi trường cuối cùng thành trường cuối cùng tĩnh, điều này có thể tiết kiệm không gian (nếu bạn có nhiều phiên bản) Tuy nhiên, rõ ràng thường quan trọng hơn hiệu suất. (Và tôi sẽ làm điều đó cho rõ ràng)

BTW: Tôi đã phát triển ở Java trong 13 năm.

Vì vậy, có thể có nhiều trường hợp của các lĩnh vực tĩnh - không JVM thay đổi mỗi trường hợp

Họ là độc lập. Mỗi trình nạp lớp có thể tải phiên bản riêng của một lớp (mã không phải giống nhau) và mỗi trường có các trường tĩnh riêng của chúng (chúng không phải giống nhau)

nếu tĩnh trường được thay đổi (ví dụ: static int instanceCount trong đó instanceCount ++ được thực thi trên mỗi đối tượng xây dựng)?

số

Ngoài ra, các đối tượng có thể được chuyển đến Perm Gen?

Không. Một số dữ liệu không được xác định tại một địa điểm có thể ở bất kỳ đâu tùy thuộc vào triển khai và phiên bản.

Perm Gen. được coi là một phần của Heap?

Đây là một phần của gen cũ = tenured + perm gen.

trẻ gen = eden + không gian sống sót * 2

Maximum Heap Kích thước giới hạn gen & tổng trẻ tenured. Perm gen và bộ nhớ trực tiếp có giới hạn riêng của chúng. Các tệp được ánh xạ bộ nhớ được thực hiện theo bất kỳ giới hạn nào trong số các giới hạn này.

Điều này đúng cho bộ thu song song mặc định và quét đồng thời.

Bộ thu G1 không chia không gian theo cùng một cách.


Liên kết để biết thêm chi tiết

http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

Java heap terminology: young, old and permanent generations?

http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html

+0

cảm ơn bạn đã phản hồi nhanh chóng của bạn làm rõ thứ hai về không gian Heap Young. Vì vậy, có thể có nhiều trường hợp của các trường tĩnh - không JVM thay đổi mỗi trường hợp nếu một trường tĩnh được thay đổi (ví dụ: static int instanceCount trong đó instanceCount ++ được thực thi trên mỗi đối tượng xây dựng)? Ngoài ra, các đối tượng có thể được chuyển đến Perm Gen? Perm Gen. được coi là một phần của Heap? Xin lỗi vì rất nhiều câu hỏi, điều này rất hữu ích cho tôi và tôi cảm ơn bạn rất nhiều. Nếu bạn không nhớ chỉ cần cập nhật câu trả lời của bạn với những giải pháp này để những người khác sẽ tìm thấy nó dễ dàng để có được. Cảm ơn một lần nữa. – jjNford

+0

Tôi muốn quan tâm đến việc đọc thêm về điều này - bạn có thể cung cấp một số nguồn không? (Hoặc là những thứ như được bao phủ bởi JVM-Spec?) – quaylar

+0

@quaylar Chúng thường là các chi tiết thực hiện không được đề cập trong thông số kỹ thuật. –