初始JVM

a 夏天 提交于 2020-03-01 20:04:05

这几天面试,问了一些JVM的知识感觉答的不是很好,在此写JVM系列的文章(再次讨论的是java8的相关知识点),回顾一下相关知识,希望能够帮到看我文章的朋友,现在马上开始。

相关概念:
1.什么是jvm?(java virtual machine)
Java虚拟机是抽象的计算机。像真正的计算机一样,它具有指令集并在运行时操作各种内存区域。

2.什么是运行时数据区?
Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。其中一些数据区域是在Java虚拟机启动时创建的,仅在Java虚拟机退出时才被销毁。其他数据区域是每个线程的。创建线程时创建每个线程的数据区域,并在线程退出时销毁每个数据区域。

The Java Virtual Machine defines various run-time data areas that areused during execution of a program. Some of these data areas are created on Java Virtual Machine start-up and are destroyed only whenthe Java Virtual Machine exits. Other data areas are per thread.Per-thread data areas are created when a thread is created anddestroyed when the thread exits. —摘录java8官网描述

3.运行时数据区示意图

在这里插入图片描述

4.内存模式(JMM)
在这里插入图片描述

类加载机制

先用一张图看看一个java文件时怎样被加载进虚拟机的
在这里插入图片描述
在将生成的class文件加载进jvm中时主要有三个步骤:

装载
	1.找到class文件的位置,并用类加载器classLoader基于双亲委派的机制进行加载
	2.将类文件信息交给jvm
	3.将类文件的对象交给jvm
链接
链接阶段负责把类的二进制文件合并到JRE中,可以分为三个:
  (1) 验证 保证类的加载正确性。
  (2) 准备 要将类的静态变量分配内存空间,并将其的值进行初始化成默认值。
  (3) 解析 将类的符号引用转换为直接行用。
初始化
	主要对类的静态变量,常量真正的赋值 

类的初始化时机

1.创建类实例(new 、发射,反序列化)。
2.调用某个类的静态方法
3.访问类或者接口的类变量,或为该变量赋值
4.初始化某个类的子类
双亲委派机制

在这里插入图片描述
双亲委派机制为了避免同名的对象重复加载而出现的机制
类加载还会出现下列机制
1.全盘负责 :当一个类加载器负载一个类的加载时,该类所依赖的和引用的其他类也将由这个类加载
2.父类委托:尝试让父类加载器加载,当父类加载器无法加载时才让自己加载
3.缓存机制:所有加载过的class都会被缓存,所有的类只加载一次

运行时数据区

Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。其中一些数据区域是在Java虚拟机启动时创建的,仅在Java虚拟机退出时才被销毁。其他数据区域是每个线程的。创建线程时创建每个线程的数据区域,并在线程退出时销毁每个数据区域。

在这里插入图片描述

方法区

线程共享的一片内存区域,方法区也叫永久代,用户存储被jvm加载的类信息,静态变量,常量,以及即时编译器编译的代码等数据,内存管理由GC分代收集来实现压缩,标记,清除等操作

线程共享的一片内存区域,主要用来存储对象和数组,采用分代算法进行内存管理,从GC角度将堆细分为新生代和老年代。

虚拟机栈

线程非共享的一片区域,跟线程的生命周期一致,在每个方法调用会生成栈帧(Stack Frame),里面主要存储局部变量 ,操作数栈,动态链接,和方法返回值,为执行Java方法服务

本机方法栈

与虚拟机的类似,但是主要为native的方法服务

程序计数器

一块较小的内存空间,当前线程执行字节码的行号指示器,每条线程都有独立的计数器,这个内存区域时唯一没有OOM的区域,因为程序在生成字节码文件时都已经确定了程序的最大行号

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!