一次velocity异常的分析
一.现象
最近在使用velocity模板的时候RuntimeInstance的1103行代码出现了NPE,如下图所示
该行代码一直在抛NPE。
最近在使用velocity模板的时候RuntimeInstance的1103行代码出现了NPE,如下图所示
该行代码一直在抛NPE。
最近看见公司一位前辈有分享JVM相关的知识,自己特地从跑过去听了一下,感觉讲的不是很深入,但是相对来说还是不错的,本文就自己听到的一些东西做一个简单的总结。平时我们大多数都是用JAVA写代码,很多人学JAVA都是从HelloWorld开始,但是从你写HelloWorld代码到最终输出HelloWorld到底发生那些事情呢?要想清楚的回答这个问题,并不是很容易,你需要对JVM有一个清晰的了解后,才能说清楚这个问题,这只是一个引子,本文也不去挑战这个问题,这里主要记录一下自己从这个分享中听到的一些感兴趣的东西。
ASM这个字节码处理框架,不仅能够读字节码,而且还能修改字节码,我们经常是先写好JAVA代码,然后编译(IDE或者javac)生成class文件,最后classloader再把相应的class文件加载到内存,但是有了ASM后,我们可以直接使用ASM生成class文件的字节数组,即面向字节码写JAVA代码,这样可以让JVM动态去加载一个类,但是这个类的class文件并不存在磁盘上,也就是说这个类的class文件是在内存中构建出来的。
JAVA代码中的每个方法都会被编译成一系列的JVM字节码指令,这些字节码指令会被JVM所执行,从而产生相应的数据,我们通常可以用javap -verbose来查看一个方法的字节码指令。
我们在JAVA代码中创建一个线程,这线程在系统中会经历下面5个阶段:
New->Runnable->Blocked->Running->Dead
最近各种中间件升级的事情,升级中间件可能会出现很多诡异的问题,此时我们需要定位这些问题是自己升级导致还是其他原因导致,升级中间件可能会出现很多JAR包冲突的问题,此时需要一一排查。
今天在升级一个监控的中间件时,发现必须升级ibatis的版本到2.3.4,原来ibatis的版本是2.3.0,升级后,发现sqlmap的解析出问题了,对于parameterMap这个标签解析出错,原因是parameterMap对应class没法实例化,为什么原来没有问题,升级后就有问题了呢?这时候只能怀疑版本的问题,2.3.4和2.3.0在解析parameterMap时有所不同。
HBase是面向列的存储数据的,最终的存储单元都是KeyValue的结构,HBase本身也定义了一个KeyValue的类型,这是HBase数据存储的基本类型。那么KeyValue本身会存储那些信息呢?
我们平时写的JAVA代码经过编译后就是class文件,class文件其实有非常严谨的结构,具体可以参考JVM class文件格式规范,认真读完这个规范,只要你按照这个规范来解析class文件,你就一定能写个javap出来。
最近在解析JAVA字节码的时候,发现常量池中常量编号不连续了,导致解析程序经常NPE,然后仔细测试了一下,发现常量类型如果是Long或者Double的话,就会导致常量池中常量的编号不连续了。