2010-08-18 39 views
17

Tôi luôn tự hỏi, tại sao Java yêu cầu bạn đặt kích thước heap theo cách thủ công? Tôi đã được ấn tượng rằng các chương trình được viết bằng các ngôn ngữ khác sẽ chỉ phân bổ bộ nhớ khi cần thiết khi chương trình chạy cho đến khi hệ điều hành có thể cấp phát không còn nữa.Tại sao bạn cần xác định kích thước heap Java?

Trong thế giới Java, chúng ta cần đặt kích thước heap, stack và permgen. Mặc dù điều này đơn giản là đủ để làm tăng những con số này thành số lượng "đủ lớn" là lý do số 1 mà tôi thấy máy chủ bị hỏng.

Tại sao không thể nói cho Java phát triển heap/stack/permgen nhiều như nhu cầu theo thời gian?

Trả lời

4

Giải thích của tôi là Sun là một công ty tập trung vào việc bán Hộp Lớn và họ thích rằng các hệ thống quản trị có thể thực hiện mọi thứ trên các hộp này. Chạy một hệ thống để lấp đầy tất cả bộ nhớ là một cách tốt để chạy nó vào mặt đất và không thể thực hiện hành động để khôi phục hoạt động hiệu quả bởi vì bạn không thể cấp phát bộ nhớ để tạo một vỏ đăng nhập chẳng hạn.

4

Tôi nghĩ rằng vì bộ nhớ thực của máy tính là hữu hạn. Vì vậy, theo một nghĩa nào đó, JVM cho phép bạn phát hiện các memleak trước khi tất cả bộ nhớ bị lãng phí.
Ngoài ra, phải làm gì nếu bạn chạy một số JVM trên cùng một máy - trong trường hợp này làm cách nào để bạn cho phép mỗi JVM này phát triển "nhiều như nhu cầu"?

1

Vì việc tăng kích thước đống, ngăn xếp và kích hoạt permgen chỉ sẽ làm cho máy chủ bị hỏng. Trong một thế giới như vậy, máy chủ cuối cùng sẽ rò rỉ tất cả các tài nguyên của nó.

Ngoài ra, việc phát triển quản lý bộ nhớ tự động không được trưởng thành như ngày nay. Có giới hạn ảo làm cho mọi thứ trở nên dễ dàng hơn nếu bạn chọn mặc định sai, nhưng nó có thể làm cho việc mã hóa kém hiệu quả hơn một chút ở mặt sau.

Có, đây là những dự đoán, nhưng những lý do hợp lý; đặc biệt là khi bạn xem xét nguồn gốc của Java/Oak của chương trình hộp được thiết lập sẵn. Nó không giống như một hệ thống nhúng sẽ có trao đổi hoặc đĩa sao lưu bộ nhớ ảo, vậy tại sao làm cho JVM hành động như thể nó có sẵn?

7

Ba lý do:

  1. Bởi vì Java được dự định là một ngôn ngữ để viết các ứng dụng web. Nó thường không được cho là một ý tưởng tốt để cho một ứng dụng web tiếp quản tất cả các tài nguyên máy.
  2. Vì Java là rác được thu thập. Cũng như chỉ định một giới hạn trên của bộ nhớ, kích thước đống kích hoạt bộ sưu tập rác quá. Về cơ bản bạn đang nói "bạn có thể sử dụng nhiều, nhưng khi bạn đạt đến giới hạn đó, bạn phải dọn dẹp".
  3. Có nhiều lớp ứng dụng mà bạn muốn giới hạn số lượng bộ nhớ được sử dụng bởi quá trình Java, ví dụ: nơi quan trọng hơn là các quy trình khác tiếp tục khi không đủ bộ nhớ cho cả hai.
  4. có thể giới hạn kích thước heap là một tính năng. Nếu bạn thích cách tiếp cận mà quá trình có thể có bộ nhớ không giới hạn, (như trên các ngôn ngữ khác được đề cập) thì bạn luôn có thể đặt giới hạn heap là nhiều hơn mức có thể có được. Nếu bạn muốn giới hạn kích thước heap, bạn có thể làm điều đó. Các ngôn ngữ khác chỉ có một trong những hành vi có thể làm cho chúng ít linh hoạt hơn.
+2

Bạn có nguồn cho điểm đầu tiên không? Tôi chưa bao giờ nghe "java đã được dự định để viết các ứng dụng web" điều trước (không phải là tôi đã đi delving vào lịch sử của java, hoặc là ...) – Mike

+2

Holy mis-moderation.Java được lấy từ Oak, có nghĩa là để thực hiện phần mềm hộp set-top, giống như loại mà bạn có thể có trong các bộ điều chỉnh truyền hình cáp tinh vi. Và như xa như các bộ sưu tập rác đi, rác được thu thập khi đối tượng không thể tiếp cận, không phải khi đạt đến giới hạn bộ nhớ. –

+0

@Edwin Buck: 'rác được thu thập khi đối tượng không thể truy cập được, không phải khi đạt đến giới hạn bộ nhớ' Đúng, nhưng chúng không phải là" ngay lập tức "GCd. Làm thế nào nhanh chóng, bạn phải làm phụ thuộc vào kích thước heap và có thể cực kỳ quan trọng cho hiệu suất. –

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