IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JVM学习笔记内存与垃圾回收篇 -> 正文阅读

[Java知识库]JVM学习笔记内存与垃圾回收篇

一、JVM与java体系结构

1 虚拟机的结构

在这里插入图片描述

2 java的编译

??有句话说java是半编译半解释型语言,因为从*.java到*.class文件的过程是编译。而*.class文件的运行是解释。

??但其实*.class文件的运行过程是半编译半解释的。有些需要反复用到的字节码是直接编译成机器指令来执行的。就好比域名的解析,常用访问的域名解析是直接通过本地域名服务器,不常用的才会自顶向下层层解析。例如for循环中的代码是要重复利用的,就把这段字节码编译成机器指令缓存起来,每次循环都调用缓存区中的机器指令,而不需要进行解释。如图:

java的编译过程

3 jvm的指令集

??指令集架构有基于栈的指令集架构和基于寄存器的指令集架构。

??jvm中使用的就是基于栈的指令集架构。它的好处是不需要硬件支持,可移植性高,零地址指令多。但性能不及寄存器式架构(如x86汇编)

??栈式架构必然是大量使用到栈。例如我们将如下代码进行反汇编:

package com.spd.jvm;

public class Test {

	public static void main(String[] args) {
		int i = 2;
		int j = 3;
		int k = 2 + 3;
	}

}

??得到的结果是:

iconst_2	// 将int型数2压栈
istore_1	// 将栈顶int型存入本地变量1
iconst_3	// 将int型数3压栈
istore_2	// 将栈顶int型存入本地变量2
iconst_5	// 将int型数5压栈
istore_3	// 将栈顶int型存入本地变量3
return		// 从当前方法返回void

??而对x86汇编而言是这么写的:

mov ds : [0], 2		; 设ds : [0]为i
mov ds : [4], 3		; 设ds : [4]为j
mov eax, ds : [0]
add eax, ds : [4]
mov ds : [12], ax	; 设ds : [12]为k,k = ax = i + j
ret

??由此可见,确实比起x86汇编更多使用到了栈。另外也能看出来同一功能栈式架构比寄存器式架构需要用更多指令,但是他的指令集更小。

二、类加载子系统

1 类加载子系统的结构

类加载子系统

2 类加载子系统的作用

??类加载子系统只负责类的加载,而类能否运行由执行引擎决定。
加载Car.class

3 类加载的加载过程

??① 通过一个类的全限定名获取定义此类的二进制字节流

??② 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

??③ 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

4 类加载的验证过程

??① 验证:验证魔数及版本号。

??② 准备:为类变量分配内存并设置为他们的初始值。初始化阶段才赋值。(不会分配final修饰的static,因为他们在编译过程就已经分配了。准备阶段只会进行显式初始化。也不会为实例变量分配初始化。)

package com.spd.jvm;

public class Test {

	private static int age = 18;		// prepare: age = 0		-> initial: age = 18
	private static char sex = '男';		// prepare: sex = '\0'	-> initial: sex = '男'
	public static String name = "spd";	// prepare: name = null -> initial: name = "spd"

	public static void main(String[] args) {
		System.out.println("Hello world!");
	}

}

??③ 解析:将常量池中的符号引用转换成直接引用。

5 类加载的初始化过程

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-14 15:48:10  更:2021-12-14 15:49:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:36:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码