读书人

从JVM类加载的角度分析new String(quot;quot;)

发布时间: 2012-09-01 09:33:02 作者: rapoo

从JVM类加载的角度分析new String("")问题

回来写博客了,还好,没有失言。

?

先告诉一下读者,也许我也还没能够说的够明白,因为这个问题,真的,还是很复杂的;所以没那份完整的自信。

?

回归主题。

?

先来说一下JVM中内存的几个概念。(在上一篇博文中有同学让我加点图,这里特意找来一个class文件结构图,自己画图,总是不会用画笔,哎!)


从JVM类加载的角度分析new String(
?

?

方法区(Method Area),虚拟机栈(VM Stack),堆(Heap),本地方法栈(Native Method Stack),程序计数器。

?

那么在这里,就主要介绍一下:VM Stack与Heap。

VM Stack主要存放的是局部变量表部分,而局部变量表存放了编译期可知的各种基本类型数据(boolean,byte,char,short,int,float,long,double),对象引用(reference类型)和returnAddress类型(指向字节码指令的地址)。

Heap主要存放的就是对象实例。

?

先来用个简单的而复杂的例子说明一下:

Object obj = new Object();

?

看看这段代码

?

?

以上代码是通过javap命令反编译出的class代码,而代码就是:

public class?obj {

??? Object obj = new Object();

}

?

完整命令:javap -verbose obj。(当然要先通过javac obj.java先编辑一下,再反哦)

?

再来分析一下上面的代码:

package test;public class String1 {st a = new st(1);st b = new st(1);public static void main(String args[]) {String1 cfb = new String1();if(cfb.a  == cfb.b){System.out.println("地址相等,你会相信吗?");} else{System.out.println("地址不相等.");}}class st {int b;public st(int b){this.b = b;}}}

?

最后肯定是输出不相等了。

?

?

?

最后,总结一下上面所说的,还是有些混,没有写的很清楚的感觉,也许这就是我对JVM的理解还不深的原因是,应该把类加载的过程说的更清楚。

?

最后给一个我看的博文地址:从“关于Java堆与栈的思考”一帖看错误信息的传播 作者:ZangXT

?

?

?

?

?

?

?

1 楼 jyjava 2011-12-16 无聊的问题 2 楼 ciding 2011-12-17 jyjava 写道无聊的问题
是啊,问题有点无聊,都已经让别人写过了,我还在写,还有可能写的不正确。

3 楼 ciding 2011-12-17 还有一点,应该也要说一下。

就是上面的栈存储的内容。

等我把深入理解java虚拟机给学好了,再来补写吧,现在水平还没到那个层次。

读书人网 >编程

热点推荐