2010-07-05 33 views
43

tôi nhận được ngoại lệ này thường xuyên khi chạy ứng dụng của tôi trên tomcat sử dụng eclipse:java.lang.OutOfMemoryError: không gian PermGen trong tomcat với nhật thực

java.lang.OutOfMemoryError: PermGen space 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1850) 
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:890) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1354) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233) 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1850) 
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:890) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1354) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:265) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:134) 
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101) 
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80) 
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94) 
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156) 
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135) 
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1650) 
    at com.spacerdv.dao.impl.UserDaoImpl.getUserDetails(UserDaoImpl.java:170) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
+0

có thể trùng lặp của [Cách xử lý "lỗi java.lang.OutOfMemoryError: PermGen space"] (http://stackoverflow.com/questions/88235/how-to-deal-with-java -lang-outofmemoryerror-permgen-space-error) – Lucero

Trả lời

93

cố gắng để tăng không gian perm, thêm các thông số sau đây để vm khởi động

-XX: PermSize = 256M -XX: MaxPermSize = 256M

cũng thêm -XX: MaxPermSize = 256M để Tomcat trong Eclipse: Server > Open Launch Configuration > Arguments

Cập nhật (vào năm 2014): hãy xem here at this question and answer về the new Java 8 Metaspace.

và hãy xem ở đây:

How to deal with “java.lang.OutOfMemoryError: PermGen space” error

+0

Trên Netbeans, các tham số này có thể được thêm vào: Dịch vụ> Máy chủ> Apache Tomcat (nhấp chuột phải)> Thuộc tính> Nền tảng> Tùy chọn VM – DragonT

+0

cũng có thể bạn muốn thêm '-server -Xmx1024m' – QuakeCore

+1

Giải pháp này chỉ trì hoãn sự cố. Tomcat của tôi thường chạy ở MaxPermSize = 512m và vẫn loại bỏ PermSize. Nó xảy ra khi mã thay đổi được tự động thực hiện quá thường xuyên. Cách giải quyết của tôi là khởi động lại tomcat một cách rõ ràng mỗi lần trong một thời gian. – Hok

5

Tôi có vấn đề này ngày hôm nay là tốt. Nó đã xảy ra hoàn toàn từ màu xanh. Hôm qua tôi đã cập nhật JDK/JRE từ 1.6.0_13 lên 1.6.0_21 để khắc phục sự cố cụ thể Glassfish 3.0.1 và Eclipse đột nhiên phá vỡ các lỗi OutOfMemoryError: PermGen space này. Sau khi (không chính xác) ranting trên plugin Glassfish và kết luận rằng vấn đề không cố định sau khi làm sạch siêu dữ liệu không gian làm việc, nó chỉ ra rằng sự thay đổi của chuỗi nhà cung cấp JVM từ "Sun" sang "Oracle" kể từ 1.6.0_20 . Eclipse không nhận ra nhà cung cấp JVM mới và do đó không áp dụng các đối số VM như được chỉ định trong eclipse.ini.

Điều này đã được báo cáo là vấn đề Eclipse 319514 và các chàng trai Eclipse nhanh chóng phát hành patch. Cho đến khi họ nhận được nó cố định vĩnh viễn hơn, thực hiện giải pháp thực sự là để thêm các dòng sau vào eclipse.ini:

 
-XX:MaxPermSize=256m 

Vì vậy, nếu bạn gần đây đã làm một bản cập nhật JVM, nó có thể là giá trị để có một cái nhìn vào nó.

20

Bạn có thể cấu hình các tham số cho Eclipse:

"Để giải quyết này tôi dừng lại máy chủ trong Eclipse đúp nhấp vào máy chủ trong Servers tab để mở trang Tổng quan cho máy chủ Clicked trên .. . mở Launch Cấu hình và sau đó trên Arguments tab

tôi đã thêm các đối số VM sau:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

ref to http://malcolmmallia.com/malcblog/?p=60

+0

Cảm ơn bạn! Nhóm của chúng tôi đã có một số vấn đề về QA và máy chủ sản xuất của chúng tôi sau khi thay đổi ngăn xếp dịch vụ web và hai tùy chọn này đã khắc phục các vấn đề về PermGen của chúng tôi.(Ít nhất cho tới hiện tại.) –

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