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虚拟机底层原理相关推荐

  1. java底层原理书籍_不愧是阿里p8大佬!终于把Java 虚拟机底层原理讲清楚了,请签收...

    概述 JVM 的内存模型和 JVM 的垃圾回收机制一直是 Java 业内从业者绕不开的话题(实际调优.面试)JVM是java中很重要的一块知识,也是面试常问的问题之一,直至今天,仍然还有许多面试者在被 ...

  2. 万字长文总结Java虚拟机底层原理知识,一次性给你讲的明明白白!

    JVM 内存结构 Java 虚拟机的内存空间分为 5 个部分: 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代.元 ...

  3. Java 虚拟机(JVM)原理介绍

    Java 虚拟机[JVM]原理介绍 1.概述 2.Java类的加载原理机制 2.1 .Java类的加载过程 2.2 .Class loader (类加载器) 2.2.1 类的生命周期 2.2.1.1 ...

  4. 【Java核心技术大会 PPT分享】陈阳:深入理解 Java 虚拟机编译原理

    导读:深入理解 Java 虚拟机编译原理 直播分享PPT Java核心技术大会2022 分享主题:深入理解 Java 虚拟机编译原理 分享嘉宾:陈阳,京东科技架构师,曾就职于美团.去哪网,负责自研消息 ...

  5. Java CAS底层原理

    Java CAS底层原理 Java CAS底层原理,这一篇就够了!!! CAS全称(Conmpare And Swap)比较并交换,是一种用于在多线程环境下实现同步功能的机制.CAS 操作包含三个操作 ...

  6. 内构函数java_Android JNI参数传递

    Java中调用native函数传递的参数是Java数据类型,到了JNI层需进行数据类型转换,基本数据类型是在前面加个j,如int-->jint,应用数据类型除了基本数据类型的数据.Class.S ...

  7. python 内置函数转list_python学习笔记11-python内置函数

    python学习笔记11-python内置函数 一.查看python的函数介绍: 二.python内置函数 1.abs获取绝对值: 通过python官网查看absabs(x) Return the a ...

  8. Python内置函数sorted()和列表方法sort()的排序原理

    问题描述:在Python中,可以使用内置函数sorted()和列表方法sort()对数据进行排序,但要求所有数据支持关系运算符,也就是这些数据本身是可以比较大小的才能进行排序,除非使用key参数明确指 ...

  9. 笔记 | Java 虚拟机

    了解 JVM 一些技术特性的运作原理,让我们写出更适合 JVM 运行和自优化的代码. JVM运行时数据区域 Java 虚拟机(Java Virtual Machine,JVM)在执行 Java 程序过 ...

  10. JVM笔记-java虚拟机

    JVM 常见问题 什么情况下会发生栈内存溢出 谈谈你对jvm的理解?Java8的虚拟机有什么更新? 什么是ooM?什么是stackoverflowerror? jvm的常用参数调优你知道哪些? 谈谈j ...

最新文章

  1. CSS实现超过一定的宽度添加省略
  2. php7 windows2008,【笔记】Windows Server2008 R2 安装 PHP7 缺少 API-ms-win-crt-runtime-l1-1-0.dll 解决方案...
  3. 结对开发石家庄地铁系统
  4. 硬件知识:串口通讯的起始、数据、停止位是怎么分配的?
  5. bootstrap4 后台管理模板_开源的后台管理模板
  6. python读写大文件 meoryerror_Python – 如何在没有MemoryError的情况下gzip大文本文件?...
  7. 得到进程id_GDB调试多进程程序
  8. protoc安装使用
  9. 嵌入式分享合集101-PLC
  10. 计算机网络按网络覆盖范围大小排序 从小到大为,现代远程网络教育概论试题及答案分析.pdf...
  11. 2017第十四届国际真空展览会会刊(参展商名录)
  12. 微信小程序 下拉刷新 性能优化 参考饿了么小程序首页列表加载
  13. 在Mac下使用PanDownload完美下载BD云盘资源
  14. 【社保—五险一金科普】
  15. excel换行按什么键_excel中关于自动换行和强制换行那些事儿
  16. 19-备忘录模式Quarkus实现
  17. 谷歌关闭中国地区音乐搜索服务与产品设计
  18. api-gateway的pom文件
  19. 计算机专业考研难度排名?
  20. 比尔·盖茨退位 | 历史上的今天

热门文章

  1. 【AUTOSAR】基于RT-Thread内核的AUTOSAR在n32g上的实现
  2. 周围剃光头顶留长发型_四周都剃光,头顶留在发的那叫什么发型
  3. Python实现学生成绩分析
  4. 彻底理解js的作用域链
  5. 达人评测 联想YOGA Duet 2021
  6. .NET在蹉跎中一路前行1
  7. GCTA学习8 | GCTA计算多性状遗传力和遗传相关
  8. 华为手机设置 网页打不开java_如何设置华为手机浏览器,打开后不会自动跳转......
  9. 丁火生于未月命理分析_日主丁、未月出生五行喜用分析-丁日未月生《晶灵八字算命》...
  10. phalcon mysql_Phalcon 数据库操作总结