alibaba / tprofiler Goto Github PK
View Code? Open in Web Editor NEWTProfiler是一个可以在生产环境长期使用的性能分析工具
License: GNU General Public License v2.0
TProfiler是一个可以在生产环境长期使用的性能分析工具
License: GNU General Public License v2.0
TProfiler is a code profiling tool. author:[email protected] Note: TProfiler requires Java6™ VM. Please refer to Wiki for more information: https://github.com/alibaba/TProfiler/wiki The source code is available using the GPL version 2. We are actively looking for contributors, so if you have any ideas, bug reports, or patches you would like to contribute please do not hesitate to do that.
TimeSortData
中
public int compareTo(TimeSortData o) {
if (this.sum > o.sum) {
return -1;
} else {
return 1;
}
}
当sum相等时会出现IllegalArgumentException(
"Comparison method violates its general contract!")
程序用tomcat启动后无法生成对应的日志分析文件。
tomcat7、eclipse、jdk1.8
有没有人遇到同样的问题?求大神解答
我们的项目使用jdk1.7编译和运行,是否可以使用#tprofile
instrumentmethod会比实际方法行数少一些
配置:
startProfTime = 17:28:00
endProfTime = 20:00:00
eachProfUseTime = 5
eachProfIntervalTime = 50
samplerIntervalTime = 20
port = 50000
debugMode = false
needNanoTime = false
ignoreGetSetMethod = true
同一个接口,相同参数,没有cache 压测结果:
结论:qps几乎没什么影响, 这是为什么?
不使用tprofiler的压测结果:
summary + 80918 in 7.3s = 11093.8/s Avg: 14 Min: 0 Max: 122 Err: 0 (0.00%) Active: 200 Started: 200 Finished: 0
summary + 355915 in 30s = 11863.8/s Avg: 16 Min: 11 Max: 30 Err: 0 (0.00%) Active: 200 Started: 200 Finished: 0
summary = 436833 in 37.3s = 11712.9/s Avg: 16 Min: 0 Max: 122 Err: 0 (0.00%)
使用tprofiler的压测结果:
summary + 308453 in 27s = 11421.6/s Avg: 16 Min: 1 Max: 205 Err: 0 (0.00%) Active: 200 Started: 200 Finished: 0
summary = 308454 in 27.2s = 11352.7/s Avg: 16 Min: 1 Max: 205 Err: 0 (0.00%)
summary + 359548 in 30s = 11984.9/s Avg: 16 Min: 9 Max: 57 Err: 0 (0.00%) Active: 200 Started: 200 Finished: 0
最近,我们在项目中新增了Tprofile进行运行时性能数据的收集,但是发现当我们在运行的时候进行部分(一般是在线解决bug,只针对1-2个class)class文件热更新(使用Instrumentation.addTransformer 和 Instrumentation.retransformClasses)后,服务器运行明显变慢,并且可以排除各种IO的影响,严重的服务器只能重启才能解决问题。
在源代码的DataDumpThead类中有代码错误,导致编译失败。具体原因可编译时查看。
java -cp tprofiler.jar com.taobao.profile.client.TProfilerClient 127.0.0.1 4096 status
java.net.ConnectException: 拒绝连接
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.(Socket.java:425)
at java.net.Socket.(Socket.java:208)
at com.taobao.profile.client.TProfilerClient.getStatus(TProfilerClient.java:112)
at com.taobao.profile.client.TProfilerClient.status(TProfilerClient.java:57)
at com.taobao.profile.client.TProfilerClient.main(TProfilerClient.java:173)
方法中调用了依赖包中的函数,可以获取到性能数据么?
DataDumpThread.java L109 "c continue;" 这么简单的拼写错误居然直接提交到master分支了
启动后大量报错
java.lang.ArrayIndexOutOfBoundsException: 17912
at org.objectweb.asm.ClassReader.(Unknown Source)
at org.objectweb.asm.ClassReader.(Unknown Source)
at com.taobao.profile.instrument.ProfTransformer.transform(ProfTransformer.java:52)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
I cannot get tmethod file by running cmd "java -cp tprofiler.jar com.taobao.profile.client.TProfilerClient 127.0.0.1 stop".
It seems this file will only be wrritten after endProfTime
Any other way can i get it?
Will method id be changed at next runtime?
其它两个文件是0K, 配置上除了把profile.properties里的includePackageStartsWith 改成自己的包,其它没动过
I can't use my defined properties file to instead of the one dependency jar include.
我按照wiki上的配置说明启动后,报这个错,请问是为什么?
load configuration from "/home/xxx/profile.properties".
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:382)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:397)
Caused by: java.lang.IncompatibleClassChangeError: Implementing class
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at com.taobao.profile.Main.premain(Main.java:29)
... 6 more
FATAL ERROR in native method: processing of -javaagent failed
如果被监控的java程序依赖了ASM包,那么很有可能会和TProfile中ASM包冲突。我也遇到同样问题并已解决,具体请看injectsocks。
在 linux 上我用是tomcat 如果进行Tprofile 配置,能不能提供个配置例子
hi,各位。
我这边分析了一下TProfiler的代码,定位了这一个bug,并做了简单的修复。这里和大家分享一下,希望对大家有所帮助。
内部的bug主要在于ProfFilter类及其子类MysqlProfFilter上。
ProfFilter.includePackage字段是用于判断是否需要注入代码的。
public static boolean isNeedInject(String className) {
String icaseName = className.toLowerCase().replace('.', '/');
for (String v : includePackage) {
if (icaseName.startsWith(v)) {
return true;
}
}
return false;
}
MysqlProfFilter的构造方法会把mysql的包信息也自动写进去到ProfFilter.includePackage去。
在ProfTransformer.transform中,79行处表示“如果可以注入mysql成功;则不再继续注入”,所以问题在于transform4Mysql方法,45行处,
if(!MysqlProfFilter.getInstance().isNeedInject(className))
这个方法虽然获取了Instance,但是调用的是父类的静态方法,也就是说,我们配置的package都会被视为mysql的类,进而使用mysql的统计方式,而无法把日志写到tprofiler.log上
修复方法:
为MysqlProfFilter定义一个新的静态方法,那个方法只需检查mysql的package。
if(!MysqlProfFilter.isNeedInjectMysql(className))
暂时不清楚作者对这个设置是什么原因,我自己对这个逻辑做了修改,验证过tprofiler.log是可以获得日志,进而按照wiki的方法去做性能分析。
希望这些可以帮助到各位需要使用这个工具的朋友,有问题可以在这个issue下补充留言。
部署后低峰期对应用响应时间影响20% ?
假如TimeControlThread、DataDumpThread、SamplerThread三个线程都关闭(去掉)了,InnerSocketThread这个线程的switchFlag为false,这样子 部署后低峰期对应用响应时间影响也是20% ?
tomca停止shutdown.sh报Address already in use异常,
异常代码为socket = new ServerSocket(Manager.PORT);我觉得应该这这里判断一下线程是否已经启动。
默认下载的代码的dist目录jar不是源代码编译的版本,直接使用这个jar会造成tomca停止shutdown.sh时无法退出,源代码中此问题已修复。
还有1个疑问是socket = new ServerSocket(Manager.PORT);这里的端口号不是配置的,如果我1台物理机上面有多个java实例,只有第一个能够启动远程操作吧,因为端口号已经被占用,不过这个问题还没有实际验证
再jvm参数中加入 -javaagent:/path/tprofile,会有下面的exception
java.lang.NoClassDefFoundError: com/taobao/profile/Profiler
at com.alipay.sofa.service.transform.binding.RemotingBindingListener.(RemotingBindingListener.java)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at org.eclipse.equinox.internal.ds.model.ServiceComponent.createInstance(ServiceComponent.java:493)
at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.createInstance(ServiceComponentProp.java:272)
at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.build(ServiceComponentProp.java:333)
at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponent(InstanceProcess.java:620)
at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:197)
at org.eclipse.equinox.internal.ds.Resolver.buildNewlySatisfied(Resolver.java:473)
at org.eclipse.equinox.internal.ds.Resolver.enableComponents(Resolver.java:217)
at org.eclipse.equinox.internal.ds.SCRManager.performWork(SCRManager.java:863)
at org.eclipse.equinox.internal.ds.SCRManager$QueuedJob.dispatch(SCRManager.java:830)
at org.eclipse.equinox.internal.ds.WorkThread.run(WorkThread.java:89)
at org.eclipse.equinox.internal.util.impl.tpt.threadpool.Executor.run(Executor.java:70)
Caused by: com.alipay.cloudengine.extensions.equinox.KernelBundleClassNotFoundException: com.taobao.profile.Profiler in KernelBundleClassLoader: [bundle=com.alipay.sofa.service.transform_3.0.0]
at com.alipay.cloudengine.extensions.equinox.KernelBundleClassLoader.loadClass(KernelBundleClassLoader.java:125)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 18 more
Caused by: java.lang.ClassNotFoundException: com.taobao.profile.Profiler
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(Unknown Source)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(Unknown Source)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(Unknown Source)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(Unknown Source)
at com.alipay.cloudengine.extensions.equinox.KernelBundleClassLoader.loadClass(KernelBundleClassLoader.java:121)
... 19 more
大阿里的程序员diaodiao的
生成的四个文件的作用是什么,以及如何分析来优化,希望举个例子。
java.lang.ArrayIndexOutOfBoundsException: 4723
at org.objectweb.asm.ClassReader.readClass(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at com.taobao.profile.instrument.ProfTransformer.transform(ProfTransformer.java:55)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:250)
at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:401)
at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1432)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1377)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:641)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:609)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1484)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:425)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:395)
at org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration$DispatcherServletRegistrationCondition.checkDefaultDispatcherName(DispatcherServletAutoConfiguration.java:202)
at org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration$DispatcherServletRegistrationCondition.getMatchOutcome(DispatcherServletAutoConfiguration.java:192)
at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47)
at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:102)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:217)
at org.springframework.context.annotation.ConfigurationClassParser.processMemberClasses(ConfigurationClassParser.java:349)
at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:264)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245)
at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:606)
at org.springframework.context.annotation.ConfigurationClassParser.processDeferredImportSelectors(ConfigurationClassParser.java:548)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:185)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:308)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:228)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:270)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:93)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:686)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:524)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:314)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151)
启动应用的时候,asm的ArrayIndexOutOfBoundsException大量的抛出。
TProfile的版本是1.0.1,从主干下载的代码,启动的运用是Springboot-1.5.3。
开发环境:
Mac 10.13.4
JDK:
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
=
而替换成dist中相应的jar包,生成的tprofiler.log正确(可以输出方法id,运行时间等)。
请问如何解决?
尝试多次运行应用,TProfiler.log的内容只出现莫名其妙的“=”号,并没有像wiki中的说明那样,从而导致无法分析profiler log命令(执行类似命令生成的文件什么内容都没有: java -cp tprofiler.jar com.taobao.profile.analysis.ProfilerLogAnalysis d:/tprofiler.log d:/tmethod.log d:/topmethod.log d:/topobject.log)
如何在tomcat 配置使用 tprofile 能说下详细的配置吗。对于配置文件说的 在jvm 加上启动参数,如何加啊
我配置文件为:
startProfTime = 11:15:00
endProfTime = 11:20:00
eachProfUseTime = 5
eachProfIntervalTime = 10
samplerIntervalTime = 20
我的测试Demo:
public class Main {
private Tortoise tor = new Tortoise();
private Rabbit rab = new Rabbit();
private Timer tim1 = new Timer();
private Timer tim2 = new Timer();
public static void main(String[] args) {
Thread.currentThread().setName("Main Thread");
Main m = new Main();
for ( int i = 0; i < 1000000; i++ ){
m.tor.run();
m.rab.run();
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Tortoise 和 Rabbit类内容一样的,如下。
public class Tortoise{
private static int count = 0;
private static long length = 0; // 跑的距离
public void run(){
doIt();
}
public void doIt(){
count++;
length++;
}
public long getLen(){
return length;
}
}
结果统计出来的,
com/fishwasser/main/Rabbit:doIt:14 1 5 5
com/fishwasser/main/Tortoise:doIt:14 1 2 2
com/fishwasser/main/Tortoise:run:9 1 0 0
com/fishwasser/main/Rabbit:run:9 1 0 0
首先所有的doIt() 都是run()调用的,应该一样多啊; 其次,怎么可能执行次数这么小啊?
是不是我有地方理解错了,欢迎指教!!
谢谢
对于throw后catch的路径,end代码被调用了多次,也就是pop了多次,虽然会比较start时存入的methodId(foo),对于不相等的,则不上报。但是已经pop出来的,却没有再push回去,会导致整个堆栈均无法正确end,导致错乱,只有等这一波堆栈全pop出来后重新来一次。
foo() {
(start_foo)
try {
(end_foo_1)
throw e;
} catch (e) {
}
(end_foo_2)
return ;
}
对于sql慢速日志,sql由于固定在一个特定的方法里,而且不会存在窃套,其实堆栈深度最大也就1,而且使用了独立的堆栈,问题倒不大。
相关代码:
ProfMethodAdapter. visitInsn(insn) :74
case Opcodes.RETURN:
case Opcodes.ATHROW:
this.visitLdcInsn(mMethodId);
this.visitMethodInsn(INVOKESTATIC, "com/taobao/profile/Profiler", "End", "(I)V");
break;
Profiler. End(methodId): 116
thrData.stackNum--;
long[] frameData = thrData.stackFrame.pop();
long id = frameData[0];
if (methodId != id) {
return;
}
能扩展用于android代码中方法被调用次数及时间?
-rw-r--r-- 1 root root 0 Apr 22 17:27 ../dist/tmethod.log
-rw-r--r-- 1 root root 287 Apr 22 17:38 ../dist/tprofiler.log
-rw-r--r-- 1 root root 2660414 Apr 22 17:38 ../dist/tsampler.log
tprofiler.log里的数据,会多出很多的等号;应该是方法没执行导致的,可否过滤一下,没执行就不要输出等号了;谢谢!
线程ID 线程栈深度 方法ID 方法执行时间
》23 0 149 1464000
》=
》=
》=
参数是加在resin.sh里面的:
exec
在innersocketThread里面加了print,看上去是已经启动成功了,但是serversocket就是连不上。
同一台机器用一个java application做测试就可以:
java -javaagent:/home/java/test/tprofiler.jar -Dprofile.properties=/home/java/test/profile.properties com.dx.test.TestDate
开始使用了一个不存在的目录来存放日志,结果发现日志无法打印,之后尝试使用一个以存在的目录存放日志,可以正常输出日志。
如果重启应用,tmethod.log中的id重新生成,和tprofiler.log历史数据就对应不上了
需要tmethod.log具备日滚功能
I used "java -cp tprofiler.jar com.taobao.profile.analysis.SamplerLogAnalysis logs/tsampler.log logs/tmethod.log thread.log" to create analyse text for Thread dump log but found"^M" as line spliter. Maybe it should be "\r\n" instead of "\n".
应用重启后,日志被覆盖,不能续写
您好,如果在linux上用jsvc方式启动tomcat 如何配置 Tprofile 这步呢 在 jvm 启动参数中添加-javaagent:/path/tprofiler.jar -Dprofile.properties=/path/profile.properties 希望高手告知
startProfTime = 00:00:00
endProfTime = 24:00:00
eachProfUseTime = 5
eachProfIntervalTime = 0
samplerIntervalTime = 20
port = 50000
debugMode = false
needNanoTime = false
ignoreGetSetMethod = true
logFilePath = ../tprofiler/tprofiler.log
methodFilePath = ../tprofiler/tmethod.log
samplerFilePath = ../tprofiler/tsampler.log
excludeClassLoader = org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader
includePackageStartsWith = com.xxx
excludePackageStartsWith =
系统刚刚启动,消耗内存不到500MB,此时执行
D:\bin\TProfiler-master\pkg\TProfiler\lib>java -Xms1000m -Xmx1000m -XX:PermSize=256M -XX:MaxPermSize=256m -cp tprofiler-1.0.1.jar com.taobao.profile.client.TProfilerClient 127.0.0.1 50000 status
会出现OOM错误
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuffer.append(Unknown Source)
at com.taobao.profile.client.TProfilerClient.read(TProfilerClient.java:150)
at com.taobao.profile.client.TProfilerClient.getStatus(TProfilerClient.java:118)
at com.taobao.profile.client.TProfilerClient.status(TProfilerClient.java:57)
at com.taobao.profile.client.TProfilerClient.main(TProfilerClient.java:172)
配置文件如下:
logFileName = tprofiler.log
methodFileName = tmethod.log
samplerFileName = tsampler.log
startProfTime = 13:47:00
endProfTime = 13:49:00
eachProfUseTime = 30
eachProfIntervalTime = 0
samplerIntervalTime = 0
port = 50000
debugMode = true
needNanoTime = false
ignoreGetSetMethod = true
logFilePath = D:/bin/TProfiler-master/logs/${logFileName}
methodFilePath = D:/bin/TProfiler-master/logs/${methodFileName}
samplerFilePath = D:/bin/TProfiler-master/logs/${samplerFileName}
excludeClassLoader = org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader
includePackageStartsWith = com.taobao
excludePackageStartsWith = com.taobao.sketch;org.apache.velocity;com.alibaba;com.taobao.forest.domain.dataobject;org;net
java.lang.ArrayIndexOutOfBoundsException: 52264
at org.objectweb.asm.ClassReader.readClass(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at com.taobao.profile.instrument.ProfTransformer.transform(ProfTransformer.java:55)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
主分支克隆后。执行命令mvn assembly:assembly
配置好配置后发现:
Failed to find Premain-Class manifest attribute in /home/friddle/bin/tprofiler.jar
解压Jar果断发现META-INF/MANIFEST.MF
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: friddle
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_111
并没有Premain-Class属性。
系统:Linux friddle 4.4.0-3-deepin-amd64 #1 SMP Deepin 4.4.30-2 (2016-12-01) x86_64 GNU/Linux
java版本:
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
maven版本:
Apache Maven 3.3.9
Maven home: /usr/share/maven
Java version: 1.8.0_111, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.4.0-3-deepin-amd64", arch: "amd64", family: "unix"
Latest commit de8abe9 on 12 May 2014
阿里是不是已经不再维护这个项目了,放弃了吗?
应用本身依赖低版本ASM导致启动失败问题
项目依赖的cglib引用的asm是1.5的
启动时抛异常
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.(Z)V
step1:修改profile.properties文件中的日志文件格式,增加,程序中会将替换为实际的pid
logFilePath = E:/Dropbox/code/java_workspace/jvmDemo/src/tprofiler_.log
methodFilePath = E:/Dropbox/code/java_workspace/jvmDemo/src/tmethod_.log
samplerFilePath = E:/Dropbox/code/java_workspace/jvmDemo/src/tsampler_.log
step2:在Manager.java中增加下面两个方法
private void initPID(){
String processName = java.lang.management.ManagementFactory.getRuntimeMXBean().getName();
pid = processName.split("@")[0];
}
public String getPID(){
if(pid==null){
this.initPID();
}
return pid;
}
step3:修改ProfConfig.java中下面三个方法
public void setLogFilePath(String logFilePath) {
this.logFilePath = logFilePath.replace("", Manager.instance().getPID());
}
public void setMethodFilePath(String methodFilePath) {
this.methodFilePath = methodFilePath.replace("", Manager.instance().getPID());
}
public void setSamplerFilePath(String samplerFilePath) {
this.samplerFilePath = samplerFilePath.replace("", Manager.instance().getPID());
}
step4:输出日志文件名:
tprofiler_5728.log
tsampler_5728.log
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.