透明 发表于 2015-1-18 11:31:44

JAVA编程:静态及时跟踪你的java程序仓酷云

Java编译的是字节码,跟C++相反,启动不够快,效率不够高,难以精确控制内存,但是优点是编程比C++容易,代码比较安全但是容易留下性能隐患,跨平台靠字节码在各个平台复制(一处编译到处调试)之前有写基于AOP的日记调试会商一种跟踪Java程序的办法,但不是很完善.厥后发明了Btrace,因为它借助静态字节码注进手艺,完成文雅且功效壮大.
只不外,用起来老是磕磕绊绊的,经常为了跟踪某个成绩,却花了年夜把的工夫调试Btrace的剧本.为此,我实验将几种跟踪形式固化成剧本模板,待用的时分往调剂一下正则表达式之类的.
跟踪历程常常是假定与考证的螺旋迭代历程,重复的用BTrace跟踪方针历程,总有那末几回稀里糊涂的不成用,最初不能不重启方针历程.若真是线上不克不及停的服务,我想这类体例仍是不靠谱啊.
为此,据决意本人的弄个用起来复杂,又能优秀撑持重复跟踪而不必重启方针历程的工具.
AOP

AOP是Btrace,jip1等浩瀚监测工具的中心头脑,用一段代码最简单申明:
publicvoidsay(Stringwords){Trace.enter();System.out.println(words);Trace.exit();}如上,Trace.enter()和Trace.exit()将say(words)内的代码围绕起来,对办法收支的举行切面的处置,即可猎取运转时的高低文,如:


[*]挪用栈
[*]以后线程
[*]工夫损耗
[*]参数与前往值
[*]以后实例形态
完成的选择

完成切面的体例,我晓得的有以下几种:
代办署理(粉饰器)形式

计划形式中粉饰器形式和代办署理形式,只管办理的成绩域分歧,代码完成长短常类似,都可以完成切面处置,这里视为等价.仍旧用代码申明:
interfacePerson{voidsay(Stringwords);}classOfficerimplementsPerson{publicvoidsay(Stringwords){lie(words);}privatevoidlie(Stringwords){...}}classProxyimplementsPerson{privatefinalOfficerofficer;publicProxy(Officerofficer){this.officer=officer;}publicvoidsay(Stringwords){enter();officer.say(words);exit();}privatevoidenter(){...}privatevoidexit(){...}}Personp=newProxy(newOfficer());很分明,上述enter()和exit()是完成切面的中央,经由过程猎取Officer的Proxy实例,即可对Officer实例的举动举行跟踪.这类体例完成起来最复杂,也最间接.
JavaProxy

JavaProxy是JDK内置的代办署理API,借助反射机制完成.用它来是完成切面则会是:
classProxyInvocationHandlerimplementsInvocationHandler{privatefinalObjecttarget;publicProxyInvocationHandler(Objecttarget){this.target=target;}publicObjecthandle(Objectproxy,Methodmethod,Object[]args){enter();method.invoke(target,args);exit();}privatevoidenter(){...}privatevoidexit(){...}}ClassLoaderloader=...Class<?>[]interfaces={Person.class};Personp=(Person)Proxy.newInstance(loader,interfaces,newProxyInvocationHandler(newOfficer()));比拟较上一中办法,这类不太易读,但更加通用,对详细完成依附很少.
AspectJ

AspectJ3是基于字节码操纵的AOP完成,比拟较Javaproxy,它会显得对换用更”通明”,编写更简明(相似DSL),功能更好.以下代码:
pointcutsay():execute(*say(..))before():say(){...}after():say(){...}Aspectj完成切面的机会有两种:静态编译和类加载期编织(load-timeweaving).而且它对IDE的撑持很丰厚.
CGlib

与AspectJ一样CGlib4也是操纵字节码来完成AOP的,利用上与JavaProxy十分类似,只是不像JavaProxy对接口有依附,我们熟知的Spring,Guice之类的IoC容器完成AOP都是利用它来完成的.
classCallbackimplementsMethodInterceptor{publicObjectintercept(Objectobj,java.lang.reflect.Methodmethod,Object[]args,MethodProxyproxy)throwsThrowable{enter();proxy.invokeSuper(obj,args);exit();}privatevoidenter(){...}privatevoidexit(){...}}Enhancere=newEnhancer();e.setSuperclass(Officer.class);e.setCallback(newCallback());Personp=e.create();字节码利用

