2012-04-10 8 views
25

BỐI CẢNH: Tôi có một Dự án web sử dụng JSP. IDE là Eclipse. Cấu hình của tomcat là: Tự động xuất bản khi thay đổi tài nguyên và khoảng thời gian xuất bản là "1 giây".phải làm gì với không gian tomcat PermGen

Tệp thuộc tính trong thư mục lớp dùng để lưu một số cài đặt. Nó cũng có thể được servlet sửa đổi động. Các hoạt động sửa đổi được trigerred bởi nút lưu trong JSP.

VẤN ĐỀ: Sau một vài thao tác lưu, Tomcat đi kèm với java.lang.OutOfMemoryError: PermGen space.

LOG ĐIỆP

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:1815) 
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204) 
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:108) 
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:58) 
    at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:297) 
    at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1064) 
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120) 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4238) 
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3083) 
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:404) 
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1279) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1571) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1560) 
    at java.lang.Thread.run(Thread.java:662) 
+0

tiềm năng trùng lặp. http://stackoverflow.com/questions/88235/how-to-deal-with-java-lang-outofmemoryerror-permgen-space-error – Phani

+3

Tôi gặp lỗi này với Tomcat bất cứ khi nào mọi người redeploy một ứng dụng web nhiều lần, mà không cần khởi động lại Tomcat . Vì một rò rỉ liên quan đến quá trình nạp lớp, không gian permgen sẽ đầy đủ hơn một chút với mỗi lần triển khai lại. Tăng kích thước permgen sẽ trì hoãn điểm mà tại đó nó hết bộ nhớ, nhưng thực sự, bạn cần đảm bảo Tomcat bị trả lại khi bạn triển khai lại một ứng dụng web. – Jon

+2

Vui lòng xem qua bài viết dưới đây giải thích đầy đủ về cấu hình tomcat để tăng permGen [Tomcat PermGen Space] (http://www.mkyong.com/tomcat/tomcat-javalangoutofmemoryerror-permgen-space/) – Phani

Trả lời

11

Bạn có thể thiết lập biến môi trường có tên là: "JAVA_OPTS" và thiết lập giá trị của nó như sau -Xms256m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m

+0

trong khi làm như vậy plz không bỏ lỡ "-" biểu tượng .. –

+0

Dường như để tránh vấn đề, nhưng không phải là một giải pháp tốt. Tôi nghi ngờ rằng tiết kiệm dữ liệu thường xuyên trong tập tin tài sản là một thiết kế sai, nếu nó xấu, những gì nó nên được – SKing7

+2

It's-Xms256m-Xmx1024m thực sự. Xms là kích thước bắt đầu và Xmx là kích thước heap tối đa. –

34

Tomcat không cần rất nhiều PermGen. 512m không phải là giá thầu tối đa không hợp lý. Tuy nhiên nó chỉ làm chậm rò rỉ triển khai nóng. Permgen sẽ phát triển ~ 25mb cho mỗi hotdeploy, trong đó, trong Eclipse, có thể là mỗi khi bạn lưu một tệp Java. 512m biến mất nhanh nếu bạn co giật Ctrl + S như tôi.

Giải pháp: cho phép Java khởi động các định nghĩa lớp ra khỏi bộ nhớ, nghĩa là, thu thập rác mã byte. Thêm những cùng với thúc đẩy bạn PermGen kích thước:

-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC 
+0

@dldnh bạn có thể đề cập đến dòng đầy đủ cần được thêm vào tệp setenv.sh không –

5

thiết lập như thế này:

-Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m 

enter image description here

0

Tomcat máy chủ chạy JAVA khác nhau và nhật thực chạy trong JAVA khác nhau.

Vì vậy, việc thêm -XX:MaxPermSize=512m vào eclipse.ini sẽ giúp giải quyết vấn đề này. Thực hiện theo các bước dưới đây để thêm video này vào tomcat server:

  • máy chủ Kích đúp trong eclipse

  • mở ra mắt cấu hình

  • add "-XX: MaxPermSize = 512M" để lập luận VM trong Tab đối số.

6

cho Eclipse

  1. Tới đặc tính máy chủ
  2. Đến nền tảng
  3. Bây giờ trong lập luận VM viết này -Xms256m -Xmx256m -XX: PermSize = 256M -XX: MaxPermSize = 512m

CHO N ETBEANS

  1. Đến Netbeans thư mục/etc/
  2. mở netbeans.config trong bất kỳ trình soạn
  3. chỉnh sửa dòng này như

netbeans_default_options = "- J-client -J-Xss256m -J-Xms256m -J-XX: PermSize = 256m -XX: MaxPermSize = 512m -J-Dapple.laf.useScreenMenuBar = true -J-Dapple.awt.graphics.UseQuartz = true -J-Dsun.java2d.noddraw = true -J-Dsun.java2d.dpiaware = true -J-Dsun.zip.disableMemoryMapping = true "

Thats tất cả

0

Chỉ cần thêm cho Windows, nếu ai đó vẫn còn bị mắc kẹt: -

  1. mở tập tin catalina.bat (nằm ở Apache tomcat thư mục cài đặt/bin)
  2. Set JAVA_OPTS như sau ngay từ đầu (trước khi thực sự được sử dụng đầu tiên ở bất kỳ đâu trong tệp): -

    đặt JAVA_OPTS = -Dfile.encoding = UTF-8 -Xms128m -Xmx1024m -XX: PermSize = 64m -XX: MaxPermSize = 256m

  3. Khởi động lại Tomcat và thực hiện nó.

Bạn có thể tìm thấy lời giải thích đẹp here