jvm内存

作者: 丷羽丷 | 来源:发表于2016-10-05 20:15 被阅读0次
    栈(Stack):先进后出

    存放方法的局部变量的内存空间,每个方法都会分配一块空间Frame,方法一旦执行完成,Frame被销毁,对于原始类型,变量的值也保存在Stack里面,对于引用类型,Stack里面保存的是指向对象的内存地址(引用);

     它是线程私有的,生命周期与线程相同。
    
    堆(leap):

    存放Object
    Java Heap是Java虚拟机所管理的内存中最大的一块,它是所有线程共享的一块内存区域。几乎所有的对象实例和数组都在这类分配内存。Java Heap是垃圾收集器管理的主要区域;
    Java是传值得,不是传引用;

    方法区

    被所有线程共享区域,用于存放已被虚拟机加载的类信息,常量,静态变量等数据。被Java虚拟机描述为堆的一个逻辑部分。

    栈与堆比较

    栈是运行时的单位,而堆是存储的单位。栈解决程序的运行问题,即程序如何执行;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。在Java中一个线程就会相应有一个线程栈与之对应,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈。而堆则是所有线程共享的。对象存放在堆中,对象引用和基本类型存放在栈中;对象的属性存放在堆中,对象的方法存在栈中。程序运行永远都是在栈中进行的,因而参数传递时,只存在传递基本类型和对象引用的问题。不会直接传对象本身。

      如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。
      如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。
    
    GC(Garbage Collection)垃圾收集器

    局部变量方法执行完后内存马上回收;
    Heap里面的对象由GC自动回收;
    GC维护和检测对象引用,引用数为0的对象会被回收;
    GC并不是实时回收内存的;
    可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

    相关文章

      网友评论

          本文标题:jvm内存

          本文链接:https://www.haomeiwen.com/subject/mjzsyttx.html