java的堆与栈

来源:互联网 发布:数组一般什么时候用 编辑:程序博客网 时间:2024/04/28 07:16

a、堆


    java程序在运行时创建的所有类实例或者数组都放在堆中,一个java虚拟机实例只能有一个堆空间,因此所有的线程都共享这个堆,又由于java程序独占一个java虚拟机实例,因而每个java程序都有它自己的堆空间,它们彼此不干扰。但是一个java程序的多个线程却共享着同一个堆空间。因此需要考虑线程访问对象的同步问题了。
   堆空间也不必是连续的内存空间,在程序运行时它可以动态的扩展和收缩。只要有一个对象引用虚拟机就必须快速定位对象实例的数据。另外通过对象引用访问相应的类数据(存储于方法区的类型信息)。因此在对象中通常有一个指向方法区的指针。



b、栈


   每当启动一个新的线程的时候,java虚拟机都会为他分配一个java栈。java栈是由许多帧组成的。java虚拟机只会对Java栈执行两种操作:以帧为单位压栈或者出栈。当一个线程调用一个java方法的时候,虚拟机就会在该java行程的java栈中压入一个新帧,这个新帧就是当前帧。这个方法就是当前方法,这个方法所在的类就是当前类,当前类的常量池就是当前常量池。当前方法会跟踪当前类和当前常量池。当前帧会存储参数,局部变量,中间运行结果。
   java方法可以两种方式完成,通过return返回或者抛出异常终止。虚拟机都会将当前的帧弹出java栈然后释放掉,这样上一个方法的帧就成为当前帧。


文章来源于: <<Inside the JVM>>

0 0
原创粉丝点击