问题
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