内构函数java_图灵学院笔记-java虚拟机底层原理
Table of Contents generated with DocToc
笔记来源:图灵学院
一、java虚拟机概述
java虚拟机用于将字节码文件.class转化为不同操作系统上的机器码
java虚拟机的内存模型
二、栈内存解析
2.1 概述
java虚拟机为每一个java线程分配一个栈内存空间,存放变量
public class Math{
public static final int initData = 666;//常量存储在方法区
public int compute() { //一个方法对应一块栈帧内存区域
int a=1;
int b=2;
int c = (a+b)*10;
return c;
}
public static void main(String[] args){
Math math = new Math();
math.compute();
}
}
a,b,c 保存在main线程的compute()栈帧中
2.2 栈帧内部结构
学习栈帧内部结构前,我们首先要阅读字节码文件。
javac Math.java
javap -c Math.class > Math.txt
打开生成的Math.txt,可以看到反汇编后的代码如下:
Compiled from "Math.java"
public class jvm.Math {
public static final int initData;
public jvm.Math();
Code:
0: aload_0
1: invokespecial #12 // Method java/lang/Object."":()V
4: return
public int compute();
Code:
0: iconst_1
1: istore_1
2: iconst_2
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: bipush 10
9: imul
10: istore_3
11: iload_3
12: ireturn
public static void main(java.lang.String[]);
Code:
0: new #1 // class jvm/Math
3: dup
4: invokespecial #25 // Method "":()V
7: astore_1
8: aload_1
9: invokevirtual #26 // Method compute:()I
12: pop
13: return
}
2.2.1 我们来解析一下compute()里面的代码:
public int compute() { //一个方法对应一块栈帧内存区域
int a=1;
int b=2;
int c = (a+b)*10;
return c;
}
//=======================================
public int compute();
Code:
0: iconst_1//将常量1压入操作数栈
1: istore_1 //将int类型的值存入局部变量1 -- a
2: iconst_2 //将常量2压入操作数栈
3: istore_2 //将int类型的值存入局部变量2 -- b
4: iload_1//从局部变量1装载int类型的值
5: iload_2 //从局部变量2装载int类型的值
6: iadd//1+2
7: bipush 10
9: imul//*10
10: istore_3//将int类型的值存入局部变量3 -- c
11: iload_3//装载c的值
12: ireturn
赋值过程:
装载,执行过程(操作数栈:临时存储需要操作的值):
2.2.2 main函数内存区域
main中存储了一个math对象的指针,指向堆(堆中有为这个对象开辟的内存空间):
三、本地方法栈
早期 JAVA 需要与C/C++进行交互,所以用本地方法栈存储C/C++方法
四、堆
首先我们看看堆的结构:
堆假设只有600M的话,那么年轻代占了1/3,也就是200M,老年代占了2/3。最开始的时候,对象都存放在Eden(伊甸区)中。
当Eden区装满时,则字节码执行引擎开启一个线程,运行minor gc,扫描伊甸区中的对象,如果对象被引用了,则在s0区中复制一份,否则留在Eden中,被垃圾回收机制清理。
其他区域也是类似的处理(在Eden,s0,s1中移动时,“年龄“会加大,当达到15时,会转入老年区,controller、service、bean、数据库持久层、缓存都是常见的老年区对象):
当老年代区放满后,字节码执行引擎开启一个线程,运行full gc,对所有区域进行垃圾回收,减少堆的空间,但是老年区被引用的对象还是不会被回收,所以当老年区再次被放满溢出时,会触发OutOfMemoryError的异常,即java堆不够用了。
扩展:STW【stop the world】,当 JVM 调用gc清理堆时,会暂停掉所有用户程序,比如电商购物时,点击按钮后通常会卡顿一下
垃圾回收,减少堆的空间,但是老年区被引用的对象还是不会被回收,所以当老年区再次被放满溢出时,会触发OutOfMemoryError的异常,即java堆不够用了。
扩展:STW【stop the world】,当 JVM 调用gc清理堆时,会暂停掉所有用户程序,比如电商购物时,点击按钮后通常会卡顿一下
所以 JVM 调优就是:尽量想方设法减少 STW 时间
内构函数java_图灵学院笔记-java虚拟机底层原理相关推荐
- java底层原理书籍_不愧是阿里p8大佬!终于把Java 虚拟机底层原理讲清楚了,请签收...
概述 JVM 的内存模型和 JVM 的垃圾回收机制一直是 Java 业内从业者绕不开的话题(实际调优.面试)JVM是java中很重要的一块知识,也是面试常问的问题之一,直至今天,仍然还有许多面试者在被 ...
- 万字长文总结Java虚拟机底层原理知识,一次性给你讲的明明白白!
JVM 内存结构 Java 虚拟机的内存空间分为 5 个部分: 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代.元 ...
- Java 虚拟机(JVM)原理介绍
Java 虚拟机[JVM]原理介绍 1.概述 2.Java类的加载原理机制 2.1 .Java类的加载过程 2.2 .Class loader (类加载器) 2.2.1 类的生命周期 2.2.1.1 ...
- 【Java核心技术大会 PPT分享】陈阳:深入理解 Java 虚拟机编译原理
导读:深入理解 Java 虚拟机编译原理 直播分享PPT Java核心技术大会2022 分享主题:深入理解 Java 虚拟机编译原理 分享嘉宾:陈阳,京东科技架构师,曾就职于美团.去哪网,负责自研消息 ...
- Java CAS底层原理
Java CAS底层原理 Java CAS底层原理,这一篇就够了!!! CAS全称(Conmpare And Swap)比较并交换,是一种用于在多线程环境下实现同步功能的机制.CAS 操作包含三个操作 ...
- 内构函数java_Android JNI参数传递
Java中调用native函数传递的参数是Java数据类型,到了JNI层需进行数据类型转换,基本数据类型是在前面加个j,如int-->jint,应用数据类型除了基本数据类型的数据.Class.S ...
- python 内置函数转list_python学习笔记11-python内置函数
python学习笔记11-python内置函数 一.查看python的函数介绍: 二.python内置函数 1.abs获取绝对值: 通过python官网查看absabs(x) Return the a ...
- Python内置函数sorted()和列表方法sort()的排序原理
问题描述:在Python中,可以使用内置函数sorted()和列表方法sort()对数据进行排序,但要求所有数据支持关系运算符,也就是这些数据本身是可以比较大小的才能进行排序,除非使用key参数明确指 ...
- 笔记 | Java 虚拟机
了解 JVM 一些技术特性的运作原理,让我们写出更适合 JVM 运行和自优化的代码. JVM运行时数据区域 Java 虚拟机(Java Virtual Machine,JVM)在执行 Java 程序过 ...
- JVM笔记-java虚拟机
JVM 常见问题 什么情况下会发生栈内存溢出 谈谈你对jvm的理解?Java8的虚拟机有什么更新? 什么是ooM?什么是stackoverflowerror? jvm的常用参数调优你知道哪些? 谈谈j ...
最新文章
- CSS实现超过一定的宽度添加省略
- php7 windows2008,【笔记】Windows Server2008 R2 安装 PHP7 缺少 API-ms-win-crt-runtime-l1-1-0.dll 解决方案...
- 结对开发石家庄地铁系统
- 硬件知识:串口通讯的起始、数据、停止位是怎么分配的?
- bootstrap4 后台管理模板_开源的后台管理模板
- python读写大文件 meoryerror_Python – 如何在没有MemoryError的情况下gzip大文本文件?...
- 得到进程id_GDB调试多进程程序
- protoc安装使用
- 嵌入式分享合集101-PLC
- 计算机网络按网络覆盖范围大小排序 从小到大为,现代远程网络教育概论试题及答案分析.pdf...
- 2017第十四届国际真空展览会会刊(参展商名录)
- 微信小程序 下拉刷新 性能优化 参考饿了么小程序首页列表加载
- 在Mac下使用PanDownload完美下载BD云盘资源
- 【社保—五险一金科普】
- excel换行按什么键_excel中关于自动换行和强制换行那些事儿
- 19-备忘录模式Quarkus实现
- 谷歌关闭中国地区音乐搜索服务与产品设计
- api-gateway的pom文件
- 计算机专业考研难度排名?
- 比尔·盖茨退位 | 历史上的今天
热门文章
- 【AUTOSAR】基于RT-Thread内核的AUTOSAR在n32g上的实现
- 周围剃光头顶留长发型_四周都剃光,头顶留在发的那叫什么发型
- Python实现学生成绩分析
- 彻底理解js的作用域链
- 达人评测 联想YOGA Duet 2021
- .NET在蹉跎中一路前行1
- GCTA学习8 | GCTA计算多性状遗传力和遗传相关
- 华为手机设置 网页打不开java_如何设置华为手机浏览器,打开后不会自动跳转......
- 丁火生于未月命理分析_日主丁、未月出生五行喜用分析-丁日未月生《晶灵八字算命》...
- phalcon mysql_Phalcon 数据库操作总结