下面四种办法各有合用的场景,但惟独对运转着的Java历程举行静态的跟踪撑持不了,固然大概是我懂得的不敷深切,如有基于上述计划的举措还请不惜见教.
仍是回到Btrace5的思绪下去,在了解了它借助java.lang.Instrumentation举行字节码注进的完成道理6后,完成静态变更跟踪体例或方针应当没有成绩.
借上去的成绩,怎样操纵(注进)字节码完成切面的处置.可喜的是,“构建本人的监测工具”7一文给我供应了一个很好的切进点.在此基本上,经由一些对ASM8的深切研讨,能够完成:


[*]办法挪用进进时,猎取以后实例(this)和参数值列表;
[*]办法挪用进来时,猎取前往值;
[*]办法非常抛出时,触发还调并猎取非常实例.
其切面完成的中心代码以下:
privatestaticclassProbeMethodAdapterextendsAdviceAdapter{protectedProbeMethodAdapter(MethodVisitormv,intaccess,Stringname,Stringdesc,StringclassName){super(mv,access,name,desc);start=newLabel();end=newLabel();methodName=name;this.className=className;}@OverridepublicvoidvisitMaxs(intmaxStack,intmaxLocals){mark(end);catchException(start,end,Type.getType(Throwable.class));dup();push(className);push(methodName);push(methodDesc);loadThis();invokeStatic(Probe.TYPE,Probe.EXIT);visitInsn(ATHROW);super.visitMaxs(maxStack,maxLocals);}@OverrideprotectedvoidonMethodEnter(){push(className);push(methodName);push(methodDesc);loadThis();loadArgArray();invokeStatic(Probe.TYPE,Probe.ENTRY);mark(start);}@OverrideprotectedvoidonMethodExit(intopcode){if(opcode==ATHROW)return;//donothing,@seevisitMaxprepareResultBy(opcode);push(className);push(methodName);push(methodDesc);loadThis();invokeStatic(Probe.TYPE,Probe.EXIT);}privatevoidprepareResultBy(intopcode){if(opcode==RETURN){//voidpush((Type)null);}elseif(opcode==ARETURN){//objectdup();}else{if(opcode==LRETURN||opcode==DRETURN){//longordoubledup2();}else{dup();}box(Type.getReturnType(methodDesc));}}privatefinalStringclassName;privatefinalStringmethodName;privatefinalLabelstart;privatefinalLabelend;}更多参考请见这里的Demo,它是javaagent,在陪伴宿主历程启动后,供应MBean可用jconsole举行静态跟踪的办理.
后续的偏向


[*]供应基于Web的远程交互界面;
[*]供应基于Shell的当地命令行接口;
[*]供应Profile统计和趋向输入;
[*]供应跟踪日记定位与剖析.
参考


[*]TheJavaInteractiveProfiler
[*]ProxyJavadoc
[*]Aspectj
[*]CGlib
[*]BTraceUser’sGuide
[*]java静态跟踪剖析工具BTrace完成道理
[*]构建本人的监测工具
[*]ASMGuide
[*]经常使用JavaProfiling工具的剖析与对照
[*]AOP@Work:PerformancemonitoringwithAspectJ
[*]TheJavaTMVirtualMachineSpecification
[*]来自rednaxelafx的JVM分享,他的Blog
[*]BCEL

没有那个大公司会傻了吧唧用.net网页编程开发大型项目,开发了,那等于自己一半的生命线被微软握着呢。而.net网页编程不行,限制在window系统,又是捆绑,鄙视微软之!

飘灵儿 发表于 2015-1-21 09:34:14

关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。

飘飘悠悠 发表于 2015-1-30 13:35:22

接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。

爱飞 发表于 2015-2-6 12:51:38

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

不帅 发表于 2015-2-7 02:42:15

设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧

冷月葬花魂 发表于 2015-2-7 08:27:03

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

分手快乐 发表于 2015-2-15 12:00:32

Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。

简单生活 发表于 2015-2-25 00:50:08

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

金色的骷髅 发表于 2015-3-7 14:50:40

是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言

第二个灵魂 发表于 2015-3-8 19:23:25

多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

小女巫 发表于 2015-3-16 12:12:03

Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台

再见西城 发表于 2015-3-17 00:06:58

是一种为 Internet发展的计算机语言

灵魂腐蚀 发表于 2015-3-23 07:32:35

是一种语言,用以产生「小应用程序(Applet(s))

谁可相欹 发表于 2015-3-27 11:11:03

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

乐观 发表于 2015-6-14 01:18:27

有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)

深爱那片海 发表于 2015-6-27 08:08:56

Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

活着的死人 发表于 2015-7-17 23:02:20

Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)

海妖 发表于 2015-10-14 19:32:41

http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。

莫相离 发表于 2015-10-16 20:22:04

是一种为 Internet发展的计算机语言

小魔女 发表于 2015-10-17 07:06:57

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
页: [1] 2
查看完整版本: JAVA编程:静态及时跟踪你的java程序仓酷云