本文主要根据JDK1.8讲解JVM虚拟机
JVM运行时内存区域
从上图我们可以看到JVM在运行时的
一、JVM虚拟机数据区域分为
1器 2栈 1堆
器(程序计数器 线程数据共享)
每个线程一块、指向线程执行的当前行号,如果方法为Native方法,那么其值为null
本地方法栈( 线程数据共享)
本地方法栈存放的是虚拟机使用到的Native方法
java虚拟机栈(线程数据共享)
存放一些常用变量的常量、以及存放一些方法。
线程私有每个线程对应一个Java虚拟机栈,其生命周期与线程同步。每个Java方法在被调用的时候都会创建一个栈桢,并入栈。一旦完成调用,则出栈,线程也就结束完成了任务。
堆
堆是用占用内存最大的一块区域,用于存放对象的示例,几乎所有对象和数组都在堆上进行分配,JDK1.7之后字符串常量从永久代中剥离出来,存放在堆中。
二、堆内存分配
堆内存分配从上图我们可以看出 堆内存分为
年轻代、老年代、直接内存
年轻代占用堆内存3分之1 、老年代占用堆内存3分之2
- 年轻代(1/3)
年轻代里面又细分 Eden(中心体)占用年轻代的10分之8的空间。余下的10分之2是幸存空间。幸存空间存在的意义是为了减少被送到老年代的对象,减少Full Gc的发生。- 老年代空间(2/3)
在年轻代经历了16次MinorGC回收、依旧保留的或者的对象。老年代采用MajorGC或者FullGC。
网友评论