静态方法在JVM运行的原理不是很理解????

zaixiankaifa 2011-04-09 09:49:52
我是这样理解的:静态方法先在持久层加载,然后,在栈里面划分出一个方法空间给它, 然后在堆里面出现一个空间存放该静态方法的“方法首字母的地址值”,接着,在堆的另一个地方,出现一个该方法的对象?


不知道我这样理解对不对,请各位大师请教!!!
...全文
765 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hepeng_8 2011-04-09
  • 打赏
  • 举报
回复
支持二路的说法就是那样的
baobao04551 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ticmy 的回复:]

有点像,但不是你说的那样
“静态方法先在持久层加载”,不知所云

首先.class文件装载,会将class文件中的信息解析成厂商特定的数据结构,存在方法区

当调用静态方法时,会使用invokestatic指令,其参数是该类的常量池索引,该索引指向一个Method,刚开始时,这个Method也只是字符串描述,包括方法所属类名,方法名,描述符等。第一次调用该方法时,会去查找该方法在方法区……
[/Quote]

楼上回答的好,顶一个,补充两句:
LZ的问题确实不太明白,但是我想你是想弄清楚静态方法与普通方法执行时的区别吧?我觉得加载的话,楼上回答的很好了,执行的话主要有以下三点区别:
1) 用的指令不一样,静态方法用invokestatic,而普通方法有invokespecial, invokevirtual,CSR 292还新增了invokedanymic.
2)查找的方式不一样:静态方法肯定只在自己本身的class的常量区中取查找,而普通的方法还会搜索继承的类和接口。
3) 执行时带的变量不一样,这一点和C++的原理相似,就是静态方法执行时不会把本身对象压入栈作为参数,因为他不需要,而普通方法则需要本身对象(this指针)。
龙四 2011-04-09
  • 打赏
  • 举报
回复
有点像,但不是你说的那样
“静态方法先在持久层加载”,不知所云

首先.class文件装载,会将class文件中的信息解析成厂商特定的数据结构,存在方法区

当调用静态方法时,会使用invokestatic指令,其参数是该类的常量池索引,该索引指向一个Method,刚开始时,这个Method也只是字符串描述,包括方法所属类名,方法名,描述符等。第一次调用该方法时,会去查找该方法在方法区的位置,然后将常量池中该方法的地方替换成指针

至于如何去查找方法,jvm实现可能会使用方法表,如果使用方法表就简单了,如果没有用方法表,它会按照该类,超类,实现的接口的顺序去查找方法的地址

详细内容可以参考《深入Java虚拟机》第二版第八章
magicluo 2011-04-09
  • 打赏
  • 举报
回复
你不要凭空想象啦

《深入java 虚拟机(第二版)》 说的应该是非常权威了 ,推荐你看看吧

不过已经绝版,电子版的也不错
a735194357 2011-04-09
  • 打赏
  • 举报
回复
学习中……

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