日期:2014-05-20  浏览次数:20573 次

谁有那个深入分析基于寄存器和基于栈的虚拟机的文章啊?
找了好久啊没找到, 郁闷啊郁闷

------解决方案--------------------
楼主,你找到了发我一份,
healer_kx@163.com

游戏脚本编程一书里面讲的还是很详细的,要想弄这个,很细节的东西,买本书吧。

------解决方案--------------------
我也想看看。贴出来惠及大众吧。
------解决方案--------------------
用JVM知识解释几个简单的技术问题 

例如,对象可以直接访问实例数据和局部变量,这是因为如果将实例数据单独放在对象池中,此时,一个对象引用,也就是一个指向句柄池的指针,可以通过“指向对象池的指针”来访问实例数据,如果实例数据和“指向类数据的指针”放在一起,此时,一个对象引用,也就是一个指向堆的指针,可以直接通过这个“指向堆的指针”来访问实例数据,堆用来存放程序在运行时创建的所有类实例或数组,在第一种设计中,句柄池和对象池都属于堆,因此可以看出,这两种方式在本质上是一样的,只是一种方式是将堆分开进行计算,而另一种方式没有分开,所以,无论是哪种设计,对象都可以直接访问实例数据和局部变量,但是,对于类数据和方法数据,无论是哪种设计,它们都存放于方法区中,只有“指向类数据的指针”才能访问方法区,所以,无论是哪种设计,对象都必须通过一个间接的方式去访问类数据和方法数据。 
再比如,一个类实例要转换成另一个类实例,它不能是另一个类实例的父类,这是因为在Java虚拟机设计中,类的加载顺序是按照从本类、父类直到启动类的顺序依次向上加载上去的,如果一个类实例在转换成另一个类实例时它是另一个类实例的父类,那么,这种加载原则是必会减少所加载的类的个数,影响程序的访问权限,这显然是与程序设计的原则相违背的。 
还有,假如当一个用户去点击一个提交按钮后,将产生一个线程,每一个用户去点击这个提交按钮就相当于这个线程多次去调用同一个Java方法,这就相当于每次在Java栈中压入一个新帧,而帧是用来存储参数、局部变量和中间运算结果的,因此,每次方法调用都不会相同,得到的结果,如果保存在对象中将放在堆上,如果保存在类变量中将放在方法区上,此时,无论是句柄池和对象池都属于堆还是实例数据和“指向类数据的指针”放在一起,都是一个对象指针去访问一个堆,再通过被访问的堆中指向类数据的指针去访问类数据,因此,有可能就会出现多线程下访问同一个堆的同步问题,一般采取对象锁机制去解决这样的问题,对象锁就相当于给同一个房子里的十个人只一把钥匙,而任意一个时刻只有一个人才能拥有这把钥匙进入房子,而其他人只能等待直到有钥匙的这个人将钥匙交给了下一人为止,对象锁正是通过这种将时间进行线性控制的方法来解决“多线程下访问同一个堆的同步问题”的,之所以要采用这种排队方式那是因为每当线程调用一个Java方法时虚拟机都会在该线程的Java栈中压入一个新帧,而Java栈只支持出栈和压栈操作。
------解决方案--------------------
有空的话可以去买一本深入JAVA虚拟机看看 不过那本书看得挺吃力的
------解决方案--------------------
《深入Java虚拟机》推荐