JVM内存模型
Young(年轻代)
Tenured(老年代)
Perm(永久代)
Young(年轻代)可以分为Eden和两个Survivor(from,to)。新的实例先放到Eden区,Survivor作为Young和Tenured的缓冲,可以向Tenured转移活动的对象实例.
Tenured老年代存储的是生命周期比较久的实例对象,对象照样会被回收
堆是Young和Tenured共同组成的(默认新生代和老年代内存倒下是1:2)
Perm属于非堆内存,属于方法区用于存放加载的class信息,不会触发回收机制
JVM结构
JVM内部分为堆、方法区、虚拟机栈、本地方法栈、程序计数器PC。
1.方法区(静态区):
方法区(Method Area)包类信息(方法、字段、接口、修饰符、类名)和静态变量,方法区是线程共享。当你创建或者访问class时使用的是同一个class类信息。方法区里面还存储了运行时常量池,保存了程序编译器生成的各种字面量和符号引用。
2.堆:
堆(Heap)包含了实例对象和数组对象,堆由垃圾回收器自动回收,堆是线程共享的,堆的内存空间既可以固定大小也可以动态地调整。
堆分为两大块新生代和老年代,对象chu产生之初在新生代,随后经过计数器到达阈值,进入老年代,并且老年代还存储新生代比较打的内存
3.虚拟机栈
虚拟机栈(VM Stack)生命周期和线程一样,线程可以共享,线程A访问线程B代入参数可以达到共享,存放方法内的变量和实例当线程执行完之后清空,不使用垃圾回收机制进行回收。
4.本地方法栈
本地方法栈(Native Method Stack)和虚拟机栈(VM Stack)是一样的,不同之处在于,调用本地方法栈不归虚拟机管理,在运行当中可能会用到本地方法栈的操作,比如需要C函数,那么会使用本地方法栈去调用,之后也会通过C函数回调java方法。
5.程序计数器
程序计数器(Program Counter Register)是一块较小的内存空间,可以把他看作当前线程执行的字节码行号指示器,就是说程序计数器里面记录的是正在执行那一条字节码指令的地址。
在多线程的情况下,程序计数器用于记录当前线程执行的位置,当线程切换回来时知道上次运行到哪里了
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。