Skip to content

Commit

Permalink
Merge pull request #288 from z529192557/master
Browse files Browse the repository at this point in the history
修改类加载时间,将类加载时机提前到init阶段,同时恢复addTransformer时机
  • Loading branch information
dongchenxu authored Jul 7, 2020
2 parents dbae17c + bc94354 commit d0df6b8
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,24 @@
import com.alibaba.jvm.sandbox.core.util.SpyUtils;

import java.lang.instrument.Instrumentation;
import java.util.ArrayList;
import java.util.List;

/**
* 沙箱
*/
public class JvmSandbox {

/**
* 需要提前加载的sandbox工具类
*/
private final static List<String> earlyLoadSandboxClassNameList = new ArrayList<String>();

static {
earlyLoadSandboxClassNameList.add("com.alibaba.jvm.sandbox.core.util.SandboxClassUtils");
earlyLoadSandboxClassNameList.add("com.alibaba.jvm.sandbox.core.util.matcher.structure.ClassStructureImplByAsm");
}

private final CoreConfigure cfg;
private final CoreModuleManager coreModuleManager;

Expand All @@ -33,9 +45,22 @@ public JvmSandbox(final CoreConfigure cfg,
}

private void init() {
doEarlyLoadSandboxClass();
SpyUtils.init(cfg.getNamespace());
}

/**
* 提前加载某些必要的类
*/
private void doEarlyLoadSandboxClass() {
for(String className : earlyLoadSandboxClassNameList){
try {
Class.forName(className);
} catch (ClassNotFoundException e) {
//加载sandbox内部的类,不可能加载不到
}
}
}

/**
* 获取模块管理器
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,14 +83,9 @@ private void finishProgress(final Progress progress, final int cCnt, final int m
* 形变观察所影响的类
*/
private void reTransformClasses(
SandboxClassFileTransformer transformer,
final int watchId,
final List<Class<?>> waitingReTransformClasses,
final Progress progress) {
// 在真正做retransform 前的一刻,做addTransformer,避免java.lang.ClassCircularityError
if(null != transformer){
inst.addTransformer(transformer, true);
}
// 需要形变总数
final int total = waitingReTransformClasses.size();

Expand Down Expand Up @@ -184,6 +179,9 @@ private int watch(final Matcher matcher,
// 注册到CoreModule中
coreModule.getSandboxClassFileTransformers().add(sandClassFileTransformer);

//这里addTransformer后,接下来引起的类加载都会经过sandClassFileTransformer
inst.addTransformer(sandClassFileTransformer, true);

// 查找需要渲染的类集合
final List<Class<?>> waitingReTransformClasses = classDataSource.findForReTransform(matcher);
logger.info("watch={} in module={} found {} classes for watch(ing).",
Expand All @@ -199,7 +197,7 @@ private int watch(final Matcher matcher,
try {

// 应用JVM
reTransformClasses(sandClassFileTransformer,watchId, waitingReTransformClasses, progress);
reTransformClasses(watchId,waitingReTransformClasses, progress);

// 计数
cCnt += sandClassFileTransformer.getAffectStatistic().cCnt();
Expand Down Expand Up @@ -266,7 +264,7 @@ public void delete(final int watcherId,
beginProgress(progress, waitingReTransformClasses.size());
try {
// 应用JVM
reTransformClasses(null, watcherId, waitingReTransformClasses, progress);
reTransformClasses(watcherId, waitingReTransformClasses, progress);
} finally {
finishProgress(progress, cCnt, mCnt);
}
Expand Down

0 comments on commit d0df6b8

Please sign in to comment.