jvm堆栈

来源:互联网 发布:房贷利率上调 知乎 编辑:程序博客网 时间:2024/06/04 19:53

    jvm是基于堆栈的虚拟机,堆和栈都是java中用来存储数据的地方.
(1)堆的特点:

       每个java应用进程(一个main线程以及它的子线程)对应一个堆,堆的大小可以通过参数-xms,-xmx来设置。 java中所有通过new出来的对象和数组都存在堆中,可以为各线程共享,堆中的内存空间通过垃圾回收器进行回收。
(2)栈的特点:

       栈是线程私有的,栈的生命周期就是线程的生命周期,可以通过-Xss来分配每个线程的栈空间,如果某个线程的栈空间不足,系统会抛StackOverFlowError异常。栈中是以栈帧为单位进行维护的,java中每次调用以方法就会创建一个栈帧,用于存储局部变量区,操作数,等,所以可以说,java中方法的调用过程,其实就是对栈的操作过程(分为压栈和出栈)。基本类型(如short,int...)和对象的引用的保存在栈中,由于这些数据都有已知的固定的大小,栈中的存取速度较快,栈还有一个特点,就是存在栈中的数据可以共享,而堆却不可以,共享的意思就是讲相同的数据可以共用同一内存块。对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。栈以帧为单位保存线程的状态。JVM对栈只进行两种操作:以帧为单位的压栈和出栈操作。

这两个共享的意思不一样,栈中的共享是当前线程中一个栈中的元素的引用可以被另一个元素使用,同指向一个内存。而堆中的数据确不能互相使用,但是堆可以被其他线程使用这块内存。(堆中定义的数据不可共享,其他线程可以共享这个堆因为堆只有一个所以栈内存都是使用这个堆。栈是线程的私有变量,不能被其他线程使用,但是同一个栈中是数据可以共享)


原创粉丝点击