项目:
我使用斯流甘利亚来监控 Websphere 应用程序服务器 (WAS) 的 JVM 指标。WAS 是使用方面J 方面进行检测的。我添加了一个方面来测量所有应用程序方法运行时。
我使用Hsflow d作为JVM指标收集器。Hsflow d在内部使用JMX-Sflow Agent javaagent挂钩到JVM以使用MXBean(RuntimeMXBean、GarbageCollectorMXBean、CompilationMXBean和ThreadMXBean)收集指标。
问题:
当我在没有aspectjweaver hook的情况下运行WAS时,我可以看到所有指标(CPU、桌面、内存、进程等。)连续在神经节网。但是当aspectjweaver被添加到JVM参数中,并且重新启动服务器后,我可以看到10分钟的指标,但是之后它不会在Ganglia web中报告JVM指标。
在“方面j编织日志”中,我可以看到“方面J”正在编织JMX流代理代码。即使它是通过!call(*)
排除的。
方面:
package com.foo.main;
import java.io.*;
import java.lang.reflect.Method;
import java.security.Signature;
import java.util.*;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.osgi.service.application.ApplicationAdminPermission;
@Aspect
public class ResponseTimeAspect {
@Pointcut(
"execution(* com.foo.*(..)) && " +
"!within(com.foo.main.ResponseTimeAspect) && " +
"!within(ThreadLocal+) && " +
"!within(&& !within(*..*Aspect)) && " +
"!within(com.foo.main.AppInformationReader) && " +
"!within(@org.aspectj.lang.annotation.Aspect *) && " +
"!within(com.sflow.jmx.SFlowAgent) && " +
"!(call( * com.sflow.jmx.SFlowAgent(..)))"
)
public void loggingResponseTime() {}
private static ThreadLocal<String> uuidContainer = new ThreadLocal<String>() {
@Override
protected String initialValue(){
return UUID.randomUUID().toString();
}
};
AppInformationReader logWriter = AppInformationReader.getInstance();
@Around("loggingResponseTime()")
public Object tracing(ProceedingJoinPoint thisJoinPoint) throws Throwable {
Long startTime= System.currentTimeMillis();
Long startTotalMemory = Runtime.getRuntime().totalMemory();
Long startFreeMemory = Runtime.getRuntime().freeMemory();
Object ret = thisJoinPoint.proceed();
Long elapsedTime=System.currentTimeMillis() - startTime;
Long endTotalMemory = Runtime.getRuntime().totalMemory();
Long endFreeMemory = Runtime.getRuntime().freeMemory();
String methodSignature=thisJoinPoint.getSignature().toString();
String classname=methodSignature.split("\\.")[thisJoinPoint.getSignature().toString().split("\\.").length-1];
String methodName =thisJoinPoint.getSignature().getDeclaringType().getCanonicalName();
logWriter.writeLog(uuidContainer.get().toString(), startTime, System.currentTimeMillis(), elapsedTime, classname, methodName);
return ret;
}
}
JMX软件包位于< code > com . SF low . JMX . sflowagent 下。
声明:这是一个答案,但还不是解决方案。写更多的评论是没有意义的,所以当我从Vimlesh收集更多的信息时,我会在这里精炼我的答案。
好吧,仅仅用这个方面而不是一个真实的SSCCE显示有问题的行为来重现你的问题是不可能的。有很多悬而未决的问题:
logWriter
的变量是AppInformationReader
的实例。那么它是什么,读者还是作家?这门课做什么?方面使用它,但未显示UUID?它们用于什么?它们似乎没有增加任何价值,正如我在你早些时候发布的另一个问题中所说的那样。你当时没有回答这个问题,你现在能回答吗?开销看起来没用
切入点过多。例如
execution(*com.foo.*(..))
仅捕获packagecom下类中的方法执行。foo
,但不在任何子包中。因此,从子包中排除类是无用的。也许您真正想要的是执行(*com.foo..*(..))
-注意foo..*
中的两个点表示子包
- 您误解了我在另一个问题中的回答,因为您没有选择我的一个解决方案来排除方面及其内部使用的匿名
ThreadLocal
子类,而是将它们与连接起来
话虽如此,您可能想要这个切入点:
java prettyprint-override">execution(* com.foo..*(..)) &&
!within(@org.aspectj.lang.annotation.Aspect *) &&
!within(com.foo.main.AppInformationReader)
这应该足够了。
修复切入点后,您可以尝试停止收集和记录该方面的信息,以使其更有效率。至于其他 Java 代理程序,没有必要将其从方面编织中排除,但也许您需要将该方面排除在 SFlowAgent 的目标之外
。也许 SFlow 代理检测的方面代码存在问题,但这只是一个猜测。也许你的配置是错误的,也许是别的什么。在我看来,你好像在试图挥舞两种你从未学会使用得足够好的武器(工具)。如果没有 SSCCE,就很难诊断问题的根本原因。
更新:您也可以尝试将AeyJ weaver列为JVM命令行上的第一个Java代理,即在SFlow代理之前。测试它是否有任何不同。
如果程序员返回的是Arraylist而不是List,我会尝试生成一个警告。我使用Spring Boot,Spring Data JPA。 Pojo示例 我的存储库:
即便用追踪式收集辅助引用计数,在很多时候停顿时间依然不可接受,原因有几点: 虽然引用计数可以保证不产生循环的对象能实时回收,但存在很多这类对象是挂在循环引用数据结构上的,比如两个对象互相引用,而他们各自又挂了很多int和string数据,即是一个例子。由于这些对象的回收也是在停顿期,实时性不是那么好 循环引用本身并不罕见,双链表、树等数据结构都存在这种情况,实际工作中很多复杂的业务也存在这种情况,
问题内容: 对于一个类项目,我想实现一个Java应用程序,该应用程序连接到本地JVM并收集统计信息,例如堆使用情况,线程数,已加载的类等。我已经在网上搜索API,内置第三方,这将允许我执行此操作,但到目前为止我一直没有成功。 有谁知道一个API,它将允许我连接到正在运行的JVM并收集统计信息? 问题答案: 下列类演示如何连接到正在运行的JVM并建立JMX连接,并在必要时加载JMX代理。它将使用Me
我希望Tweepy Streaming API在我将x#条推文存储在MongoDB中后停止推文。 我尝试了类内的IF和WHILE语句,用计数器定义,但不能让它停止在一定的X量。这对我来说是一个真正的爆头。我在这里找到了这个链接:https://groups.google.com/forum/#!Tweepy/5IGlu2qiug4但是我复制这个的努力失败了。它总是告诉我init需要一个额外的参数。
我试图更深入地理解Java的垃圾收集。 在HotSpot JVM世代集合中,堆中有三个区域(年轻世代、老世代和永久世代)。还有两种算法:
每个java开发人员都知道,java对象不再使用时将被垃圾收集。我想知道JVM如何识别必须为垃圾收集选择的对象。(例如,如果我有10个对象。如果对10个对象中的2个进行垃圾收集,jvm将如何找到这两个对象)。 JVM使用标记和扫描算法(如果我是对的)。 1)例如我在下面提供字符串对象场景 //现在s1