Java không thể dự trữ đủ dung lượng cho heap đối tượng mặc dù có đủ RAM


8

Tôi hiện đang gặp một số vấn đề khi chạy Java. Nó sẽ không bắt đầu vì vấn đề heap. Nhưng tôi có hơn 9 GB Ram miễn phí (hoặc thậm chí 16 GB nếu bạn cho rằng bộ đệm sẽ trống). Đây là lỗi tôi nhận được (và freelệnh)

root@server: ~ # java
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

root@server: ~ # free
             total       used       free     shared    buffers     cached
Mem:      25165824   15941148    9224676          0          0    7082176
-/+ buffers/cache:    8858972   16306852
Swap:            0          0          0

Tôi đang chạy Debian 64 bit trên máy chủ ảo hóa. Phần mềm ảo hóa là OpenVZ. Đây là phiên bản Java của tôi (tôi có thể thực thi lệnh này sau khi tôi dừng hai máy ảo của mình (4 hiện đang chạy)) :

root@server: ~ # java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

Tôi có thể làm gì?


Như yêu cầu:

root@server: ~ # cat /proc/meminfo
MemTotal:       25165824 kB
MemFree:        11723412 kB
Cached:          4597552 kB
Active:          9692308 kB
Inactive:        3322544 kB
Active(anon):    7411960 kB
Inactive(anon):  1005340 kB
Active(file):    2280348 kB
Inactive(file):  2317204 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:               960 kB
Writeback:             0 kB
AnonPages:       8417300 kB
Shmem:             21504 kB
Slab:             427452 kB
SReclaimable:     383424 kB
SUnreclaim:        44028 kB

Reg2est2:

root@server: ~ # cat /proc/user_beancounters
Version: 2.5
       uid  resource                     held              maxheld              barrier                limit              failcnt
 10023468:  kmemsize                399250512            506245120           5053325720           5558658292                    0
            lockedpages                     0                    8               246744               246744                    0
            privvmpages               6005602              6291447              6291456              6291456                  221
            shmpages                     8576                 8608               579124         579124289562                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            numproc                       598                 1236                30000                30000                    0
            physpages                 4634494              6291456              6291456              6291456                    0
            vmguarpages                     0                    0              6291456  9223372036854775807                    0
            oomguarpages              1529371              2144671              6291456  9223372036854775807                    0
            numtcpsock                     62                  164                30000                30000                    0
            numflock                       25                   39                 1000                 1100                    0
            numpty                         13                   24                  512                  512                    0
            numsiginfo                     10                   75                 1024                 1024                    0
            tcpsndbuf                 3330352              4153232           1179110194           1684441906                    0
            tcprcvbuf                 1216896             34410032           1179110194           1684441906                    0
            othersockbuf               270504               537552            589555096           1094886808                    0
            dgramrcvbuf                     0                67048            589555096            589555096                    0
            numothersock                  287                  333                30000                30000                    0
            dcachesize              355559855            446054103           1103879952           1136996352                    0
            numfile                      4766                 7745               250000               250000                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            numiptent                      14                   14                 1000                 1000                    0

root@server: ~ # java
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

root@server: ~ # cat /proc/user_beancounters
Version: 2.5
       uid  resource                     held              maxheld              barrier                limit              failcnt
 10023468:  kmemsize                399246622            506245120           5053325720           5558658292                    0
            lockedpages                     0                    8               246744               246744                    0
            privvmpages               6005601              6291447              6291456              6291456                  233
            shmpages                     8576                 8608               579124         579124289562                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            numproc                       598                 1236                30000                30000                    0
            physpages                 4635460              6291456              6291456              6291456                    0
            vmguarpages                     0                    0              6291456  9223372036854775807                    0
            oomguarpages              1529376              2144671              6291456  9223372036854775807                    0
            numtcpsock                     64                  164                30000                30000                    0
            numflock                       25                   39                 1000                 1100                    0
            numpty                         13                   24                  512                  512                    0
            numsiginfo                     10                   75                 1024                 1024                    0
            tcpsndbuf                 3365232              4153232           1179110194           1684441906                    0
            tcprcvbuf                 1249664             34410032           1179110194           1684441906                    0
            othersockbuf               270504               537552            589555096           1094886808                    0
            dgramrcvbuf                     0                67048            589555096            589555096                    0
            numothersock                  287                  333                30000                30000                    0
            dcachesize              355559855            446054103           1103879952           1136996352                    0
            numfile                      4768                 7745               250000               250000                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            numiptent                      14                   14                 1000                 1000                    0

Bạn có thểcat /proc/meminfo
Matt

@mindthemonkey Đăng bài chỉnh sửa. Dường như với tôi có đủ không gian cho kích thước mặc định.
BrainStone

Chắc chắn là như vậy =) Bạn đang cố chạy tiến trình java trong container, phải không? Tôi giả sử bạn có thể chạy quá trình java trong máy chủ thành công? Bao nhiêu bộ nhớ được phân bổ cho mỗi container vzmemcheck -vA? Bạn có thể cat /proc/user-beancountertrước và sau khi lỗi.
Matt

