jvm内存

栈(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内存)