JVM原理
- 1、概念简介
- 2、为什么要学习JVM虚拟机?
- 3、JVM怎么学?
- 3.1 内存管理
- 1、jvm运行时数据区
1、概念简介
- JVM:JAVA虚拟机
- JRE:Java运行环境
JRE=JVM虚拟机+Java核心类库+支持文件 - JDK:Java开发工具包
JDK=JRE+Java工具+Java类库
2、为什么要学习JVM虚拟机?
- 面试
- 提供性能,排除问题
- 写更好的程序代码
3、JVM怎么学?
3.1 内存管理
- jvm运行时数据区
- jvm内存模型
- jvm内存回收
1、jvm运行时数据区
- 程序计算器
指向当前线程正在执行的字节码指令的地址(行号)
作用:线程容易被中断。 - 虚拟机栈
虚拟机栈:存储当前线程运行方式时所需要的数据,指令,返回地址。
栈帧:一个方法的运行空间
-Xss:每个线程的栈大小。
栈:先进后出,入栈和出栈只有一个出口
将局部变量,算法,返回值进行入栈出栈。
- 本地方法栈
其实就是虚拟机栈
本地方法栈和虚拟机栈类似
本地方法栈存储的是native方法,例如hashCode()方法。 - 堆
存放所有的对象实例和数组
设置参数:启动时分配的内存大小-xms,xmx - 方法区
类信息
静态变量
常量
2、说下JVM运行时数据区
不同虚拟机的运行时数据区可能略微有所不同,但是会遵守Java虚拟机规范,Java虚拟机规范规定的区域分为以下5个部分:
程序计算器:Program Counter Register,当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能,都需要依赖这个计数器来完成。
Java虚拟机栈Java Virtual Machine Stacks,用于存储局部变量表,操作数栈,动态链接,方法出口灯信息。
本地方法栈Native Method Stack:与虚拟机栈的作用是一样的,只不过虚拟机栈是服务Java方法的,而本地方法栈是为虚拟机调用Native方法服务的。
Java堆Java Heap:Java虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象的实例都在这里分配内存。
方法区:Method Area,用户存储已被虚拟机加载的类信息,常量,静态常量,即时编译后的代码等数据。
共享数据区包括堆和方法区。
JMM的概念
多线程数据共享
永久代这里是指方法区,也叫做元数据
注意新生代与老生代的比例
Eden与from、to的比例
新生代内存不足的时候会触发GC
老年代是存放应用程序中生命周期长的数据。
2次 GC不能清理的数据,先移动到from区,再经过5GC,移动到to区,再经过10次GC仍然无法释放,那么数据被移动到老年代。
jconsole.exe的使用
判断不可达就会被回收GC
内存泄漏和内存溢出的辨析
下面这个是内存溢出:
线程执行完了,区域的数据对象还无法释放就是内存泄漏
没有下面的红色框内的代码就会出现内存泄漏。
测试题:结果是false