xxl-job icon indicating copy to clipboard operation
xxl-job copied to clipboard

我在使用旧版发现GlueFactory会重复加载类导致元空间内存溢出。进而有一些小想法

Open codeleep opened this issue 1 year ago • 0 comments

我在使用旧版发现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碰撞,这个问题将是很难被查证的

codeleep avatar Dec 13 '23 08:12 codeleep