2013-02-25 27 views
8

gì xảy ra nếu bạn chạy đoạn mã sau ..hỏi bộ nhớ Java về 'mới' từ khóa

while (true) { 
    String x = new String("ABC"); 
} 

về bộ nhớ?

Chuỗi x được phân bổ trên ngăn xếp hoặc trên heap? Liệu chương trình có bị hỏng do tràn bộ nhớ hay bộ sưu tập rác sẽ ngăn không? Liệu từ khóa mới luôn tạo đối tượng trên heap? Khi nào một đối tượng được tạo trên ngăn xếp?

Cảm ơn!

+1

Bạn có thể muốn xem http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3 –

+0

Xin chào Rohan, xin vui lòng, mỗi lần một câu hỏi. – MByD

+0

chúng là những câu hỏi liên quan, vì vậy tôi đã thêm chúng lại với nhau nên tôi (và những người khác) có thể hiểu rõ về chủ đề này! –

Trả lời

7

Chuỗi x được phân bổ trên ngăn xếp hoặc trên heap?

x không phải là String. Nó là một tham chiếu đến một String. Tham chiếu là một biến cục bộ, và như vậy sẽ nằm trên stack. Các String là một đối tượng, và do đó đi trên heap.

sẽ chương trình cuối cùng sụp đổ vì một lỗi tràn bộ nhớ

Có lẽ không.

hoặc bộ sưu tập rác có ngăn không?

Nên.

Từ khóa mới luôn tạo đối tượng trên heap?

Có.

Khi nào một đối tượng được tạo trên ngăn xếp?

Không bao giờ ... trừ khi JVM quyết định không thể thoát khỏi phạm vi hiện tại và do đó quyết định làm như vậy.

+0

+1 Câu trả lời hay với lời giải thích. :) –

+1

Không hoàn toàn là lĩnh vực chuyên môn của tôi - nhưng không phải trường hợp cụ thể này là một tình huống mà đối tượng không thể thoát khỏi phạm vi hiện tại và phân tích thoát do đó khiến cho String được cấp phát trên ngăn xếp? – mikera

+0

Vâng chương trình sẽ không gặp sự cố, tôi tiếp tục chạy đoạn mã này trong một thời gian dài và chương trình vẫn đang chạy. Câu trả lời hay !! (+1) – asifsid88

2

Sử dụng mới, có, đặt các đối tượng trên heap. Các đối tượng không còn truy cập được bởi bất kỳ luồng nào cũng có thể được thu thập rác. Cho dù bạn hết bộ nhớ hay không phụ thuộc vào kích thước dữ liệu mà chương trình của bạn sử dụng, và nếu bạn giỏi các đối tượng 'giải phóng' bạn không cần nữa (nghĩ: rò rỉ bộ nhớ là xấu).

Trong ví dụ của bạn, bạn sẽ chạy trình thu gom rác như điên, mà tôi nghĩ là những gì bạn đang có ý định chứng minh.

Biến cục bộ nằm trên ngăn xếp.

-1

Về lý thuyết, new tạo trên Heap và không phải đối tượng (tức là, int s, char s và cứ tiếp tục) được tạo trên ngăn xếp. Ngoại lệ duy nhất, afaik, là các chuỗi, được tạo trên ngăn xếp. Trong thực tế, trình biên dịch JIT của nhiều JVM hiện đại sẽ thấy rằng, trong một số trường hợp, các đối tượng được tạo với new có thể được tạo trên ngăn xếp (ví dụ, các đối tượng cục bộ không được tham chiếu bên ngoài hàm hiện tại).

Bộ thu gom rác sẽ xử lý thỏa thuận cho bạn, đó là mục đích của nó, nhưng tất nhiên bạn có thể hết bộ nhớ nếu bạn tạo và giữ tham chiếu trên quá nhiều đối tượng cùng một lúc (thử tạo danh sách với tỷ chuỗi, ví dụ).

+0

Không có ngoại lệ nào cho các Chuỗi trong ngăn xếp. – EJP