2011-08-18 21 views
5

Một mẫu tiêu chuẩn được sử dụng trong thư viện lớp Scala là định nghĩa các lớp trong các lớp và các đặc điểm. Và hầu hết các hoạt động của các đối tượng của các lớp cha đều dẫn đến các đối tượng của các lớp bên trong đó được tạo ra. Mỗi lớp bên trong là khác nhau cho mỗi đối tượng.Ảnh hưởng của các định nghĩa lớp Scala trên không gian gen perm

ví dụ: Xem nguồn cho scala.io.Source và LineIterator. Tôi nghĩ đây là thư viện đơn giản nhất trong thư viện chuẩn.

Như các tài liệu đề xuất dưới đây là hai lớp khác nhau.

val s1:Source = ... 
val s2:Source = ... 
s1.getLines.getClass != s2.getLines.getClass //true if s1 != s2 

Có nghĩa là hai lớp được tạo.

Vì toàn bộ thư viện bộ sưu tập đang sử dụng cùng một mẫu, các hiệu ứng trên không gian permgen cho các quy trình chạy dài là gì?

Trả lời

6

Tôi không chắc chắn cách bạn kết luận rằng nếu s1 != s2, thì s1.getLines.getClass != s2.getLines.getClass. Nếu tôi tạo hai trường hợp BufferedSource bằng cách sử dụng Source.fromFile, thì cả hai trường hợp sẽ trả lại một phiên bản của cùng một lớp scala.io.BufferedSource$BufferedLineIterator khi tôi gọi getLines.

scala> s1 == s2 
res6: Boolean = false 

scala> s1.getLines.getClass == s2.getLines.getClass 
res7: Boolean = true 

Đúng là Scala tạo ra rất nhiều lớp, nhưng điều này được thực hiện vào thời gian biên dịch, không phải thời gian chạy, do đó, perm gen không phải là vấn đề đối với các quy trình chạy dài.

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