第44节:Java当中的JVM
2023-09-11 14:16:53 时间
Java当中JVM
01
在使用控制面板时的实质:
Hello.java
使用javac
,然后变成为Hello.class
通过运行java
这个命令,在类加载器中(含有加载,验证,准备,解析,初始化,使用,卸载),到jvm
为Java虚拟机中运行,在jvm
中有方法区,堆内存,线程栈,本地方法栈,PC
计数器。
类加载器:
- 加载,
- 验证,
class
文件的版本是否能兼容当前的Java
虚拟机版本,然后class
文件要满足虚拟机的规范。 - 准备,需要准备什么呢?就是要进行类成员的初始化为初始值,其中为
final
修饰的类变量除外,final
变量就直接初始化为变量值,而类成员不一样。 - 解析,什么是解析呢?就是把符号引用解析为直接引用,就是我们变量
xxx
,这种代表变为直接引用,什么是直接引用呢?就是内存地址,如我们常见的xxx0203r0e
,这种。 - 初始化,把关于
static
修饰的变量或者是static
静态代码块按照顺序组成构造器进行初始化变量。 - 使用,
- 卸载
JVM
JVM:
方法区(保存所有类的信息,通过常量池来保存生成所有类信息的对象),堆内存,线程栈,本地方法栈,计数器。
// 在控制面板中,反编译
javap -c xxx
就是将字节码反编译为字节码的指令输出
public class Hello{
public Hello();
Code:
0: aload_0
1: invokespecial #1
4: return
public static void main(java.lang.String[]);
...
}
把程序放进jvm
中运行,到线程栈中运行,主方法main
(主线程),在线程栈中运行如果有遇到new
对象关键字时,main
这个主线程就会在自己的内存中(线程栈)声明一个的对象(对象的引用指向堆内存中开辟的对象),Hello hello
;在jvm
中有个堆内存,就会申请一片空间内存地址,即创建一个对象,实例变量,实例方法从方法区中指向堆内存。
public class Hello{
public static void main(String[] args){
Hello hello = new Hello();
// 对象的声明 和 创建对象
}
}
类加载到虚拟机中:
public class Demo
static {
System.out.println("静态代码块");
}
{
System.out.println("普通代码块");
}
public Demo(){
System.out.println("构造方法");
}
public static void main(String[] args){
new Demo();
}
}
// 结果
静态代码块
普通代码块
构造方法
// 加载 验证 准备 解析 初始化 使用 卸载
Demo.java -> Demo.class -> 加载进入虚拟机中,类加载器 (验证类信息,元素信息,版本,字节码,准备,初始化类变量,解析把符号引用解析为直接引用,进行初始化就是把static变量和static静态代码块进行初始化变量)
步骤:
在堆内存中执行的顺序就是加载实例信息,然后在进行构造方法。
02
了解static案例
// 父类
public class F
static {
System.out.println("F静态代码块");
}
{
System.out.println("F普通代码块");
}
public F(){
System.out.println("F构造方法");
}
}
// 子类
public class S extends F
static {
System.out.println("S静态代码块");
}
{
System.out.println("S普通代码块");
}
public S(){
super(); // 默认的
System.out.println("S构造方法");
}
}
// 测试
public class Demo
public static void main(String[] args){
// 创建子类对象
new S();
}
}
// 结果
F静态代码块
S静态代码块
F普通代码块
F构造方法
S普通代码块
S构造方法
程序进入JVM
中的方法区,子类继承父类,父类进行加载实例信息进入到开辟的内存中,然后执行完再执行构造方法,在堆内存中new
一个对象,new S();
在子类的构造方法中会有默认的super()
,加载父类,如果子类调用默认调用super()
,而父类没有无参的构造方法,而是有参的构造方法,那么就要自己添加,在super(xxx)
中。
往后余生,唯独有你
简书作者:达叔小生
90后帅气小伙,良好的开发习惯;独立思考的能力;主动并且善于沟通
简书博客: https://www.jianshu.com/u/c785ece603d1
结语
- 下面我将继续对 其他知识 深入讲解 ,有兴趣可以继续关注
- 小礼物走一走 or 点赞
相关文章
- 深入java面向对象五:Java的内存管理
- Java跨语言调用实现方案
- [Java基础] java的守护线程与非守护线程
- Jmeter里的全能java测试sampler - Java request
- [转]关于JAVA中RSA加签解签,私钥加密公钥解密和公钥加密私钥解密代码详解
- Java实现蓝桥杯算法提高 陶陶摘苹果
- Java实现 LeetCode 226 翻转二叉树
- Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
- (Java实现) 洛谷 P1200 你的飞碟在这儿
- Java 基础:认识&理解关键字 native 实战篇
- Eclipse Java注释模板设置简介,更改字体大小
- 【JAVA】产生随机数:rand.nextInt(int n )
- Atitit 异常处理之道 attilax著.docx 1. 概念2 1.1. 异常机制的设计原理2 1.2. Atitit.异常机制的设计原理.docx java2 1.3. JVM看Exc
- How to improve Java's I/O performance( 提升 java i/o 性能)
- 【jvm优化】top命令找到占用CPU最高的java线程
- 【面试】Java虚拟机(JVM)面试题
- Java Lambda 表达式与 JVM 中的 Invoke Dynamic 简介
- 一文详解java线程池 详解Java线程池的七个参数 详解池化技术 java如何选择核心线程数 详解Java线程池的拒绝策略
- Java底层知识JVM、GC
- JAVA网络编程-----TCP沟通
- java.lang.OutOfMemoryError: Java heap space
- python 垃圾回收——分代回收 和java有些区别 注意循环引用无法被回收
- 【java】Java并发编程系列-基础知识(非常详细哦)
- 【jvm】JVM(三)JVM 垃圾回收算法详解(CMS、三色标记)