Hiểu cách sử dụng RAM trên Linux


1

Tôi hoàn toàn mới với Linux và tôi chỉ đang cố gắng hiểu tất cả RAM của mình sẽ đi đâu. Tôi đã có một bản cài đặt Xubfox khá mới đang chạy với tư cách là khách VMWare và tôi đã cho nó 1,5 GB RAM để chơi.

Sau khi chỉ chạy hai ứng dụng khởi động máy chủ Tomcat và cũng chạy Firefox, tôi hầu như không còn gì. 160MB theo miễn phí -m.

Nhìn vào đầu ra từ Top, tôi thấy Java xuất hiện hai lần, mỗi lần đánh cắp khoảng 1/2 bộ nhớ lưu trú. Cả hai cá thể Tomcat đều sử dụng cùng một jdk, tôi đã nghĩ rằng tôi chỉ thấy Java ở đó một lần.

Câu chuyện là gì?

Cập nhật

Đầu ra -m miễn phí được yêu cầu:

             total     used     free    shared    buffers    cached
Mem:          1419     1380       39         0          8       111
-/+ buffers/cache:     1259      160       
Swap:          509       68      441

Hàng đầu:

    VIRT   RES   SHR   %MEM   COMMAND
   74764   36m  6032    2.6   Xorg
    750m  500m  3436   35.5   java
    881m  408m   10m   28.8   java
    6128  1876  1588    0.1   vmtoolsd
   26156  3408  2672    0.2   vmware-user-load
    409m  104m   15m    7.4   firefox-bin
    2632  1060   776    0.1   top
    3032  1264   812    0.1   init
    All zeroes after here.

Bạn có nghĩa là bạn đã chạy 'free -m', không phải 'mem -f'? Tôi không quen với lệnh 'mem'.
Flimzy

Tôi chỉ thay đổi điều đó - bạn đọc bài viết của tôi quá nhanh :)
jontyc

được rồi, cảm ơn. Bạn có thể hiển thị đầu ra của 'free -m', và có thể là 5 dòng đầu tiên hoặc hơn 'top' không? Không phải là một hình ảnh, chỉ là văn bản.
Flimzy

Câu trả lời:


4

Đây không phải là vấn đề của Linux, đây là sự cố Java (và hành vi hoàn toàn bình thường). Điều tương tự cũng sẽ xảy ra trên Windows, mặc dù tôi đoán nó có thể háo hức hơn trong việc hoán đổi một phần của các quy trình Tomcat đó.

Trước hết, hai phiên bản Tomcat sẽ bắt đầu hai phiên bản JVM theo hai quy trình riêng biệt. Câu hỏi là liệu bạn có thực sự cần hai trường hợp của Tomcat không. Bạn có thể dễ dàng chạy hai ứng dụng web khác nhau trong cùng một ví dụ.

Thứ hai, Java là ngôn ngữ dựa trên bộ sưu tập garbace thích có nhiều bộ nhớ để chơi và có xu hướng sử dụng một tỷ lệ lớn của đống tối đa mà nó được phép sử dụng, bởi vì cách đó nó hoạt động ít hơn trong bộ sưu tập rác. Nó cũng không có xu hướng trả lại bộ nhớ không sử dụng cho HĐH vì nó có thể cần lại nó sớm.

Nếu bạn chắc chắn rằng các ứng dụng web của bạn cần ít hơn một nửa bộ nhớ, bạn có thể bắt đầu Tomcat với một đống tối đa nhỏ hơn bằng cách đặt biến môi trường CATALINA_OPTS thành "-Xmx256m" trong catalina.sh để cung cấp cho nó một đống tối đa 256 MB. Nếu ứng dụng của bạn đôi khi cần nhiều bộ nhớ hơn nhưng bạn muốn ứng dụng thu nhỏ lại nhanh hơn, hãy đặt nó thành "-XX: MaxHeapFreeRatio = 20 -XX: MinHeapFreeRatio = 10" - điều này sẽ trả lại bộ nhớ cho HĐH nếu hơn 20% của heap là miễn phí sau khi thu gom rác và mở rộng heap nếu dưới 10% là miễn phí. Nhưng điều này có thể làm giảm hiệu năng bằng cách khiến Java mất rất nhiều thời gian để phân bổ bộ nhớ khỏi HĐH và giải phóng lại ngay sau đó.


Tôi thấy ... Hoàn toàn vô lý và bây giờ tôi hiểu tại sao môi trường Windows trước đây của tôi dừng lại. Các ứng dụng này (Atlassian) ngoài ra còn được ghi nhận là không hoạt động trong cùng một container. 1/2 Gig RAM cho mỗi ứng dụng và tôi vẫn chưa cài đặt ba ứng dụng khác trong bộ ứng dụng. Điều gì đã xảy ra trong thế giới lập trình?
jontyc

@steboo: hành vi hợp lý khi đối mặt với tài nguyên (bộ nhớ) có sẵn với số lượng lớn. Tuy nhiên, các ứng dụng web không thể chạy trong cùng một container, đó chỉ là kỹ thuật kém.
Michael Borgwardt

Tôi đoán nền tảng nhúng của tôi không thể vượt qua được chất thải.
jontyc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.