- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑1:2014年5月28日
我尝试更改驱动程序(mysql-connector-java-5.1.30-bin 和 ojdbc7)。
在这两种情况下都会发生内存泄漏。例如(使用 Java VisualVM)使用 ojdbc 并查看我看到的最近的 GC:
oracle.djbc.driver.ClockSource$ThreadCachingBlockSource$BlockReleaser 不是从 contextClassLoader 中“免费”的
使用 Mysql 我有同样的问题(使用 sql 驱动程序)
原始帖子:只需配置 spring 和 jpa,重新启动应用程序 3/4 次后,我就会出现 PermGen 内存不足的情况。使用 Java VisualVM,我发现每次重新启动时我都会多一个类加载器(一开始我有 4 个类加载器,重新启动后我有 5 个类加载器,依此类推)。在我的 WEB-INB 中我有任何库。我设置的唯一类是这个(任何jsp和任何我执行逻辑的类,仅设置spring + jpa)。
我使用 Tomcat8 + Java 7 SDK:
引导配置
@SuppressWarnings("unused")
@Order(1)
public class FrameworkBootstrap implements WebApplicationInitializer
{
@Override
public void onStartup(ServletContext container)
throws ServletException
{
container.getServletRegistration("default").addMapping("/resource/*");
AnnotationConfigWebApplicationContext rootContext =
new AnnotationConfigWebApplicationContext();
rootContext.register(RootContextConfiguration.class);
container.addListener(new ContextLoaderListener(rootContext));
AnnotationConfigWebApplicationContext webContext =
new AnnotationConfigWebApplicationContext();
webContext.register(WebServletContextConfiguration.class);
ServletRegistration.Dynamic dispatcher = container.addServlet(
"springWebDispatcher", new DispatcherServlet(webContext)
);
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
Servlet 配置
@Configuration
@EnableWebMvc
@ComponentScan(
basePackages = "it.dirimo.site",
useDefaultFilters = false,
includeFilters = @ComponentScan.Filter(WebController.class)
)
public class WebServletContextConfiguration extends WebMvcConfigurerAdapter
{
@Inject ApplicationContext applicationContext;
@Inject ObjectMapper objectMapper;
@Inject Marshaller marshaller;
@Inject Unmarshaller unmarshaller;
@Inject SpringValidatorAdapter validator;
@Override
public void configureMessageConverters(
List<HttpMessageConverter<?>> converters
) {
converters.add(new ByteArrayHttpMessageConverter());
converters.add(new StringHttpMessageConverter());
converters.add(new FormHttpMessageConverter());
converters.add(new SourceHttpMessageConverter<>());
MarshallingHttpMessageConverter xmlConverter =
new MarshallingHttpMessageConverter();
xmlConverter.setSupportedMediaTypes(Arrays.asList(
new MediaType("application", "xml"),
new MediaType("text", "xml"),
new MediaType("text", "json")
));
xmlConverter.setMarshaller(this.marshaller);
xmlConverter.setUnmarshaller(this.unmarshaller);
converters.add(xmlConverter);
MappingJackson2HttpMessageConverter jsonConverter =
new MappingJackson2HttpMessageConverter();
jsonConverter.setSupportedMediaTypes(Arrays.asList(
new MediaType("application", "json"),
new MediaType("text", "json")
));
jsonConverter.setObjectMapper(this.objectMapper);
converters.add(jsonConverter);
}
@Override
public void configureContentNegotiation(
ContentNegotiationConfigurer configurer)
{
configurer.favorPathExtension(true).favorParameter(false)
.parameterName("mediaType").ignoreAcceptHeader(false)
.useJaf(false).defaultContentType(MediaType.APPLICATION_XML)
.mediaType("xml", MediaType.APPLICATION_XML)
.mediaType("json", MediaType.APPLICATION_JSON);
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers)
{
Sort defaultSort = new Sort(new Sort.Order(Sort.Direction.ASC, "id"));
Pageable defaultPageable = new PageRequest(0, 10, defaultSort);
SortHandlerMethodArgumentResolver sortResolver =
new SortHandlerMethodArgumentResolver();
sortResolver.setSortParameter("paging.sort");
sortResolver.setFallbackSort(defaultSort);
PageableHandlerMethodArgumentResolver pageableResolver =
new PageableHandlerMethodArgumentResolver(sortResolver);
pageableResolver.setMaxPageSize(100);
pageableResolver.setOneIndexedParameters(true);
pageableResolver.setPrefix("paging.");
pageableResolver.setFallbackPageable(defaultPageable);
resolvers.add(sortResolver);
resolvers.add(pageableResolver);
}
@Override
public void addFormatters(FormatterRegistry registry)
{
if(!(registry instanceof FormattingConversionService))
{
return;
}
DomainClassConverter<FormattingConversionService> converter =
new DomainClassConverter<>((FormattingConversionService)registry);
converter.setApplicationContext(this.applicationContext);
}
@Override
public Validator getValidator()
{
return this.validator;
}
@Override
public void addInterceptors(InterceptorRegistry registry)
{
super.addInterceptors(registry);
registry.addInterceptor(new LocaleChangeInterceptor());
}
@Bean
public LocaleResolver localeResolver()
{
return new SessionLocaleResolver();
}
@Bean
public ViewResolver viewResolver()
{
InternalResourceViewResolver resolver =
new InternalResourceViewResolver();
resolver.setViewClass(JstlView.class);
resolver.setPrefix("/WEB-INF/jsp/view/");
resolver.setSuffix(".jsp");
return resolver;
}
@Bean
public RequestToViewNameTranslator viewNameTranslator()
{
return new DefaultRequestToViewNameTranslator();
}
}
根配置
@Configuration
@EnableScheduling
@EnableLoadTimeWeaving
@EnableAsync(
mode = AdviceMode.PROXY, proxyTargetClass = true,
order = 1
)
@EnableTransactionManagement(
mode = AdviceMode.PROXY, proxyTargetClass = true,
order = 2
)
@EnableJpaRepositories(
basePackages = "it.dirimo.site.repositories",
entityManagerFactoryRef = "entityManagerFactoryBean",
transactionManagerRef = "jpaTransactionManager"
)
@ComponentScan(
basePackages = "it.dirimo.site",
excludeFilters =
@ComponentScan.Filter({Controller.class, ControllerAdvice.class})
)
public class RootContextConfiguration implements AsyncConfigurer, SchedulingConfigurer
{
//private static final Logger log = LogManager.getLogger();
@Inject LoadTimeWeaver loadTimeWeaver;
@Bean
public MessageSource messageSource()
{
ReloadableResourceBundleMessageSource messageSource =
new ReloadableResourceBundleMessageSource();
messageSource.setCacheSeconds(-1);
messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
messageSource.setBasenames(
"/WEB-INF/i18n/titles", "/WEB-INF/i18n/messages",
"/WEB-INF/i18n/errors", "/WEB-INF/i18n/validation"
);
return messageSource;
}
@Bean
public LocalValidatorFactoryBean localValidatorFactoryBean()
{
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
validator.setValidationMessageSource(this.messageSource());
return validator;
}
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor()
{
MethodValidationPostProcessor processor =
new MethodValidationPostProcessor();
processor.setValidator(this.localValidatorFactoryBean());
return processor;
}
@Bean
public ObjectMapper objectMapper()
{
ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE,
false);
return mapper;
}
@Bean
public Jaxb2Marshaller jaxb2Marshaller()
{
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setPackagesToScan(new String[] { "it.dirimo.site" });
return marshaller;
}
@Bean
public DataSource fileSearchDataSource()
{
JndiDataSourceLookup lookup = new JndiDataSourceLookup();
return lookup.getDataSource("jdbc/DIR");
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()
{
Map<String, Object> properties = new Hashtable<>();
properties.put("javax.persistence.schema-generation.database.action",
"none");
properties.put("hibernate.ejb.use_class_enhancer", "true");
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabasePlatform("org.hibernate.dialect.Oracle10gDialect");
LocalContainerEntityManagerFactoryBean factory =
new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(adapter);
factory.setDataSource(this.fileSearchDataSource());
factory.setPackagesToScan("it.dirimo.site.entities");
factory.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
factory.setValidationMode(ValidationMode.NONE);
factory.setLoadTimeWeaver(this.loadTimeWeaver);
factory.setJpaPropertyMap(properties);
return factory;
}
@Bean
public PlatformTransactionManager jpaTransactionManager()
{
return new JpaTransactionManager(
this.entityManagerFactoryBean().getObject()
);
}
@Bean
public ThreadPoolTaskScheduler taskScheduler()
{
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(20);
scheduler.setThreadNamePrefix("task-");
scheduler.setAwaitTerminationSeconds(60);
scheduler.setWaitForTasksToCompleteOnShutdown(true);
return scheduler;
}
@Override
public void configureTasks(ScheduledTaskRegistrar registrar) {
TaskScheduler scheduler = this.taskScheduler();
registrar.setTaskScheduler(scheduler);
}
@Override
public Executor getAsyncExecutor() {
Executor executor = this.taskScheduler();
return executor;
}
}
最佳答案
这是 Tomcat/Spring/Hibernate 的常见问题,通常没有适用于所有场景的明确答案。 最有可能的是,一般的潜在问题是每次重新部署时都会创建动态类,存储在 permgen 中,并且类定义永远不会被垃圾回收。这通常不是 Spring/Hibernate 的直接错误,而是而是 CGLIB 和/或 Tomcat 的类加载器处理的“功能”。
一些常见的建议:
将 -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
添加到 tomcat 启动选项。
如果这是问题的原因,请远离 CGLIB。仅某些类型的代理需要 CGLIB。
将 JDBC jar 文件放在 {tomcat}/lib 中,而不是 WEB-INF/lib 中。
还有很多其他想法here和在互联网上,但一般来说,如果您无法解决上述问题,那么唯一的办法就是增加您的永久代并计划在每次重新部署后重新启动 tomcat。
有趣的是(根据我自己的经验),这个问题对于最新的库/服务器/jdk 版本来说不是一个问题。
关于java - Spring + JPA PermGen 内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23890861/
运行 Tomcat 失败并出现 java.lang.OutOfMemoryError - 与缺少 PermGen 空间相关的错误。 我最近将 Tomcat 更改为以自己的用户(而非 root)运行。
我需要一些信息: 我有 2 个带有 TOMCAT 7.0.28 和 JAVA jdk1.7.0_05 的 redhat 6.1 Linux 服务器 在 192.168.1.20(TOM04) 上,我有
我知道在JVM中,permgen区是用来存放类定义的。在我的 Tomcat 中,我看到 permgen 的当前内存使用量接近 100MB,似乎它只是随着时间的推移而增长,即使没有人使用 Tomcat
我正在尝试增加我的应用程序必须使用的 PermGen 空间量以避免一些 PermGen 错误。 我尝试将 JAVA_OPTS 和 MAVEN_OPTS 导出为 -Xms1024m -Xmx2048m
我遇到了一个非常严重的生产问题,我希望有人能提供帮助。 我正在使用 Spring 3.1.0 并且对其功能印象深刻。 在开发过程中,一切正常。不幸的是,在部署到生产环境时,我们遇到了一些问题。 我们正
next java release附带 removal of the permanent generation来自热点 JVM。 Java 开发人员应该知道的后果是什么? 最佳答案 来自您链接的 JE
我有一个关于 PermGen 内存分配过多的问题。 我写了一个小代码来监控这个内存空间的大小,我注意到几乎每个方法执行后分配的内存大小都会增加。也许我的应用程序中有很多全局对象?有没有办法知道在 Pe
有没有一种工具/方法可以监控 tomcat 内存使用情况,即 permgen 以避免出现如下问题。是的,我们可以增加内存并调整 GC,但仍然进行一些监控会更好。当达到某些关键内存消耗时,还希望发送警告
org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet default t
环境:Windows Server 2003 x86 Intel Xeon 2.3 4gb Ram | Tomcat 7.0.27 | jdk 1.7.0.25 我遇到了 OutOfMemoryErr
我有 tomcat 7.0.47,grails 2.3.7 中的一个项目和 windows 2003 中 RichFaces 4.3.4 中的 2 个项目 服务器(2Gb RAM)。如果我在 tomc
嘿,我在 Windows 上,我正在尝试部署 Tomcat,但我一直收到 permgen 内存异常。我读到您可以通过添加 JAVA_OPTS="-server -Xms128M -Xmx256M -X
我有一个正在运行的java进程。通过 jstat,我可以看到 permgen 利用率和容量几乎相同。即当前容量几乎已满,但仍远低于指定的最大 permgensize。 这是标准还是我应该期望看到一定程
我正在为在 JBoss 上运行的应用程序使用 JAVA 5(32 位)。但它仅适用于 32 位。当我们在 64 位 java5 上部署它时,它会抛出异常 "java.lang.OutOfMemoryE
我从官方oracle网站找到了图片 但在流行SO answer我发现永久代不是堆的一部分 Permanent Generation (non-heap): The pool containing al
我想知道 JVM 是否正常卸载类以减少 PermGen 空间。所以这是我的问题: Java 类是否会默认从 JVM 中卸载? 关闭 Jar 类加载器是否会卸载该 jar 中所有已加载的类? 应该使用什
我试图了解 HotSpot JVM 的内存结构,但对“方法区” 和“PermGen” 空间这两个术语感到困惑。我提到的文档说方法区包含类和方法的定义,包括字节码。其他一些文档说它们存储在 PermGe
java中PermGen空间的意义是什么? 最佳答案 PermGen 空间是为长期对象保留的——主要是由 ClassLoader 加载的 Class 对象。 PermGen 不会被垃圾回收,除非在非常
我知道有很多关于这个问题的问题和答案;我已经尝试了 8 或 10 种对其他人有用的不同方法,并且觉得需要分析错误的地方而不是反复试验。 我在 Windows 64 位机器上运行,Spring Tool
在我的进程中,我不断创建一个新的 Thread 对象(实际上是 Thread 的子类)(每秒最多几个),运行它并干净地结束。 我注意到,例如,当进程运行 25 天时,进程可能会死亡,留下 hprof,
我是一名优秀的程序员,十分优秀!