在jvm中,内存分为方法区,虚拟机栈,堆,本地方法栈,程序计数器
- 方法区:很少产生垃圾回收,线程共享,用来加载类的常量,类的信息。
- 虚拟机栈:存储局部变量表,操作数栈,线程私有
- 本地方法栈:只为Native方法服务
- 堆:几乎所有对象在这里创建,所有线程共享,垃圾回收频率很高
- 程序计数器:通过改变这个计数值可以选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成
内存分配策略
- 对象优先在堆的Eden区分配。
- 大对象直接进入老年代。
- 长期存活的对象将直接进入老年代。
- 当Eden区没有足够的空间进行分配时,虚拟机会执行一次Minor GC.Minor GC通常发生在新生代的Eden区,在这个区的对象生存期短,往往发生GC的频率较高,回收速度比较快;Full Gc/Major GC 发生在老年代。
- 大于15岁进入老年代,每经历一次Minor GC年龄+1
- 区中相同年龄所有对象的大小的总和大于总空间的一半,年龄大于等于该年龄则进入老年代