知识大全 提高代码质量及字节码如何防止内存错误[2]
Posted 字节
篇首语:亦余心之所善兮,虽九死其犹未悔。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 提高代码质量及字节码如何防止内存错误[2]相关的知识,希望对你有一定的参考价值。
Java进阶:提高代码质量及字节码如何防止内存错误[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
分析字节码提升代码质量
Java字节码的内存和安全保护无论我们是否注意都是存在地 那么我们为什么还费心查看字节码呢?在很多情况下 知道编译器如何将你的代码转换为字节码可以帮助你写出更高效的代码 而且在某些情况下可以防止不易发觉的错误 考虑下面的例子
//返回 str +str 的串连 String concat(String str String str ) return str + str ; //将 str 附加到 str void concat(StringBuffer str String str ) str append(str );
猜猜每个方法需要多少个方法调用 现在编译这些方法并且运行javap 你会得到类似下面的输出
Method java lang String concat (java lang String java lang String) new # dup invokespecial # aload_ invokevirtual # aload_ invokevirtual # invokevirtual # areturn Method void concat (java lang StringBuffer java lang String) aload_ aload_ invokevirtual # pop return
concat 方法执行了 个方法调用s: new invokespecial和三个invokevirtuals 这比concat 方法执行了更多的工作 后者只执行了一个invokevirtual调用 大多Java程序员已经得到过警告 因为String是不可变的 而使用StringBuffer进行字符串连接效率更高 使用javap分析这个使得这点变得很生动 如果你不能肯定两个语言构造在性能上是否相等 你应该使用javap分析字节码 然而 对just in time (JIT)编译器要小心 因为JIT编译器将字节码重新编译为本机代码而能执行一些javap不能揭示的附加优化 除非你有你的虚拟机的源代码 否则你应该补充你的字节码的基准性能分析
最后的一个范例展示了检查字节码如何帮助防止程序中的错误 像下面那样创建两个类 确保它们在独立的文件中
public class ChangeALot public static final boolean debug=false; public static boolean log=false;
public class EternallyConstant public static void main(String [] args) System out println( EternallyConstant beginning execution ); if (ChangeALot debug) System out println( Debug mode is on ); if (ChangeALot log) System out println( Logging mode is on );
如果你运行EternallyConstant 你会得到信息
EternallyConstant beginning execution
现在试着编辑ChangeALot 修改debug和log变量的值为true(两个都为true) 只重新编译ChangeALot 再次运行EternallyConstant 你将看到下面的输出
EternallyConstant beginning execution
Logging mode is on
debug变量怎么了?即使你将debug设置为true 信息 Debug mode is on 并没有出现 答案在字节码中 对 EternallyConstant运行javap你会看到
Method void main(java lang String[]) getstatic # ldc # invokevirtual # getstatic # ifeq getstatic # ldc # invokevirtual # return
惊奇吧!在log成员上有一个 ifeq 检查 而代码根本没有检查debug成员 因为debug成员被标记为final类型 编译器知道debug成员在运行时永远不会改变 因此它通过移除 if 声明进行优化 这确实是一个非常有用的优化 因为它允许你在程序中嵌入调试代码而在将它设置为false时不用付出运行时的代价 不幸的是这个优化能够导致主要的编译时混乱 如果你改变一个final成员 你必须记住重新编译任何可能引用该成员的类 这是因为这个 reference 可能已经经过优化了 Java开发环境不能总是发现这个微妙的相关性 一些能导致非常奇怪的错误 因此 古老的C++格言对于java环境仍然有效 When in doubt rebuild all (有疑问 重新编译所有的代码)
知道一些字节码的知识对于使用java编程的程序员都是有价值的 javap工具使得查看字节码很容易 有时候 使用javap检查你的代码以期提高性能和捕获特殊的不易察觉的错误时是没有用的
cha138/Article/program/Java/hx/201311/27208相关参考
大多Java程序员知道他们的程序通常不会被编译为本机代码而是被编译为由java虚拟机(JVM)执行的字节码格式然而很少有java程序员曾经看过字节码因为他们的工具不鼓励他们去看大多Java调试工具
Java字节码深入解析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一Java字节代码的组织形
深入讨论JAVA字节码加密技术(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这个累加载器
JScript运行时错误JScript运行时错误是指当JScript脚本试图执行一个系统不能运行的动作时导致的错误当正在运行脚本计算变量表达式或者正在动态分配内存时出现JScript运行时错误时错误号
javap是JDK自带的反汇编器可以查看java编译器为我们生成的字节码通过它我们可以对照源代码和字节码从而了解很多编译器内部的工作语法 javap[命令选项]class javap命令用于解
深入Java字节码加密 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 问 如果我把我的clas
深入讨论JAVA字节码加密技术(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如果把的cl
巧用JAVASCRIPT代码限制文本字节数 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 
用Eclipse插件提高代码质量 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 年月日 
JSP验证码代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 生成有个随机数字和杂乱背景的图片