@mindthemonkey Tôi không có bất cứ thứ gì bên ngoài container ...
BrainStone

ok .. cat /proc/user-beancounterđược thực hiện trong container của bạn.
Matt

Câu trả lời:


10

OpenVZ & Bộ nhớ

Việc failcntnày đang diễn ra privvmpages, do đó, container của bạn không thể phân bổ thêm dung lượng bộ nhớ ảo từ máy chủ:

root@server: ~ # cat /proc/user_beancounters
Version: 2.5
       uid  resource                     held              maxheld              barrier                limit              failcnt
            privvmpages               6005601              6291447              6291456              6291456                 >233<
            physpages                 4635460              6291456              6291456              6291456                    0
            vmguarpages                     0                    0              6291456  9223372036854775807                    0
            oomguarpages              1529376              2144671              6291456  9223372036854775807                    0

Lưu ý rằng bộ nhớ ảo ! = Bộ nhớ vật lý. Các quy trình có thể phân bổ tối đa ở đâu đó xung quanh dung lượng bộ nhớ ảo có thể đánh địa chỉ (32bit ~ 2G - 4G, 64bit 8 TB - 256 TB) nhưng điều đó không có nghĩa là các trang bộ nhớ vật lý đang được sử dụng (một trang là bộ nhớ 4KB).

physpageslà số lượng trang bộ nhớ vật lý mà container của bạn có thể sử dụng.
oomguarpageslà các trang bộ nhớ được bảo đảm mà bộ chứa sẽ nhận được khi máy chủ bị hạn chế bộ nhớ.
privvmpageslà số lượng trang bộ nhớ ảo mà bộ chứa của bạn có thể sử dụng
vmguarpageslà số lượng bộ nhớ ảo được bảo đảm theo cùng một cách

Java

Oracle Java sẽ luôn luôn phân bổ một đoạn liền kề của bộ nhớ ảo. Chạy javakhông có đối số trên hộp dẫn đến 5M bộ nhớ thực được sử dụng ( RSS), nhưng 660M không gian VM được phân bổ ( VSZ):

  PID COMMAND                        VSZ   RSS
20816 java                        667496  4912 

Nhìn vào các phân đoạn bộ nhớ cho javaquá trình trong smapstệp của nó cho thấy một đoạn khoảng 500 MB được phân bổ, phần còn lại là các tệp được ánh xạ bộ nhớ và các công cụ java bình thường.

Trên một hệ thống đã được sử dụng trong một thời gian, không gian VM có sẵn sẽ bị phân mảnh khi các quá trình sử dụng / các phần miễn phí của nó. A grep Vmalloc /proc/meminfosẽ cung cấp cho bạn VmallocChunkđó là chunk miễn phí lớn nhất hiện có. Nếu mức này thấp, hệ thống sẽ thử và phân bổ nhiều hơn khi javayêu cầu, sau tất cả, nó hầu như không giới hạn trên hộp 64 bit.

Sửa chữa

Nói với máy chủ của bạn để cấu hình privvmpagesvmguarpagescao hơn nhiều. Không cần chúng giống như bộ nhớ vật lý vì nó ảnh hưởng đến cách thức hoạt động của bộ nhớ linux

Bạn có thể tạm thời khắc phục sự cố bằng cách bỏ bộ đệm tệp của mình echo 1 > /proc/sys/vm/drop_cachesnhưng đó chỉ là tạm thời.

Bạn có thể giới hạn khối bộ nhớ javacố gắng phân bổ trong thời gian chạy với mức tối thiểu Xmshoặc trong khi chạy với mức tối đa Xmx. Chạy javavới các tùy chọn này trên máy của tôi:

java -Xms10M -Xmx10M

giảm tổng kích thước ảo xuống còn 140 MB hoặc chỉ với một đoạn liền kề 10 MB cho heap java được phân bổ.


Cảm ơn bạn vì câu trả lời. Tôi chắc chắn 100% rằng con lợn của tôi sẽ không thay đổi bất cứ điều gì về container. Tôi cũng không thể bỏ bộ nhớ cache vì bộ chứa của tôi nằm trên OpenVZ. (Ngoài grep Vmalloc /proc/meminfora không có đầu ra) Chạy java -Xms10M -Xmx10Mhoạt động mặc dù. Nhưng điều này không thực sự giải quyết tất cả các vấn đề. Giống như bắt đầu các chương trình bổ sung với việc sử dụng RAM của một thứ gì đó khoảng 2GB ...
BrainStone

Tại sao bạn sử dụng chúng nếu bạn không nghĩ rằng bộ phận hỗ trợ của họ sẽ không giúp bạn giải quyết vấn đề cấu hình? Có thể trang web các ví dụ cấu hình và bảng ? Nó không tốn bất cứ thứ gì để phân bổ thêm các trang bộ nhớ không sử dụng được.
Matt

