JVM实现原理

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:每个线程的栈大小。

JVM实现原理_第1张图片
栈:先进后出,入栈和出栈只有一个出口
JVM实现原理_第2张图片
将局部变量,算法,返回值进行入栈出栈。

  • 本地方法栈
    其实就是虚拟机栈
    本地方法栈和虚拟机栈类似
    本地方法栈存储的是native方法,例如hashCode()方法。

  • 存放所有的对象实例和数组
    设置参数:启动时分配的内存大小-xms,xmx
  • 方法区
    类信息
    静态变量
    常量

JVM实现原理_第3张图片
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的概念
多线程数据共享
永久代这里是指方法区,也叫做元数据
JVM实现原理_第4张图片
JVM实现原理_第5张图片
注意新生代与老生代的比例
Eden与from、to的比例
JVM实现原理_第6张图片
JVM实现原理_第7张图片
新生代内存不足的时候会触发GC
JVM实现原理_第8张图片
老年代是存放应用程序中生命周期长的数据。
2次 GC不能清理的数据,先移动到from区,再经过5GC,移动到to区,再经过10次GC仍然无法释放,那么数据被移动到老年代。
JVM实现原理_第9张图片
jconsole.exe的使用
JVM实现原理_第10张图片
判断不可达就会被回收GC
JVM实现原理_第11张图片
内存泄漏和内存溢出的辨析
下面这个是内存溢出:
JVM实现原理_第12张图片
线程执行完了,区域的数据对象还无法释放就是内存泄漏
JVM实现原理_第13张图片
没有下面的红色框内的代码就会出现内存泄漏。

JVM实现原理_第14张图片
测试题:结果是false
JVM实现原理_第15张图片

JVM实现原理_第16张图片

你可能感兴趣的:(JVM)