JDK
Java Development kit (java开发工具 一般内置jre)
JRE
Java Runtime Environment(Java运行时环境,包含JVM)
JVM
Java Virtual Machine(Java虚拟机,将java的class字节码文件翻译成二进制可执行程序)
例子
cmd命令行 运行java XXX.Class的时候,先类加载,然后Java运行时数据区,再然后字节码执行引擎.
内存模型
帧栈
- java程序运行的时候,一个方法对应一个帧栈,每个方法里面的局部变量存放在帧栈之中.
- Java虚拟机会给每个线程分配独立的栈内存区域 来存放帧栈
- FILO 先进后出
- 帧栈内部主要包含局部变量表,操作数栈,动态链接,方法出口等信息
- 帧栈在Java虚拟机栈中分配
局部变量表
存放局部变量
如果局部变量为对象,则该内存区域存放的是该对象在堆中的地址,也就是说,栈中会存放堆中对象的地址操作数栈
存放操作数,把操作数赋值给局部变量,从局部变量装载操作数程序计数器
每运行完一行代码,字节码执行引擎都会修改程序计数器的值.
作用:CPU多线程切换的时候,能根据程序计数器的值确定程序从哪里开始方法区(永久代&&元空间)
存放常量,静态变量,类信息
静态变量如果为对象,对象存放在堆中,所以静态变量会存放对象在堆中的地址,也就是方法区会存放堆中对象的地址
本地方法栈
本地方法在运行过程中需要的栈空间,本地方法主要是为了和c语言的库兼容,属于历史遗留问题.
!Important Java堆
年轻代(1/3)
Eden区(8/10)
new出来的对象一般放在Eden区,Eden区满了进行minnor gc,收集清理垃圾对象
第一次 gc过后还存活的对象 会被用复制算法 复制到survivor from区 同时对象GC分代年龄加1
第二次 gc会清理Eden区 和from区 还存活的对象 会被复制算法 复制到survivor to区 同时对象GC分代年龄+1
后面的gc与第二次类似 to区和from区会被交替清理
当对象的GC分代年龄等于15时,会被移动到老年代
当suivivor from区或者to 区放不下的时候 会被移动到老年代
大对象会被直接移动到老年代
动态年龄判断: 当对象的年龄从小到大累加超过50%的时候 从超过的哪个开始 以及它后面比它年龄大的对象 都要晋升
老年代放不下 则进行full gc
full gc的时候 会stw(stop the world) (Java虚拟机调优的目的就是减少stw)
当执行Full GC后空间仍然不足 则内存溢出 报OutOfMemoryError错误
执行minor gc的时候 放满的那一秒的对象依然被引用 所以会产生60mb的垃圾 移动到survivor区
下一次minor gc的时候 eden区和survivor区都会被清理 所以最后还是只剩下60mb垃圾
所以 在设置Java虚拟机的时候 最好不要让放满的那一秒产生的垃圾 大于survivor 0区或者1区的一半,不然,垃圾
会直接通过动态年龄判断,晋升到老年代