JVM虚拟机:

概念:

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

作用:

众所周知,java代码在编写过程中需要将我们按照java编程语言编写的源码文件(Test.java)转换成 Test.class字节码文件,该文化不便于人类阅读,是用于JVM虚拟机执行用的。而JVM的价值所在就是将Test.class文件的字节码翻译为具体操作系统及硬件的指令,以便于执行;(如图)
JVM虚拟机具体实现

JVM内部模型:

JVM虚拟机具体实现
如图,jvm内部主要分为两部分(五个区域):线程共享数据区和线程隔离数据区:

线程私有数据区(3个区域):

3.1程序计数器 (Program Counter Register)特点:

1.线程私有
2.一块较小的区域
3.记录程序执行的位置,行号
4.不存在OutOfMemoryError
5.无GC回收

3.2虚拟机栈

虚拟机栈是采用了一种栈的数据结构,入口和出口只有一个,分为入栈和出栈,先进后出
方法执行就是压栈,方法执行结束就出栈

特点:

1.线程私有
2.方法执行会创建栈帧,存储局部变量表等信息
3.方法执行入虚拟机栈,方法执行完出虚拟机栈
4.栈深度大于虚拟机所允许的StackOverflowError;
5.栈需扩展而无法申请空间OutOfMemoryError;
6.栈里面运行方法,存放方法的局部变量名,变量名所指向的值(常量值,对象值等)都存放到堆上的;
7.栈一般都不设置大小,栈所占的空间其实很小,可以通过—Xss1M进行设置
8.该区域不会有GC回收

3.3本地方法栈

1.与虚拟机栈基本类似;
2.区别在于本地方法栈为Native方法服务;
3.Sun HotSpot将虚拟机栈和本地方法栈合并
4.有StackOverflowError和OutOfMemoryError;
5.GC不会回收该区域

线程私有部分的整体特征:

是线程私有的,随着线程执行结束而结束(JVM就销毁了虚拟机栈里面的栈帧),是比较有规律的,问题会少一些,出问题比较多的是线程共享的部分,也就是堆和方法区(元空间)

类加载子系统

在java虚拟机中,负责查找并装载的部分称为类装载子系统,类装载器子系统用于定位和加载编译后的class文件
JVM虚拟机具体实现

线程共享数据区(两个区域)

2.1方法区(元空间)

方法区(jdk1.7后合并到了堆)jdk1.8仍然保留方法区的概念,只不过实现方式不同 元空间与堆不相连,但与堆共享物理内存,逻辑上可认为在堆中;

特点:

1.线程共享:
2.存储类信息,常量,运行时常量池,静态变量,即时编译器编译后的代码等数据;
3.HotSpot虚拟机上将方法区叫永久代
4.垃圾收集很少光顾该区域(无GC回收)
5.可以通过—XX:MaxPermSize设置最大值;
6.空间分配不够时 OutOfMemoryError;

方法区/元空间溢出

1.方法区也称为永久代
2.方法区存放class的相关信息,如类名,访问修饰符,常量池,字段描述,方法描述等,比如通过反射大量生成动态类填充该区域即会发生内存溢出

2.2堆

JVM虚拟机具体实现

特点:

1.线程共享
2.内存中最大的区域
3.虚拟机启动时创建
4.存放所有实例对象
5.GC垃圾收集器的主要管理区域
6.可分为新生代,老年代
7.更细化可分为Eden,From Survivor,To Survivior,Eden:Survivor=8:1:1
8.无法再扩展OutOfMemoryError

相关文章:

猜你喜欢
  • 2021-10-24
  • 2021-07-29
  • 2021-05-22
  • 2021-10-24
  • 2021-05-29
  • 2021-09-10
相关资源
相似解决方案