2013-01-14 35 views
12

Tôi không biết nhiều về ngôn ngữ lập trình Go, nhưng tôi đã thấy một số tuyên bố cho biết Go có bộ sưu tập rác trễ, và nó tốt hơn nhiều so với các bộ thu gom rác khác (như bộ thu gom rác JVM). Tôi đã phát triển ứng dụng cho JVM và tôi biết rằng bộ thu gom rác JVM không phải là độ trễ-miễn phí (đặc biệt trong việc sử dụng bộ nhớ lớn).Phương pháp thu gom rác thải ngôn ngữ Go là gì so với các phương pháp khác?

Tôi đã tự hỏi, sự khác biệt giữa cách tiếp cận thu gom rác thải trong Go và các phương thức khác khiến nó không có độ trễ là gì?

Xin cảm ơn trước.


Edit: @All tôi thay đổi nội dung câu hỏi này hoàn toàn, hãy bỏ phiếu để mở lại câu hỏi này nếu bạn tìm thấy nó mang tính xây dựng.

+6

Trong trò chơi Java, tôi sẽ không bao giờ cho phép trình thu gom rác chạy đến khi đạt được điểm thích hợp trong trò chơi (ví dụ như menu tạm dừng). Để đạt được điều này, tôi sẽ luôn luôn có một số loại lớp quản lý mà giữ giữ một tham chiếu đến tất cả các đối tượng được tạo ra và phát hành tất cả khi trình đơn tạm dừng hoặc kết thúc cấp độ đạt được. –

+0

Bạn có thể thích điều này để so sánh. http://code.google.com/p/jgo/ Nếu Go hỗ trợ 'struct', điều này có khả năng tránh được GC một cách rõ ràng thay vì hy vọng JIT sẽ làm điều này cho bạn một cách ngầm định. –

+0

@JonTaylor Tại sao bạn làm điều này? vì hiệu suất của bộ thu gom rác JVM hay bất cứ thứ gì khác? –

Trả lời

14

Đi không có bộ sưu tập rác không có thời gian chờ. Nếu bạn có thể chỉ ra nơi những tuyên bố đó là, tôi muốn cố gắng sửa chúng.

Một lợi thế mà chúng tôi tin rằng Go có trên Java là nó mang đến cho bạn nhiều quyền kiểm soát hơn đối với bố cục bộ nhớ. Ví dụ: một gói đồ họa 2D đơn giản có thể xác định:

type Rect struct { 
    Min Point 
    Max Point 
} 

type Point struct { 
    X int 
    Y int 
} 

Trong Go, một Rect chỉ là bốn số nguyên tiếp giáp trong bộ nhớ. Bạn vẫn có thể vượt qua & r.Max để chức năng mong đợi một điểm *, đó chỉ là một con trỏ vào giữa biến Rect r.

Trong Java, biểu thức tương đương sẽ là tạo các lớp Rect và Point, trong trường hợp này trường Min và Max trong Rect sẽ là con trỏ tới các đối tượng được phân bổ riêng. Điều này đòi hỏi các đối tượng được phân bổ nhiều hơn, chiếm nhiều bộ nhớ hơn, và cho bộ thu gom rác nhiều hơn để theo dõi và nhiều hơn nữa để làm. Mặt khác, nó không bao giờ cần phải tạo một con trỏ đến giữa một đối tượng.

So với Java, sau đó, Go cung cấp cho bạn lập trình viên kiểm soát nhiều hơn bố cục bộ nhớ và bạn có thể sử dụng điều khiển đó để giảm tải trên bộ thu gom rác. Điều đó có thể rất quan trọng trong các chương trình với số lượng lớn dữ liệu. Việc kiểm soát bố cục bộ nhớ cũng có thể quan trọng đối với việc trích xuất hiệu suất từ ​​phần cứng do hiệu ứng bộ nhớ cache và như vậy, nhưng đó là tiếp tuyến với câu hỏi ban đầu.

Bộ thu trong bản phân phối Go hiện tại là hợp lý nhưng không có nghĩa là trạng thái của nghệ thuật. Chúng tôi có kế hoạch dành nhiều nỗ lực hơn để cải thiện nó trong một hoặc hai năm tới. Để rõ ràng, Bộ thu gom rác của Go chắc chắn không tốt bằng các bộ thu gom rác hiện đại của Java, nhưng chúng tôi tin rằng việc viết các chương trình không cần nhiều bộ sưu tập rác sẽ dễ dàng hơn, do đó hiệu ứng ròng vẫn có thể rằng việc thu gom rác thải ít là vấn đề trong chương trình Go hơn là trong một chương trình Java tương đương.

+0

Tôi nhìn thấy nó trong đi faq: http://golang.org/doc/faq#garbage_collection –

+1

Tôi nghĩ rằng điều này có liên quan nhiều hơn đến ngôn ngữ java so với bản thân jvm ... scala, một ngôn ngữ jvm có các lớp giá trị đang làm một công việc tương tự http://docs.scala-lang.org/overviews/core/value-classes.html Tôi muốn nhiều tài nguyên hơn so sánh jvm với go gc, cả hai đều khá thú vị và tôi cảm thấy cả hai đều được bao quanh bởi rất nhiều huyền thoại và quan niệm sai lầm ..... – CocoOS

+0

@SaeedZarinfam, bạn có thể đã đọc sai. Tôi không thấy xác nhận quyền sở hữu "bộ sưu tập rác thải không có độ trễ" ở đó (cũng không phải [tìm kiếm nhanh về lịch sử của nó] (https://github.com/golang/go/blame/master/doc/go_faq.html# L1867)). Nó chỉ nói "[...] sự tự tin rằng chúng tôi ** có thể thực hiện ** nó với [...] không có ** độ trễ đáng kể **" (nhấn mạnh thêm). Điều này được sử dụng ngay lập tức theo sau là một lưu ý cha mẹ về triển khai * hiện tại * (ghi chú đã được chuyển đến đoạn riêng của nó). Đối với tôi "không có độ trễ đáng kể"! = "Không có độ trễ" và nó cũng đề cập đến các cải tiến * tương lai *. –

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