由于Tomcat中的孤立线程,我遇到了内存泄漏.特别是,似乎Guice和JDBC驱动程序没有关闭线程.
Aug 8, 2012 4:09:19 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: A web application appears to have started a thread named [com.google.inject.internal.util.$Finalizer] but has failed to stop it. This is very likely to create a memory leak.
Aug 8, 2012 4:09:19 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: A web application appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak.
Run Code Online (Sandbox Code Playgroud)
我知道这与其他问题(例如这个问题)类似,但在我的情况下,"不要担心它"的答案是不够的,因为它给我带来了问题.我有CI服务器定期更新此应用程序,并且在6-10次重新加载后,CI服务器将挂起,因为Tomcat内存不足.
我需要能够清除这些孤立的线程,以便我可以更可靠地运行我的CI服务器.任何帮助,将不胜感激!
当tomcat关闭时,我在catalina.out日志文件中收到以下消息.我正在使用Tomcat 7.x和Tomcat JDBC数据源.
Mar 26, 2013 1:17:52 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [/my_webapp] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Mar 26, 2013 1:17:52 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/my_webapp] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory …Run Code Online (Sandbox Code Playgroud) 我正在使用springboot 1.5.9.RELEASE + Java 8 + tomcat 9 + Jersey + Oracle和我的应用程序已安排的方法定义如下:
@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod = "shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(100);
}
}
Run Code Online (Sandbox Code Playgroud)
工作班:
@Component
public class ClearCacheJob {
@Scheduled(fixedRate = 3600000, initialDelay = 10000)
public void clearErrorCodesCache() {
try {
logger.info("######## ClearCacheJob #########");
} catch (Exception e) {
logger.error("Exception in ClearCacheJob", e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我也有一个类来取消注册oracle驱动程序,如下所示:
@WebListener
public class ContainerContextClosedHandler implements …Run Code Online (Sandbox Code Playgroud) 我有一个外部MySQL服务器,设置和工作正常.我在Eclipse中创建了一个数据库连接,可以在Data Source Explorer选项卡中查看数据库.
现在,我有一个需要访问该数据库的servlet.我该怎么做?有没有办法引用在数据源资源管理器中创建的数据库连接,还是我必须两次定义所有内容?
另外,打开连接的最佳方法是什么?我已经mysql-connector-java-5.1.11-bin.jar包含了该文件,并且我发现了两种有效的方法:
MysqlDataSource d = new MysqlDataSource();
d.setUser("user");
d.setPassword("pass");
d.setServerName("hostname.com");
d.setDatabaseName("db");
Connection c = d.getConnection();
Run Code Online (Sandbox Code Playgroud)
和
Connection c = DriverManager.getConnection("jdbc:mysql://hostname.com/db","user","pass");
Run Code Online (Sandbox Code Playgroud)
两者都不是最佳的,因为首先,它们都使用硬编码的字符串.这是一个Java EE Web应用程序项目,是否有一个放置连接数据的好地方?或者有没有办法放弃所有这些并只使用数据源资源管理器中的连接?
我在tomcat 7中遇到问题,这里有一些关于它的信息,
1 - 我有这样的信息:
INFO: Reloading Context with name [/WebApp] has started
Oct 04, 2013 12:20:50 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [/WebApp] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Oct 04, 2013 12:20:50 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/WebApp] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to …Run Code Online (Sandbox Code Playgroud) 这是tomcat启动日志的相关部分:
SEVERE: Context [/f360] startup failed due to previous errors
Apr 8, 2010 6:45:56 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: A web application registered the JBDC driver [org.apache.derby.jdbc.ClientDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Apr 8, 2010 6:45:56 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: A web application registered the JBDC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory …Run Code Online (Sandbox Code Playgroud) 我在stackoverflow上看到了类似的问题,但我无法弄清楚如何解决我的问题.将Spring Security添加到我的Spring MVC项目后,我遇到以下异常:
Jul 20, 2014 3:18:04 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Run Code Online (Sandbox Code Playgroud)
这是我在pom.xml中的 mysql-connecter
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这是我添加的课程:
@Component
@Transactional
public class UserDetailsServiceImpl implements UserDetailsService{
@Autowired
private UserDAO userDAO;
@Autowired
private UserAssembler userAssembler;
private static final Logger logger = LoggerFactory.getLogger(UserDetailsServiceImpl.class);
@Transactional(readOnly = true)
public UserDetails loadUserByUsername(String …Run Code Online (Sandbox Code Playgroud) 我在Web应用程序中使用Tomcat 7连接池(作为server.xml和context.xml中的Tomcat资源)并且它可以工作.
我的问题是:是否有可能"告诉"/"强制"tomcat在创建后配置连接池?
我问的原因如下:
我正在使用H2并在关机时遇到一些"赛车"问题.
H2只要有连接打开但Tomcat不会释放连接池,所以连接仍保持打开状态.结果我在关机时遇到了各种各样的问题.
我发现我可以发出一个SQL SHUTDOWN命令来关闭H2,但我想探索我案例的所有替代方案.
那么是否可以"告诉"/"强制"tomcat配置连接池(至少在关机时)?
对stop或undeploy/redeploy一的Spring framework 3.0.5基于Web的应用程序中记录以下错误Tomcat7's catalina.out:
SEVERE: The web application [/nomination##1.0-qa] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@4f43af8f]) and a value of type [org.springframework.security.core.context.SecurityContextImpl] (value [org.springframework.security.core.context.SecurityContextImpl@ffffffff: Null authentication]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
Run Code Online (Sandbox Code Playgroud)
我最初想到实现ServletContextListener和close()那里的背景.但是,发现ContextLoaderListener哪个工具ServletContextListener设置如下web.xml:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)
来自Javadocs:
**contextDestroyed** …Run Code Online (Sandbox Code Playgroud) memory-leaks spring-mvc permgen servlet-listeners servletcontextlistener
我有兴趣在PostgreSQL JDBC驱动程序上做一些工作来帮助实现驱动程序中Statement.setQueryTimeout(...)一个更有问题的规范一致性漏洞.为此,我需要一种可移植的方法来获取计时器或设置在所有Java EE应用服务器,servlet容器和Java SE环境中都能运行的警报/回调.
它似乎并不像它应该的那样简单,而且我已经足够坚持了,我会把自己倚靠在你的怜悯之上.我该怎么做一个在Java SE,Java EE和servlet容器中工作的简单定时器回调?
如果有必要,我可以忍受单独的-ee和-se版本,但这是非常不受欢迎的.每个容器的发布完全不切实际,但如果强烈不合适,则可以接受自动选择的每个容器适配器.
PgJDBC驱动程序必须在古老版本的JVM下运行在硬件旧的应用程序服务器中,但是如果语句超时仅在现代容器和JVM的驱动程序的JDBC4版本中可用,我并不在意.已经有一个条件编译基础设施允许发布JDBC3/JDK 1.4和JDBC4/JDK 1.5驱动程序,因此只能在1.5或甚至1.6下运行的代码不是问题.
(编辑):一个额外的复杂性是用户可以部署JDBC驱动程序:
war或ear...我们需要支持所有这些场景,最好不需要自定义应用程序配置!如果我们不能支持所有这些场景,它至少需要在没有语句超时支持的情况下工作,并且在不支持语句超时的情况下优雅地失败.
啊,写一次,跑啊......
java.util.Timer或java.util.concurrent:我看到广泛的声明,在Java EE中不鼓励使用java.util.TimerJava SE并发实用程序(JSR-166)java.util.concurrent,但很少有任何细节.JSR 236提案说:
java.util.Timer,java.lang.Thread和java.util.concurrency(sic)包中的Java SE并发实用程序(JSR-166)永远不应该在托管环境中使用,因为它创建了在受管环境之外的线程.容器.
更多的阅读表明来自非托管线程的调用不会获得容器服务,因此整个应用程序中的各种事情可能会以令人兴奋和意想不到的方式中断.假定定时器调用可能导致PgJDBC抛出异常并传播到用户应用程序代码中,这很重要.
(编辑):它自己的JDBC驱动程序不需要任何容器服务,因此我不关心它们是否在其计时器线程内工作,只要这些线程永远不会运行任何用户代码.问题是可靠地确保他们不这样做.
JSR 236已经不存在了,我没有看到任何满足便携式计时器相同要求的替代品.
我找不到任何对跨容器可移植方式的引用来获得容器池计时器.如果我可以从容器上的JNDI中获取一个计时器并回退到直接实例化,那么从JNDI获取一个计时器失败就可以了......但我甚至找不到办法做到这一点.
有EJB计时器,但它们不适合像JDBC驱动程序实现这样的低级别的东西,因为它们是:
因此,EJB计时器可以完全脱离列表.
阻止使用java.util.Timer和朋友的相同问题阻止我启动我自己的计时器线程和管理我自己的计时器.这不是首发.
Java EE规范说:
企业bean不得尝试管理线程.企业bean不得尝试启动,停止,暂停或恢复线程,或更改线程的优先级或名称.企业bean不得尝试管理线程组.
而EE教程说:
不正确地使用线程的资源适配器可能危及整个应用程序服务器环境.例如,资源适配器可能会创建太多线程,或者可能无法正确释放它创建的线程.糟糕的线程处理会阻止应用程序服务器关闭并影响应用程序服务器的性能,因为创建和销毁线程是一项昂贵的操作.
tomcat ×6
java ×4
jdbc ×4
datasource ×2
java-ee ×2
memory-leaks ×2
spring-mvc ×2
mysql ×1
nhibernate ×1
permgen ×1
postgresql ×1
servlets ×1
spring ×1
spring-boot ×1
threadpool ×1
timer ×1
tomcat6 ×1
tomcat7 ×1