一个class文件–》Class Loader(类加载器)–》Runtime Data Area(运行时数据区)–》Execution Engine(执行引擎)或Native Interface(本地方法接口)–》本地依赖库
Class Loader:依据特定格式,加载class文件到内存(详细信息可查看,类加载相关信息)
Execution Engine:对命令进行解析
Native Interface:融合不同开发语言的原生库为Java所用
Runtime Data Area:java内存空间的结构模型
=============================================================
Runtime Data Area
- 运行时数据区
- 线程私有
- 程序计数器(PC Register)
- 本地方法栈(Native Method tack)
- 虚拟机栈(VM Stack)
- 线程共享
- 堆(Heap):GC主要区域
- 方法区(Method Area)
- 线程私有
堆区:
这里面 Head(堆区) 的结构我们需要单独抽取来讲一下,因为这一块是jvm内存最大的一块,也是GC的主要地方
如上图:主要分为两大块,堆区和非堆区。
非堆区:我们也叫Metaspace(元数据区),jdk1.8之前是没有Metaspace的,是一个叫永久代的区域。
堆区:分为年轻代和老年代,年轻代又分为Eden区和Survivo区
- 一个新的对象是在Eden区产生,在Eden区满了,会进行Minor GC后,如果对象还未死亡(还有被引用),那么会进入Survivo区。
- 在Survivo区的对象,如果在进行Minor GC时候一直未死亡,会在两个Survivo区来回拷贝。
- 每经历过一次Minor GC对象年龄会+1,当年龄达到15岁(默认的,可以修改),该对象就会进入老年代。
- 老年代的死亡对象,会在Full GC时候回收
Minor GC是很频繁的,Full GC正常情况下不会很平繁执行。理想情况,保证Full GC执行次数尽可能少,每次执行时间尽可能短。