【问题标题】:Notification of any String object construction in Java 8 HotSpot VMJava 8 HotSpot VM 中任何 String 对象构造的通知
【发布时间】:2016-02-08 05:09:16
【问题描述】:
  1. 有没有一种方法可以在不编织或检测 rt.jar 的情况下获得对 String 类的构造函数的所有调用(直接或使用反射)的通知?

  2. 是否可以进一步过滤这些通知,仅针对特定包中的呼叫?

  3. 还有可能使这些通知异步(如事件),这样实际的 JVM 调用不会减慢

我的用例是拦截所有正在创建的字符串,对内容进行模式匹配,并根据某些规则(全部在后端)提出变更,作为某些平台组件的一部分。

由于我不想检测 rt.jar,因此 AspectJ 似乎没有问题(因为 LTW 无法在 java 核心类上完成)。 JVM TI 似乎有潜在的工具,但我不确定如何实现它。

谢谢, 哈里什

【问题讨论】:

  • 为什么不用仪器?它完全适合您想要的东西。 RetransformClasses API 可以做拦截技巧。是的,它也适用于核心类。
  • 我知道你不想这样做,但是通过 AspectJ 二进制编织检测 rt.jar 并不是火箭科学。我做过一次只是为了好玩。
  • @apangin 将尝试 RetransformClasses。正在考虑是否有异步获取事件的方式,以便在对象分配期间不影响主代码执行。

标签: java string aspectj jvmti


【解决方案1】:

有没有一种方法可以在所有调用 String 类的构造函数时得到通知(直接或使用反射),而无需在编译时编织或检测 rt.jar?

你没有编译 String 类,所以你只能在运行时进行编织。是的,这是不创建自定义 JVM 的唯一方法。

是否还可以仅针对特定包中的呼叫过滤这些通知?

可以通过 Reflection.getCallerClass(n) 来检查调用者

还有可能使这些通知异步(如事件),以便实际的 JVM 调用不会减慢

所有这些都非常昂贵,就像将工作传递给另一个线程一样。

对内容进行模式匹配

与创建字符串相比,模式匹配非常昂贵。如果您不小心,您的应用程序将减慢一两个数量级。我建议您重新考虑您的实际需求,看看是否有其他方法可以解决您正在尝试做的事情。

您确定不想使用分析器来执行此操作。注意:即使是分析器通常也只是子样本,例如每 10 次分配。有很多免费的,实际上有两个随 JVM 一起提供。我建议使用 Flight Recorder 来跟踪分配,因为它的开销非常低。

【讨论】:

  • 使用jvmti之类的工具怎么样?您还可以详细说明如何实施#1问题
  • @Harish 我没有使用 jvmti,但我不相信你可以使用它来跟踪对象分配而无需代码注入。
猜你喜欢
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多