Java 8 HotSpot VM中任何String对象构造的通知

时间:2016-02-08 05:09:16

标签: java string aspectj jvmti

  1. 有没有办法在没有编织或检测rt.jar的情况下,对String类的构造函数(直接或使用反射)进行所有调用的通知?

  2. 此外,是否可以仅针对特定套餐内的来电过滤这些通知?

  3. 此外,可以使这些通知异步(如事件),以便实际的JVM调用不会减慢

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

    由于我不想使用rt.jar,AspectJ似乎是不可能的(因为LTW无法在java核心类上完成)。 JVM TI似乎有潜在的工具,但我不确定如何实现它。

    谢谢, 哈里什

1 个答案:

答案 0 :(得分:1)

  

有没有办法在编译时编织或检测rt.jar的情况下,在String类的构造函数(直接或使用反射)的所有调用上得到通知?

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

  

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

可以使用Reflection.getCallerClass(n)

检查调用者
  

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

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

  

在内容上进行模式匹配

与创建String相比,模式匹配非常昂贵。如果你不小心,你会使你的应用程序减慢一两个数量级。我建议你重新考虑一下你的实际要求,看看是否有其他方法可以解决你想做的事情。

您确定不想使用分析器来执行此操作。注意:偶数分析器通常只进行子样本处理,例如每10次分配。有很多免费的,实际上有两个附带JVM。我建议使用Flight Recorder来跟踪分配,因为它的开销非常低。