xxl-job
xxl-job copied to clipboard
我在使用旧版发现GlueFactory会重复加载类导致元空间内存溢出。进而有一些小想法
我在使用旧版发现GlueFactory会重复加载类导致元空间内存溢出。这在新版修复了。 xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueFactory.java
private Class<?> getCodeSourceClass(String codeSource){
try {
// md5
byte[] md5 = MessageDigest.getInstance("MD5").digest(codeSource.getBytes());
String md5Str = new BigInteger(1, md5).toString(16);
Class<?> clazz = CLASS_CACHE.get(md5Str);
if(clazz == null){
clazz = groovyClassLoader.parseClass(codeSource);
CLASS_CACHE.putIfAbsent(md5Str, clazz);
}
return clazz;
} catch (Exception e) {
return groovyClassLoader.parseClass(codeSource);
}
}
具体修复的逻辑就是加了一个缓存。但是这里我有个小的疑惑或者说建议。因为官方的实现是计算出md5. 不管采用什么样的hash算法都会有hash碰撞问题。所以这里是否可以直接将codeSource作为map的key。 这样可能会导致内存中大量的codeSource字符串。但是可以将他放入字符表来进行优化codeSource.intern()
个人认为一旦出现hash碰撞,这个问题将是很难被查证的