2015-06-23 14 views
7

Java 8 sử dụng metaspace có khả năng mở rộng động. GC sẽ chạy trên metaspace khi nó đầy. Điều đó có nghĩa là GC sẽ không bao giờ chạy trên metaspace?java 8 tìm ra kích thước của metaspace tại thời gian chạy

Ứng dụng Java 8 của tôi đang sử dụng rất nhiều bộ nhớ. Tôi muốn biết kích thước của metaspace của tôi ở thời gian chạy là bao nhiêu. Làm thế nào để làm điều đó?

Tôi đang nghĩ đến việc thiết lập maxMetaSpace. Tôi nên đặt nó thành gì? Bất kỳ đề xuất?

Trả lời

3
for (MemoryPoolMXBean memoryMXBean : ManagementFactory.getMemoryPoolMXBeans()) { 
      if ("Metaspace".equals(memoryMXBean.getName())) 
      { 
       System.out.println(memoryMXBean.getUsage().getUsed()/1024/1024 + " mb"); 
      } 

} 

Có nó là tốt hơn để thiết lập maxMetaspace nếu bạn nghĩ rằng đó là bị rò rỉ để theo dõi và sửa chữa nó

6

Lựa chọn 1:

Execute

jstat -gc PID 

(với PID thay thế bởi PID của JVM để giám sát) sẽ trở lại sth. như:

S0C  S1C  S0U S1U  EC  EU  OC   OU  MC  MU  CCSC CCSU  YGC YGCT  FGC FGCT GCT 
103936.0 107008.0 0.0 41618.3 820736.0 401794.3 444928.0 183545.7 181888.0 137262.8 28544.0 20386.6 313 16.024 8  3.706 19.729 

Theo this quan tâm là:

MC: Metaspace capacity (kB) 
MU: Metaspace utilization (kB) 

Vì vậy, trong trường hợp này khoảng 181mb của Metaspace tôi cam kết khi 137mb hiện đang được sử dụng.

Phương án 2:

Nếu bạn có các bản ghi thu gom rác thải cho phép bạn cũng có thể tìm thấy điều này từ đó, ví dụ sau khi ứng dụng gặp sự cố hoặc đã xảy ra sự cố. Tìm kiếm các dòng như

2016-04-06T01:50:04.842+0200: 7.795: [Full GC (Metadata GC Threshold) 
[PSYoungGen: 7139K->0K(177152K)] 
[ParOldGen: 18396K->22213K(101888K)] 25535K->22213K(279040K), 
[Metaspace: 34904K->34904K(1081344K)], 0.1408610 secs] 
[Times: user=0.45 sys=0.00, real=0.14 secs] 

Điều này tạo nên sự thay đổi kích thước của Metaspace như ngưỡng trước đó.

[Metaspace: 34904K->34904K(1081344K)], 0.1408610 secs] 

chứa thông tin liên quan: 34,9mb đã được sử dụng trước cũng như sau GC. Các mục nhập nhật ký mới nhất mà bạn có thể tìm thấy sẽ hiển thị kích thước hiện tại (nghĩa là: sau GC).

Hãy nhớ rằng toàn bộ GC được chạy bất cứ khi nào Metaspace được thay đổi kích thước. Vì vậy, nó là một ý tưởng tốt để cấu hình một giá trị bắt đầu tốt cho điều này khi bạn đã biết rằng giá trị mặc định của ~ 21mb (tùy thuộc vào cấu hình máy chủ) là không đủ.

Xem this để biết thêm thông tin về cách điều chỉnh kích thước Metaspace.

+1

'người đàn ông jstat' đưa ra cách giải thích đúng đắn về "MC : Metaspace capacity (kB) "và" MU: Metacspace use (kB) ", không phải là" commit "và" used ". – moxn

1

Sử dụng jcmd. Đó là công cụ oracle tích hợp tốt nhất để tìm kiếm thứ này trong Java 8. Từ terminal ...

LƯU Ý: bạn cần chạy jcmd như bất kỳ người dùng nào bắt đầu quá trình java. Nếu bạn đang gỡ lỗi một máy chủ web như Jetty, bạn có thể cần phải thay đổi người dùng bằng một cái gì đó như sudo su jetty.

  1. Run jcmd
  2. Lấy PID hiển thị cho ứng dụng của bạn và chạy jcmd <pid> VM.native_memory enter image description here này có
  3. Để biết thêm tùy chọn chạy jcmd <pid> help
Các vấn đề liên quan