我正在运行一个使用 Jedis 访问 Redis 数据库的 Tomcat 应用程序。不时形成整个应用程序块。通过使用 JavaMelody 监控 Tomcat,我发现当对象请求 Jedis 实例时,问题似乎与 JedisPool 有关。
catalina-exec-74
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:503)
org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1104)
redis.clients.util.Pool.getResource(Pool.java:20)
....
这是我正在使用的 JedisPoolConfig
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxActive(20);
poolConfig.setTestOnBorrow(true);
poolConfig.setTestOnReturn(true);
poolConfig.setMaxIdle(5);
poolConfig.setMinIdle(5);
poolConfig.setTestWhileIdle(true);
poolConfig.setNumTestsPerEvictionRun(10);
poolConfig.setTimeBetweenEvictionRunsMillis(10000);
jedisPool = new JedisPool(poolConfig, "localhost");
所以很明显,一些线程试图获取 Jedis 实例,但池是空的,无法返回实例,因此默认池行为是等待。
我已经仔细检查了我的整个代码,我很确定我将每个 Jedis 实例返回到我之前使用的池中。所以我不确定为什么我的实例用完了。
有没有办法检查池中剩下多少实例?我正在尝试为 maxActive 参数找到一个合理的值,以防止应用程序阻塞。
除了不将 Jedis 实例返回到池中之外,还有其他方法可以创建内存漏洞吗?