java.lang.OutOfMemoryError: PermGen space error occurs when MongoTemplate.save(Object objectToSave) in Spring Data MongoDB

只谈情不闲聊 提交于 2019-12-24 03:00:37

问题


        Recently in J2EE project, We change spring-data-mongodb's version from 1.7.1.RELEASE to 1.10.12.RELEASE because of safe problems, when invoke MongoTemplate.save(Object objectToSave) method, java.lang.OutOfMemoryError: PermGen space error occurs after about one day after tomcat7 started, but never occurs before spring-data-mongodb's version changed.         We try to increase max perm size, but no usefull. We use YourKit tools to investigate jvm classes, then found many classes created with format like 'LogRecord_Accessor_'.After read spring-data-commons-1.13.12.RELEASE code source,the cause is org.springframework.data.mapping.context.AbstractMappingContext, the related code is:

private final PersistentPropertyAccessorFactory persistentPropertyAccessorFactory = new ClassGeneratingPropertyAccessorFactory();

        the class ClassGeneratingPropertyAccessorFactory's method getPropertyAccessor(PersistentEntity entity, Object bean) will create many dynamic classes like 'Accessor'.We use POJO classes to save to mongodb, the code is:

@Document(collection = "AuditLog") 
public class LogRecord {
    long EVENT_ID;
    String TIMESTAMP;
    String SUBJECT;
    String VERB;
    String OBJECT;
    String ORG_APP_NAME;
    String ORG_APP_IP_ADDRESS;
    String CLI_APP_NAME;
    String CLI_APP_IP_ADDRESS;
    Map<String,String> PREDICATE_MAP;
    public Map<String, String> getPREDICATE_MAP() {
        return PREDICATE_MAP;
    }
    public void setPREDICATE_MAP(Map<String, String> pREDICATE_MAP) {
        PREDICATE_MAP = pREDICATE_MAP;
    }
    public long getEVENT_ID() {
        return EVENT_ID;
    }
    public void setEVENT_ID(long eVENT_ID) {
        EVENT_ID = eVENT_ID;
    }
    public String getTIMESTAMP() {
        return TIMESTAMP;
    }
    public void setTIMESTAMP(String tIMESTAMP) {
        TIMESTAMP = tIMESTAMP;
    }
    public String getSUBJECT() {
        return SUBJECT;
    }
    public void setSUBJECT(String sUBJECT) {
        SUBJECT = sUBJECT;
    }
    public String getVERB() {
        return VERB;
    }
    public void setVERB(String vERB) {
        VERB = vERB;
    }
    public String getOBJECT() {
        return OBJECT;
    }
    public void setOBJECT(String oBJECT) {
        OBJECT = oBJECT;
    }
    public String getORG_APP_NAME() {
        return ORG_APP_NAME;
    }
    public void setORG_APP_NAME(String oRG_APP_NAME) {
        ORG_APP_NAME = oRG_APP_NAME;
    }
    public String getORG_APP_IP_ADDRESS() {
        return ORG_APP_IP_ADDRESS;
    }
    public void setORG_APP_IP_ADDRESS(String oRG_APP_IP_ADDRESS) {
        ORG_APP_IP_ADDRESS = oRG_APP_IP_ADDRESS;
    }
    public String getCLI_APP_NAME() {
        return CLI_APP_NAME;
    }
    public void setCLI_APP_NAME(String cLI_APP_NAME) {
        CLI_APP_NAME = cLI_APP_NAME;
    }
    public String getCLI_APP_IP_ADDRESS() {
        return CLI_APP_IP_ADDRESS;
    }
    public void setCLI_APP_IP_ADDRESS(String cLI_APP_IP_ADDRESS) {
        CLI_APP_IP_ADDRESS = cLI_APP_IP_ADDRESS;
    }
    @Override
    public String toString() {
        return "LogDoc [EVENT_ID=" + EVENT_ID + ", TIMESTAMP=" + TIMESTAMP
                + ", SUBJECT=" + SUBJECT + ", VERB=" + VERB + ", OBJECT="
                + OBJECT + ", ORG_APP_NAME=" + ORG_APP_NAME
                + ", ORG_APP_IP_ADDRESS=" + ORG_APP_IP_ADDRESS
                + ", CLI_APP_NAME=" + CLI_APP_NAME + ", CLI_APP_IP_ADDRESS="
                + CLI_APP_IP_ADDRESS + "]";
    }
}

        Is this bugs of spring-data-mongodb, or we use MongoTemplate.save is not correct, please help me. Thanks

来源:https://stackoverflow.com/questions/50424066/java-lang-outofmemoryerror-permgen-space-error-occurs-when-mongotemplate-saveo

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!