import{_ as t,o as r,c as l,a as s,b as e,e as n,d as o,r as c}from"./app.5024572d.js";const p={},i=s("h1",{id:"retransform",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#retransform","aria-hidden":"true"},"#"),n(" retransform")],-1),u={href:"https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-mc-retransform",target:"_blank",rel:"noopener noreferrer"},d=s("code",null,"mc-retransform",-1),m=n("\u5728\u7EBF\u6559\u7A0B"),k=s("div",{class:"custom-container tip"},[s("p",{class:"custom-container-title"},"\u63D0\u793A"),s("p",null,[n("\u52A0\u8F7D\u5916\u90E8\u7684"),s("code",null,".class"),n("\u6587\u4EF6\uFF0Cretransform jvm \u5DF2\u52A0\u8F7D\u7684\u7C7B\u3002")])],-1),v=n("\u53C2\u8003\uFF1A"),h={href:"https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/Instrumentation.html#retransformClasses-java.lang.Class...-",target:"_blank",rel:"noopener noreferrer"},b=n("Instrumentation#retransformClasses"),f=o(`
retransform /tmp/Test.class
retransform -l
retransform -d 1 # delete retransform entry
retransform --deleteAll # delete all retransform entries
retransform --classPattern demo.* # triger retransform classes
retransform -c 327a647b /tmp/Test.class /tmp/Test\\$Inner.class
retransform --classLoaderClass 'sun.misc.Launcher$AppClassLoader' /tmp/Test.class
$ retransform /tmp/MathGame.class
retransform success, size: 1, classes:
demo.MathGame
\u52A0\u8F7D\u6307\u5B9A\u7684 .class \u6587\u4EF6\uFF0C\u7136\u540E\u89E3\u6790\u51FA class name\uFF0C\u518D retransform jvm \u4E2D\u5DF2\u52A0\u8F7D\u7684\u5BF9\u5E94\u7684\u7C7B\u3002\u6BCF\u52A0\u8F7D\u4E00\u4E2A .class
\u6587\u4EF6\uFF0C\u5219\u4F1A\u8BB0\u5F55\u4E00\u4E2A retransform entry.
\u63D0\u793A
\u5982\u679C\u591A\u6B21\u6267\u884C retransform \u52A0\u8F7D\u540C\u4E00\u4E2A class \u6587\u4EF6\uFF0C\u5219\u4F1A\u6709\u591A\u6761 retransform entry.
$ retransform -l
Id ClassName TransformCount LoaderHash LoaderClassName
1 demo.MathGame 1 null null
\u9700\u8981\u6307\u5B9A id\uFF1A
retransform -d 1
retransform --deleteAll
$ retransform --classPattern demo.MathGame
retransform success, size: 1, classes:
demo.MathGame
\u6CE8\u610F\uFF1A\u5BF9\u4E8E\u540C\u4E00\u4E2A\u7C7B\uFF0C\u5F53\u5B58\u5728\u591A\u4E2A retransform entry \u65F6\uFF0C\u5982\u679C\u663E\u5F0F\u89E6\u53D1 retransform \uFF0C\u5219\u6700\u540E\u6DFB\u52A0\u7684 entry \u751F\u6548(id \u6700\u5927\u7684)\u3002
\u5982\u679C\u5BF9\u67D0\u4E2A\u7C7B\u6267\u884C retransform \u4E4B\u540E\uFF0C\u60F3\u6D88\u9664\u5F71\u54CD\uFF0C\u5219\u9700\u8981\uFF1A
\u63D0\u793A
\u5982\u679C\u4E0D\u6E05\u9664\u6389\u6240\u6709\u7684 retransform entry\uFF0C\u5E76\u91CD\u65B0\u89E6\u53D1 retransform \uFF0C\u5219 arthas stop \u65F6\uFF0Cretransform \u8FC7\u7684\u7C7B\u4ECD\u7136\u751F\u6548\u3002
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
mc /tmp/UserController.java -d /tmp
retransform /tmp/com/example/demo/arthas/user/UserController.class
\u4F7F\u7528mc
\u547D\u4EE4\u6765\u7F16\u8BD1jad
\u7684\u53CD\u7F16\u8BD1\u7684\u4EE3\u7801\u6709\u53EF\u80FD\u5931\u8D25\u3002\u53EF\u4EE5\u5728\u672C\u5730\u4FEE\u6539\u4EE3\u7801\uFF0C\u7F16\u8BD1\u597D\u540E\u518D\u4E0A\u4F20\u5230\u670D\u52A1\u5668\u4E0A\u3002\u6709\u7684\u670D\u52A1\u5668\u4E0D\u5141\u8BB8\u76F4\u63A5\u4E0A\u4F20\u6587\u4EF6\uFF0C\u53EF\u4EE5\u4F7F\u7528base64
\u547D\u4EE4\u6765\u7ED5\u8FC7\u3002
\u5728\u672C\u5730\u5148\u8F6C\u6362.class
\u6587\u4EF6\u4E3A base64\uFF0C\u518D\u4FDD\u5B58\u4E3A result.txt
base64 < Test.class > result.txt
\u5230\u670D\u52A1\u5668\u4E0A\uFF0C\u65B0\u5EFA\u5E76\u7F16\u8F91result.txt
\uFF0C\u590D\u5236\u672C\u5730\u7684\u5185\u5BB9\uFF0C\u7C98\u8D34\u518D\u4FDD\u5B58
\u628A\u670D\u52A1\u5668\u4E0A\u7684 result.txt
\u8FD8\u539F\u4E3A.class
base64 -d < result.txt > Test.class
\u7528 md5 \u547D\u4EE4\u8BA1\u7B97\u54C8\u5E0C\u503C\uFF0C\u6821\u9A8C\u662F\u5426\u4E00\u81F4
System.out.println
\uFF0C\u53EA\u6709run()
\u51FD\u6570\u91CC\u7684\u4F1A\u751F\u6548public class MathGame {
public static void main(String[] args) throws InterruptedException {
MathGame game = new MathGame();
while (true) {
game.run();
TimeUnit.SECONDS.sleep(1);
// \u8FD9\u4E2A\u4E0D\u751F\u6548\uFF0C\u56E0\u4E3A\u4EE3\u7801\u4E00\u76F4\u8DD1\u5728 while\u91CC
System.out.println("in loop");
}
}
public void run() throws InterruptedException {
// \u8FD9\u4E2A\u751F\u6548\uFF0C\u56E0\u4E3Arun()\u51FD\u6570\u6BCF\u6B21\u90FD\u53EF\u4EE5\u5B8C\u6574\u7ED3\u675F
System.out.println("call run()");
try {
int number = random.nextInt();
List<Integer> primeFactors = primeFactors(number);
print(number, primeFactors);
} catch (Exception e) {
System.out.println(String.format("illegalArgumentCount:%3d, ", illegalArgumentCount) + e.getMessage());
}
}
}