Tôi sử dụng chúng vì chất lượng là đủ và giá thấp. Thứ hai là có cách nào để nói với Java rằng nó không nên sử dụng các khối bộ nhớ liên tục?
BrainStone

@BrainStone Bạn đang chạy JVM 64 bit. Giới hạn phân mảnh chỉ nên ảnh hưởng đến các ứng dụng 32 bit trên HĐH 32 bit.
jlliagre

@jlliagre openvz đang đặt giới hạn nhân tạo trên không gian VM.
Matt

7

Trong trường hợp của chúng tôi, nó đã giúp hạn chế kích thước heap mà VM cố gắng dự trữ khi khởi động.

Ví dụ trên dòng lệnh:

xuất _JAVA_OPTIONS = '- Xms64M -Xmx128m'

hoặc cho Tomcat trong [TOMCAT_HOME] /bin/setenv.sh

#! / thùng / sh

JAVA_OPTS = "- Xms64M -Xmx256M"

(Lưu ý phần gạch dưới hàng đầu bổ sung trên dòng lệnh.)

Giải thích của nhà cung cấp của chúng tôi là:

  • máy ảo java tính toán kích thước heap ban đầu khi khởi động
  • tính toán này dựa trên RAM có sẵn.
  • một số cài đặt java trên máy chủ riêng ảo (VPS) không thể phản ánh các ràng buộc bộ nhớ của VPS khi tính kích thước heap ban đầu. Thay vào đó, họ dựa trên tính toán kích thước bộ nhớ của hệ thống lưu trữ. Điều này có thể dẫn đến một lượng bộ nhớ trống không có sẵn trên VPS.
  • khi cung cấp kích thước heap ban đầu thông qua JAVA_OPTS, VM sử dụng các giá trị này và không cố gắng tự tính toán.

Điều này đã khắc phục vấn đề của tôi. Tôi đã không ở trên một máy chủ ảo, thay vì phần cứng với 80G RAM. Máy chủ còn mới và chưa được sử dụng, vì vậy tất cả bộ nhớ đó đều khả dụng. Giới hạn bộ nhớ hệ thống mặc định là 16GB khiến tôi không thể khởi động JVM. Ngay cả khi là root. Sửa đổi /etc/security/limits.conf đã khắc phục sự cố. BẠC6.6.
Dan Pritts 16/1/2015

3

Có lẽ bạn cần thay đổi kích thước heap java mặc định, hãy thử các đối số sau:

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

ví dụ:

java -Xms64m -Xmx1512m

Chủ đề này có thể hữu ích

Đồng thời kiểm tra ulimit (ulimit cung cấp quyền kiểm soát các tài nguyên có sẵn cho shell và các quy trình được bắt đầu bởi nó):

ulimit -a 

Tôi đã sử dụng các đối số kích thước heap (khi bắt đầu ứng dụng). Và tôi ulimit -acó vẻ bình thường. Hầu hết các giá trị bao gồm virtual memorykhông giới hạn. Những cái có vẻ hơi thấp tôi đã nhân đôi ( -stừ 8192 lên 16384 và -ltừ 64 lên 128) để thử nghiệm nhưng điều đó cũng không giúp được gì.
BrainStone

Và những gì về kích thước không gian địa chỉ cho quá trình (-A)? Một điều nữa, có vẻ như bạn không có bất kỳ không gian hoán đổi nào cả. Điều đó thực sự không tốt vì trao đổi cũng thêm vào kích thước bộ nhớ ảo của bạn. Java sẽ cố gắng phân bổ bộ nhớ trong một khối lớn, vì vậy HĐH có thể cố gắng phân bổ lại một số bộ nhớ không sử dụng để trao đổi. Vui lòng thử thêm 32GB trao đổi.
b13n1u

Không có -Alựa chọn cho tôi. Và tôi không được phép thêm Hoán đổi.
BrainStone

2

Bạn có thể hết bộ nhớ ảo.

Bạn đang tập trung vào việc sử dụng RAM (hoặc thiếu) nhưng các JVM hiện tại của bạn đang dự trữ bộ nhớ ảo, không phải RAM. Miễn là các trang bộ nhớ dành riêng không được truy cập, không có báo cáo sử dụng RAM cho chúng.

Mặc dù Linux thường che giấu vấn đề này bằng các cài đặt cam kết quá mức của nó, nhưng có khả năng là bạn đang chạy trong môi trường ảo hóa ở cấp độ hệ điều hành hoặc giảm / vô hiệu hóa cam kết hoặc đặt giới hạn kiểm soát tài nguyên bộ nhớ ảo.

Trong một phiên bản HĐH thông thường (không phải là bộ chứa), cách dễ nhất để khắc phục điều này là thêm một số trao đổi sẽ cho phép bộ nhớ dành riêng không lãng phí RAM. Trên một container, cách khắc phục vấn đề cũng có thể yêu cầu tăng bộ nhớ ảo khả dụng trên toàn cầu nhưng nhìn chung chỉ đơn giản là được thực hiện bằng cách cấp thêm bộ nhớ ảo cho container.

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.