2012-01-17 8 views
7

Có thể tạo một số tập hợp con của các chủ đề (ví dụ: từ ThreadPool cụ thể) phân bổ bộ nhớ từ heap riêng không? Ví dụ. hầu hết các chủ đề được phân bổ từ đống chia sẻ thông thường, và vài luồng công nhân được phân bổ từ từng vùng riêng lẻ (1: 1 cho mỗi luồng).Phân bổ heap theo chủ đề cụ thể

Mục đích là để đảm bảo thực hiện an toàn mã trong môi trường chung - công nhân bình thường là không quốc tịch và đang chạy trên chuỗi riêng biệt, xử lý một yêu cầu không được tiêu thụ quá 4MB.

Cập nhật # 1 Nhưng tại sao bạn lại lo lắng về "thực thi an toàn" và tăng tiêu thụ hàng đống không thể đoán trước?

Vấn đề là lưu trữ an toàn mã java bên thứ ba tùy ý trong quá trình của tôi. Một khi các điểm là không nhận được "Out of Memory" cho toàn bộ quá trình của tôi vì lỗi trong mã của bên thứ 3.

Update # 2 Re: Tính đến hạn chế sử dụng bộ nhớ cho mỗi thread, trong Java ngôn ngữ nó không thể

Theo điều tra của tôi trước khi tôi đã đăng câu hỏi này quan điểm của tôi là như nhau, tôi chỉ là hy vọng tôi đang thiếu một cái gì đó.

duy nhất giải pháp khả thi thay thế cho việc sử dụng hợp cụ thể của tôi như là tôi thấy ngay bây giờ là ...

1) How much memory does my java thread take? - ca khúc chủ đề sử dụng bộ nhớ trong một số chủ đề đốc và chấm dứt chủ đề xấu

2) Run Java code on my own JVM - Vâng, có thể. Bạn có thể tải xuống triển khai mã nguồn mở JVM, sửa đổi nó ... :)

+1

Không, toàn bộ ý tưởng đằng sau chủ đề phải nhẹ nhất có thể, vì vậy chúng chia sẻ cùng một đống; nó cũng sẽ làm cho việc đồng bộ hóa trở nên khó khăn hơn nếu họ cho phép nó.Nhưng tại sao bạn lo lắng về "thực hiện an toàn" và tăng tiêu thụ heap không thể đoán trước? – Viruzzo

+1

Các triển khai JVM điển hình sử dụng bộ đệm phân bổ địa phương luồng (Thread Thread Allocation Buffers - TLABs), trong đó mỗi luồng có một vùng nhỏ riêng để phân bổ nhỏ mà không tốn nhiều chi phí an toàn cho luồng. Điều đó không giải quyết sự sẵn có mặc dù. RTSJ có một số công cụ liên quan đến chủ đề và đống, nhưng đó là về độ trễ. –

Trả lời

2

Không. Không có khái niệm về điều này trong Java. Có một 'đống' mà new phân bổ. Phân bổ Java là an toàn luồng. Và tại sao bạn nghĩ rằng tạo ra nhiều heap hơn sẽ khiến cho các luồng tiêu thụ ít bộ nhớ hơn?

Nếu bạn muốn kiểm soát mức sử dụng bộ nhớ trong một chuỗi, không phân bổ mọi thứ. Bạn có thể, theo lý thuyết, tạo ra các hồ chứa các vật thể tái sử dụng cho một mục đích như thế này, nhưng hiệu suất gần như chắc chắn sẽ tồi tệ hơn so với sự thay thế rõ ràng.

3

Kiểm tra Java nonblocking memory allocation - chủ đề thường phân bổ bộ nhớ từ các khối phân bổ của riêng chúng. Vì vậy, nếu tốc độ là mối quan tâm, Sun đã làm điều đó cho bạn.

Vì giới hạn mức sử dụng bộ nhớ cho mỗi luồng, trong Java, ngôn ngữ không thể thực hiện được. Cho dù có thể (hoặc có ý nghĩa) trong JVM và Java nền tảng là một câu hỏi thú vị. Tất nhiên, bạn có thể làm điều đó the same way as any memory profiler does, nhưng tôi sợ hệ thống quản lý sẽ nhanh chóng phát triển ứng dụng khá sớm.

2

Chủ đề theo thiết kế chia sẻ toàn bộ vùng nhớ và các vùng khác của bộ nhớ. Chỉ ngăn xếp thực sự là luồng cục bộ và không gian này có thể bị hạn chế.

Nếu bạn có các tác vụ bạn muốn chạy trong bộ nhớ của riêng mình và/hoặc có thể dừng lại, bạn phải chạy chúng như một quá trình riêng biệt.