JVM第一节

前言

作为刚刚入门的我,说实话课程里的一些有关字节码的内容,我看不太懂,也觉得看不懂也无所谓.与其花费大量时间研究不需要的知识.不如专注于要学习的内容.
文中(我所购买的课程)所涉及到的字节码都是为了佐证.所以这里,我只有原因和结果,没有过程.

JVM是什么

JVM,我们一般成为Java虚拟机.
我们写的Java代码会经过编译成为.class文件,也就是字节码文件.然后在JVM上翻译.
但是为什么非要在JVM上运行呢?
因为JVM提供了

  • 提供了托管环境,帮助我们处理冗长和易出错的事务.例如 GC,内存管理
  • 提供了可移植性

JVM模型

JVM模型,非常重要的概念,这里简单介绍一下.后面会用到.
JVM

  • 方法区 存放着类,运行时会执行相应代码
  • 堆 存放着对象
  • PC寄存器,也就是程序计数寄存器.存放着各个线程的位置
  • Java方法栈 每次调用方法,就会产生一个栈帧,用来存放局部变量等信息.调用完或出现异常,都会被弹出,并销毁.
  • 本地方法栈 存放着C++编写的方法.

JVM中的翻译

.class文件是无法直接被机器识别的,所以还需要JVM翻译成机器码.
翻译有两种形式

  • 解释执行,逐条进行翻译.不用等待,但是效率低
  • 即时执行,先全部翻译完,再执行.需要准备时间,但是效率高

JVM是混合使用两种翻译方式,对于热点方法的代码进行即时执行,而非热点采用解释执行.
对于热点代码的判断,调用到一定次数就会触发即时编译的.
有一个比较有趣的问题,

既然可以即时执行,那么为什么不提前都翻译好,再执行?
这样虽然会在执行前消耗一段时间,但是完全可以接受的啊?

作者的回答

对于这种发布频率不频繁(长时间运行)的程序,其实选择线下编译和即时编译都一样,因为至多一两个小时后该即时编译的都已经编译完成了。另外,即时编译器因为有程序的运行时信息,优化效果更好,峰值性能更好。

JVM翻译

JVM中的数据类型

我们都知道,Java分为基本数据类型和引用数据类型.其中基本数据类型有8个.

基本数据类型 引用数据类型
boolean byte short char int long float double String 等

Java语言中
8大数据类型

可以观察到,除了boolean意外的默认值都是0.
其实,boolean类型中的false在JVM中也会被解析成0.当然true会被解析成1
需要注意的地方

  • 方法栈 中存贮 boolean byte short int 所占的大小是一致的.32位的JVM为4个字节,64位的8个字节.之所以这样是因为变长数组不好控制,所以就选择浪费一些空间,以便访问时直接通过下标来计算地址。
  • 堆 中存贮 8 大基本数据类型时,还是根据它们的值域来规定大小.int是4个字节,long是8个字节…

下面的链接,可以用来复习一下二进制的操作
2进制

JVM中的类加载

类加载器
验证,准备,解析
加载
链接
初始化

加载器

加载器
启动类加载器
C++实现,没有父类
扩展类加载器
Java语言实现,父类加载器为null
系统类加载器
父类加载器为扩展类加载器
自定义类加载器
父类加载器为系统类加载器

深入理解Java类加载器(ClassLoader)
上面的文章讲的非常好,推荐大家看看.但有些深入,我这里只是简单描述,如有需要请自行查看.

JVM如何区分 类的唯一性:

  • 类加载器
  • 类全名 (Java程序中类全名 唯一)

初始化
只有类被初始化后,才能使用.
类初始化的触发条件
我简单分为两类,直接和间接.总得来说,就是用到某个类的信息时初始化.

  • 直接
    new 一个新对象时,会加载该类
    调用一个类中的静态字段/静态方法
    指定初始化某个类,例如 Class.forName()
  • 间接
    子类初始化时,会初始化父类
    反射调用类中的字段/方法

Class.forName() 参考资料

下面的这个单例模式的写法,就巧妙地利用了类的初始化.只有当调用 getInstance() 时,才会初始化实例.
LazyHolder 类的加载,有且加载一次.同时因为类的加载是线程安全的,所以还保证了线程的安全.

package singleton;

public class Singleton {

	private Singleton() {}
	
	private static class LazyHolder{
		private static final Singleton INSTANCE = new Singleton();
	}
	
	public Singleton getInstance() {
		return LazyHolder.INSTANCE;
	}
	
}

猜你喜欢

转载自blog.csdn.net/qq_34120430/article/details/85038129
今日推荐