2009-01-23 29 views
19

Tôi tiếp tục gặp lỗi "PermGen" trên máy chủ Tomcat 6 của mình.Định kỳ "PermGen" trong Tomcat 6

Tôi biết ứng dụng nào đang gây ra sự cố, nhưng tôi không chắc chắn tại sao ứng dụng lại làm như vậy. Ứng dụng đang sử dụng MySQL 5 và chạy trên JDK 6.

Có bất kỳ công cụ/đề xuất nào để chẩn đoán hoặc phân tích (các) vấn đề tiềm ẩn với ứng dụng cụ thể không?

Cảm ơn

+0

là vấn đề này có gì khác biệt so với một [mô tả ở đây] (http://stackoverflow.com/questions/1124131/what-can-be-done -với-permgen-out-of-không gian-exception-in-tomcat-spring-hibernate)? –

+0

Tôi khuyên bạn nên đọc [bài viết này] (http: // plumbr.eu/blog/what-is-a-permgen-leak) (được viết bởi tôi), để hiểu rõ hơn tại sao những lỗi này có thể xảy ra. Và nó cũng chứa một số gợi ý để giải quyết chúng. – Nikem

Trả lời

25

PermGen được sử dụng để lưu trữ định nghĩa lớp và nhóm chuỗi bên trong. Mã của bạn có thể được điền vào nó (nếu nó gọi intern internlessly), nhưng nhiều khả năng là mặc định là underersized cho ứng dụng của bạn.

Điều này là do Tomcat sẽ nạp các lớp mới mỗi khi bạn triển khai một WAR - hoặc, nếu bạn đang làm việc trong môi trường phát triển, mỗi khi bạn chỉnh sửa một JSP. Những người cuối cùng nên được làm sạch, nhưng trong một môi trường phát triển tích cực, bạn có thể có thời gian mà có cả hai trường hợp cũ và mới được nạp. Hoặc, nếu bạn đang ở trong môi trường sản xuất và có một ứng dụng web lớn, bạn có thể chỉ cần nhiều không gian hơn.

Để thiết lập kích thước PermGen, sử dụng -XX:MaxPermSize=SIZE

Các liên kết dưới đây có thể hữu ích: tuning GC (đây là phiên bản 1.5), GC FAQ (1.4.2 phiên bản), Hotspot VM options (Tôi tin rằng đây là 1.6)

+0

Cảm ơn bạn đã trả lời, tôi sẽ xem xét tất cả các đề xuất của bạn. –

+0

Vì điều này đã xảy ra ngày hôm nay (cảm ơn, với bất kỳ ai upvoted), đây là một liên kết khác về chẩn đoán OOM (được viết bởi tôi): http://www.kdgregory.com/index.php?page=java.outOfMemory – kdgregory

2

Tôi nghĩ bạn có thể có nhiều JSP trong ứng dụng của mình. Có một vấn đề được biết đến trong tomcat nơi khởi động lại một ứng dụng được triển khai với nhiều JSP gây ra các vấn đề PermGen vì tomcat biên dịch lại và tải lại tất cả các lớp này một lần nữa. Tăng kích thước như đã đề cập trong bài trước sẽ giúp ích.

13

Thử tắc JVM sau:

-XX:+UseConcMarkSweepGC 
-XX:+CMSPermGenSweepingEnabled 
-XX:+CMSClassUnloadingEnabled 

upping gian PermGen với -XX:MaxPermSize chỉ trì hoãn vấn đề.

Xin xem nhận xét này: How to deal with “java.lang.OutOfMemoryError: PermGen space” error

Đó gián tiếp chỉ cho tôi hai bài viết này: problem, solution

+2

Nó trì hoãn sự cố nếu bạn duy trì liên kết trình tải lớp ngẫu nhiên. Và, để chắc chắn, có rất nhiều trường hợp điều này có thể xảy ra, và nó có thể là bên cạnh không thể tìm thấy chúng, trừ khi bạn biết thư viện của bạn bên trong và bên ngoài (java.beans.Introspector, ví dụ, duy trì một bộ nhớ cache của lớp dữ liệu). – kdgregory

+2

Tuy nhiên, thường thì vấn đề đơn giản là ứng dụng web quá lớn để sử dụng mặc định. Đặc biệt là trong một môi trường phát triển, nơi bạn có một permm 64Mb, và có thể được triển khai lại liên tục. Cần có thời gian để tất cả các tham chiếu hiện có nằm ngoài phạm vi (ví dụ, một chuỗi gộp được treo vào servlet cuối cùng mà nó chạy). – kdgregory

1

Tôi đã thấy rất nhiều lỗi PermGen khi tomcat được nạp lại sau khi thay đổi mã khi sử dụng hibernate và mùa xuân, tôi nghĩ rằng nó do các trường hợp logger/ehcache không được tắt đúng cách.

2

Tôi đồng ý rằng tăng không gian permgen bằng -XX: MaxPermSize chỉ làm chậm sự cố. Tôi đã thử tăng permgen và sau đó tôi bắt đầu nhận được lỗi tương tự sau khi tôi gửi nhiều yêu cầu đến máy chủ của tôi. Các cờ bổ sung như -XX: + CMSClassUnloadingEnabled được đề xuất mặc dù nó sẽ giảm hiệu suất một chút.

3

thử điều này: trong Linux Máy

export JAVA_OPTS="-XX:PermSize=128m"

Các vấn đề liên quan