一.JVM 内存模型
jvm 分为三部曲 :类加载 -> 运行数据区->执行引擎
堆和方法区属于共享区域
程序计数器,本地方法栈,java栈 独享栈,每个java 线程都有一套
(a).java 栈
栈内部解析:方法栈帧,局部变量表,操作数栈,动态连接(实现类连接接口),方法出口
堆:分为年代代(1/3):老年代(2/3):永久代(直接内存,jdk1.8之后叫做元空间 单独的一块虚拟机内存)
GC 分为轻GC(年轻代) 和FullGC(老年代) ,java 调优目的让fullGC 次数变少,时间越来越短;
年轻代分为 一个eden(伊甸区) 和两个 survivor(幸存者)区域 比例 8:1:1,年轻代每次轻GC 会使用复制算法 进行垃圾回收把eden清空,把幸存的放入 survior(from)空间,再一次gc 把eden 清空,survior(from)空间放入survior(to)空间,然后from变为to,to变为from,**大概轮询15次 (默认的,可以调整)**之后放入 老年代.,如果new 对象很大 会直接放入老年代.
方法区(逻辑概念) 元空间《1.8之后》之前叫做永久代对jvm规范在方法区的实现,可以理解是相等的(但是实际不是)
** 可以理解为元空间《1.8》之前叫做 永久代《1.8之前》** 分为2048个小的空间,实际大小根据内存大小来 一半是 1-4M 左右
fullGC(早期) 如果开始 会 STW(stop the woker) 把整体java 虚拟机线程停止, 专门进行垃圾收集;
JIT(just in time) :在Java编程语言和环境中,即时编译器(JIT compiler,just-in-time compiler)是一个把Java的字节码(包括需要被解释的指令的程序)转换成可以直接发送给处理器的指令的程序(一次性翻译目标机器代码1010… )放在内存里。
字节码解释器:一行一行翻译(很慢) 翻译目标机器代码1010…
mixed mode:JIT+字节码解释器 ,如果一个类的字节码 第一次执行会使用字节码解释器 如果超过15次之后就会JIT全部翻译.