jvm从入门到精通(一)

jvm从入门到精通(一)_第1张图片

一、jvm内存模型
jvm从入门到精通(一)_第2张图片
程序计数器:是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
:每个方法被执行的时候都会同时创建一个栈帧,用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
:是Java 虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。Java 堆是垃圾收集器管理的主要区域。
方法区: 是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

二、类加载
1. 加载机制
jvm从入门到精通(一)_第3张图片
加载:加载会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口。
验证:确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。包括文件格式、元数据、字节码、符号引用验证。
准备:是正式为类变量分配内存并设置类变量的初始值阶段,即在方法区中分配这些变量所使用的内存空间。
解析:解析阶段是指虚拟机将常量池中的符号引用替换为直接引用的过程。
初始化: 初始化阶段是类加载最后一个阶段,到了初始阶段,才开始真正执行类中定义的Java程序代码。

2. 加载器
jvm从入门到精通(一)_第4张图片
启动类加载器 : %JAVA_HOME%/lib/
拓展类加载器 : %JAVA_HOME%/lib/ext或者java.ext.dirs指向的目录
应用程序类加载器 :CLASSPATH环境变量, 由-classpath或-cp选项定义,或者是JAR中的Manifest的classpath属性定义。
类加载器的三大特性:委托性、可见性、单一性
委托性 :当一个类加载器要加载一个类时,它会先委托自己的父类加载器来加载,只有当父加载器无法加载类时,才会自己去加载。
可见性:可见性指的是父加载器无法利用子加载器加载的类,而子加载器可以利用父加载器加载的类。
单一性:一个类只会被一个类加载器加载一次,不会被重复加载。
我们自己也可以写自己的类加载器以满足自己特定的要求,只要实现ClassLoader这个类即可。
我们自己也可以写自己的类加载器以满足自己特定的要求,只要实现ClassLoader这个类即可。

你可能感兴趣的:(jvm)