当前位置: 代码迷 >> J2SE >> java 虚拟机 字节码,该如何处理
  详细解决方案

java 虚拟机 字节码,该如何处理

热度:483   发布时间:2016-04-23 20:04:17.0
java 虚拟机 字节码
最近在研究java虚拟机 看到javap -v class 命令查看字节码的地方 这边有一个疑问,请教下大神:
首先看一下代码

package com.djk;

public class Test3 
{
private float a =3;
}


然后javap -v 后的结果:


这次修改后的代码:
package com.djk;

public class Test3 
{
private float a =2;
}

javap -v后的结果:


仔细看2个图片的区别 ,我已经标红了。。。代码不同的地方就是初始值不一样 一个是2一个是3 为什么javap后出来的结果不一样呢?一个在常量池中有 一个没有 (大于2的都有);
还有我试下了定义int类型的 发现在常量池中都没有  为什么?
------解决思路----------------------
看了lz之后特地去试了。发现很有趣的东西。

lz写法其实有错,float的话数字后面要加f。






2看来是一个很特别的数字,你去试一下int其实同样的位置是iconst_2和bipush。

int的话不是常量池没有,应该是没在那里显示,String也是一样的。
但是double的情况又是和float的一样。




















------解决思路----------------------
这是优化问题。。不过你这个问题不懂意义在哪
看http://cs.au.dk/~mis/dOvs/jvmspec/ref-_ldc.html下面的Notes第一条
1. Where possible, its more efficient to use one of bipush, sipush, or one of the const instructions instead of ldc.
说的是bipush sipush和其他常量指令(比如你这里的fconst_2)比ldc效率更高,因为ldc需要从常量池里提取数据,所以速度慢,byte和short类型的常量一般都不会存到常量池去(也就是-32768 ~ 32767,所以你可能发现有些整数不在常量池里,但并不是所有int,你可以试试大一点的比如1234567),因为有bipush和sipush这两个效率更高的指令。至于float,0,1,2都是有对应的常量指令的,所以当然也不会到常量池去。
  相关解决方案