用过Btrace unsafe模式来解答下,unsafe模式能不能创建对象?
shigangxing
2013-12-14
Btrace UserGuide(https://kenai.com/projects/btrace/pages/UserGuide )中提到 BTrace Restrictions ,又提到设置unsafe参数就不会检查‘BTrace Restrictions’
BTrace Restrictions can not create new objects. can not create new arrays. can not throw exceptions. ... ... Supported Arguments unsafe - do not check for btrace restrictions violations (true/false) 我在btrace shell 脚本中指定了-Dcom.sun.btrace.unsafe=true,但还是不能create new object? 在网上找了两篇文章,都说unsafe管用: https://blogs.oracle.com/sundararajan/entry/btrace_unsafe_mode http://ar.newsmth.net/thread-cc7a8616494125.html 到底unsafe模式下能不能创建对象?如果不能,unsafe模式有什么用? |
|
shigangxing
2013-12-17
no body use btrace? 还是我描述的不明白?
|
|
sswh
2013-12-18
unsafe模式下,我之前写过的脚本经常会在里面new HashMap()来用。
所以,这点是确信无疑的。 --------------------- 我觉得,unsafe模式下几乎没有什么限制。 我唯一确认的,就是因为: 1、BTrace脚本是使用系统类加载器加载的; 2、BTrace脚本中的@OnMethod(..){}中的字节码会被复制到目标类中。 (注意是复制字节码!!) 3、BTrace脚本中的静态方法,则会保留在BTrace脚本类中, (注意是静态方法不会被复制到目标类!!) 4、所以,在脚本的静态方法中,不能引用系统类加载器以外的类!! 否则运行时,会报NoClassDefFoundError。(比如静态方法不要访问WebApp里面的类) --------------- 这是我确认的使用BTrace的限制。 除了因为类加载器的缘故导致的一些限制外, 其他BTrace脚本和普通的Java代码没区别。 当然,BTrace脚本编译后的Class,被BTrace加载的时候,会使用字节码工具对 脚本Class进行一些修改和增强,典型的就是@TLS这样的变量会被修改为ThreadLocal对象。 |
|
shigangxing
2013-12-18
sswh 写道 unsafe模式下,我之前写过的脚本经常会在里面new HashMap()来用。
所以,这点是确信无疑的。 --------------------- 我觉得,unsafe模式下几乎没有什么限制。 我唯一确认的,就是因为: 1、BTrace脚本是使用系统类加载器加载的; 2、BTrace脚本中的@OnMethod(..){}中的字节码会被复制到目标类中。 (注意是复制字节码!!) 3、BTrace脚本中的静态方法,则会保留在BTrace脚本类中, (注意是静态方法不会被复制到目标类!!) 4、所以,在脚本的静态方法中,不能引用系统类加载器以外的类!! 否则运行时,会报NoClassDefFoundError。(比如静态方法不要访问WebApp里面的类) --------------- 这是我确认的使用BTrace的限制。 除了因为类加载器的缘故导致的一些限制外, 其他BTrace脚本和普通的Java代码没区别。 当然,BTrace脚本编译后的Class,被BTrace加载的时候,会使用字节码工具对 脚本Class进行一些修改和增强,典型的就是@TLS这样的变量会被修改为ThreadLocal对象。 请问你用btrace哪个版本? |
|
sswh
2013-12-18
1.2.2
|
|
shigangxing
2013-12-18
@BTrace(unsafe=true) https://kenai.com/jira/browse/BTRACE-105
最终在注解上加unsafe=true解决。感谢@sswh回复 |