关于比较学术的jvm每个内存区域我之前都写过,就不重复赘述了,这里附上链接:https://www.cnblogs.com/gmt-hao/p/13603534.html, https://www.cnblogs.com/gmt-hao/p/13653218.html,这里都有详细介绍jvm内存区域分布,以及各部分的功能。今天主要从方法调用各个阶段去看各部分的变化:

  我们来看一段非常简单的代码:

public static void jvmModel(){
int a=1;
int b=2;
int c = a+b;
} public static void main(String[] args) {
jvmModel();
}

这段代码可以说简单到不能再简单了,首先调用main方法,然后main方法中调用jvmModel方法,做一些最简单的运算,但对jvm来说却一点都不简单,下面我们一步步分析:

我们上面的代码要执行首先从java文件编译成class文件,然后会加载到jvm内存当中(方法区),类加载器会找到对应路径类的二进制字节流,经过验证,解析等一系列流程(保证这个class文件安全可靠)之后,将类信息(如类完整路径名,修饰符,方法名,静态变量等等)存放在方法区中,而class对象实体其实还是在堆中的,之后由执行引擎接受开始执行方法。

  图二可以看到,方法在运行时,很多操作都是由执行引擎来处理的,详细的流程:main方法执行,首先需要分配给main线程一个独立的内存块,然后会给当前线程生成一个栈帧压进去,开始调用时,字节码引擎修改程序计数器的值来记录调用位置,接下来调用jvmModel方法,又会生产一个栈帧压进去,每个栈帧都会由记录局部变量的表,像jvmModel中需要计算的过程数值则会存在操作数栈中(计算机做不到和人脑一样,它只能一步一步执行,因此需要将过程数据记录下来),执行完成到从方法出口跳出去,退栈,main栈帧又到最顶端,继续执行完成,退栈结束。

  基本上方法执行的大体流程就是这样,而当新生代Eden区满了或者老年代满了都会字节码执行引擎会分别触发minor gc和full gc,执行垃圾回收的流程。

  具体关于垃圾回收我之前也有过详细介绍,这里也不重复赘述,放上链接:https://www.cnblogs.com/gmt-hao/p/13843250.html

总结:

  这一篇最大的意义是将一些概念化的东西和我们实际的写的代码给串起来,其实在学习jvm的过程中,很多概念性的东西都是靠背,很多时候都是在想,学这个东西有什么意义,我们平时写代码压根就不会接触,然而这些都是我们写代码的体现,了解我们写的代码jvm的角度是怎么看的还是挺有意思的吧。

.tb_button { padding: 1px; cursor: pointer; border-right: 1px solid rgba(139, 139, 139, 1); border-left: 1px solid rgba(255, 255, 255, 1); border-bottom: 1px solid rgba(255, 255, 255, 1) }
.tb_button.hover { borer: 2px outset #def; background-color: rgba(248, 248, 248, 1) !important }
.ws_toolbar { z-index: 100000 }
.ws_toolbar .ws_tb_btn { cursor: pointer; border: 1px solid rgba(85, 85, 85, 1); padding: 3px }
.tb_highlight { background-color: rgba(255, 255, 0, 1) }
.tb_hide { visibility: hidden }
.ws_toolbar img { padding: 2px; margin: 0 }
.tb_button { padding: 1px; cursor: pointer; border-right: 1px solid rgba(139, 139, 139, 1); border-left: 1px solid rgba(255, 255, 255, 1); border-bottom: 1px solid rgba(255, 255, 255, 1) }
.tb_button.hover { borer: 2px outset #def; background-color: rgba(248, 248, 248, 1) !important }
.ws_toolbar { z-index: 100000 }
.ws_toolbar .ws_tb_btn { cursor: pointer; border: 1px solid rgba(85, 85, 85, 1); padding: 3px }
.tb_highlight { background-color: rgba(255, 255, 0, 1) }
.tb_hide { visibility: hidden }
.ws_toolbar img { padding: 2px; margin: 0 }
.tb_button { padding: 1px; cursor: pointer; border-right: 1px solid rgba(139, 139, 139, 1); border-left: 1px solid rgba(255, 255, 255, 1); border-bottom: 1px solid rgba(255, 255, 255, 1) }
.tb_button.hover { borer: 2px outset #def; background-color: rgba(248, 248, 248, 1) !important }
.ws_toolbar { z-index: 100000 }
.ws_toolbar .ws_tb_btn { cursor: pointer; border: 1px solid rgba(85, 85, 85, 1); padding: 3px }
.tb_highlight { background-color: rgba(255, 255, 0, 1) }
.tb_hide { visibility: hidden }
.ws_toolbar img { padding: 2px; margin: 0 }
.tb_button { padding: 1px; cursor: pointer; border-right: 1px solid rgba(139, 139, 139, 1); border-left: 1px solid rgba(255, 255, 255, 1); border-bottom: 1px solid rgba(255, 255, 255, 1) }
.tb_button.hover { borer: 2px outset #def; background-color: rgba(248, 248, 248, 1) !important }
.ws_toolbar { z-index: 100000 }
.ws_toolbar .ws_tb_btn { cursor: pointer; border: 1px solid rgba(85, 85, 85, 1); padding: 3px }
.tb_highlight { background-color: rgba(255, 255, 0, 1) }
.tb_hide { visibility: hidden }
.ws_toolbar img { padding: 2px; margin: 0 }

第一视角看方法调用时的jvm的更多相关文章

  1. 反射方法调用时:参数计数不匹配( parameter count mismatch )

    Invoke方法的参数当中有一个自己的object[],正好你传递的参数也是object[],这样的话invoke就会把你参数数组里面的第一个参数作为参数传递给你要调用的方法,于是就报错了. 解决问题 ...

  2. 简单的继承练习——疑问:私有属性在类的方法内调用时,有必要使用get,set方法嘛?

    要求: 创建一个Circle类,设置半径属性和返回面积的方法,在无参构造器中初始化半径值为1. 创建一个Cylinder类,继承Circle类,设置属性高和返回体积的方法,在无参构造器中初始化长度为1 ...

  3. Tomcat 调优及 JVM 参数优化

    Tomcat 本身与 JVM 优化 Tomcat:调整Server.xml JVM:bat启动服务方式的话修改catalina.bat 服务式启动的话参考:http://www.cnblogs.com ...

  4. Tomcat7 调优及 JVM 参数优化

      Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒你.对于操作系统优化来说,是尽可能的增大可使用的内存容量.提高CPU 的频率,保证 ...

  5. 服务器的tomcat调优和jvm调化

    下面讲述的是tomcat的优化,及jvm的优化 Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒你.对于操作系统优化来说,是尽可能的增 ...

  6. Tomcat性能调优及JVM内存工作原理

    Java性能优化方向:代码运算性能.内存回收.应用配置. 注:影响Java程序主要原因是垃圾回收,下面会重点介绍这方面 代码层优化:避免过多循环嵌套.调用和复杂逻辑.Tomcat调优主要内容如下:1. ...

  7. [Spark性能调优] 第一章:性能调优的本质、Spark资源使用原理和调优要点分析

    本課主題 大数据性能调优的本质 Spark 性能调优要点分析 Spark 资源使用原理流程 Spark 资源调优最佳实战 Spark 更高性能的算子 引言 我们谈大数据性能调优,到底在谈什么,它的本质 ...

  8. Mybatis系列全解(七):全息视角看Dao层两种实现方式之传统方式与代理方式

    封面:洛小汐 作者:潘潘 一直以来 他们都说为了生活 便追求所谓成功 顶级薪水.名牌包包 还有学区房 · 不过 总有人丢了生活 仍一无所获 · 我比较随遇而安 有些事懒得明白 平日里问心无愧 感兴趣的 ...

  9. Linq专题之提高编码效率—— 第一篇 Aggregate方法

    我们知道linq是一个很古老的东西,大家也知道,自从用了linq,我们的foreach少了很多,但有一个现实就是我们在实际应用中使用到的却是屈指可数 的几个方法,这个系列我会带领大家看遍linq,好的 ...

  10. [U3D 添加大地、天空,用第一视角看看自己做的世界]

    1.添加大地.天空. 在下方Assets文件夹里右键,导入素材包. Terrain(地形)和Skybox(天空盒子) 2.选中左边的Terrain,在inspector里,选择中间的刷子(地形),还有 ...

随机推荐

  1. CGI, FastCGI, WSGI, uWSGI, uwsgi一文搞懂

    中间件 1.服务器中间件:nginx,apache 2.数据库中间件:介于应用程序和数据库之前的,MyCat 3.消息队列中间件:kafka,rabbitmq,Rocketmq CGI 1.CGI是一 ...

  2. Google Chrome 开启多下载下载,提高文件下载速度

    在地址栏输入: chrome://flags/#enable-parallel-downloading Parallel downloading改为Enabled后重启浏览器即可打开多线程下载 (多线 ...

  3. 学会了MySql高级查询让你在工作中游刃有余

    一.单元概述 通过本章的学习能够理解MySQL数据库中分组查询的含义,掌握常用分组函数的使用,掌握GROUP BY子句的使用规则,掌握分组后数据结果的条件过滤,掌握SELECT语句执行过程,理解子查询 ...

  4. 微信小程序开发:接入阿里云人像动漫化api接口

    前面我已经把腾讯云的人像转动漫化接口接到了我的小程序里,但是和阿里云的对比后,发现阿里云的效果会更好一些,且支持更多特效,如下: 我比较喜欢这个3D特效风格,动画3D也可以,大家拭目以待. 话说上次接 ...

  5. Jmeter Xpath提取器你了解多少?

  6. vscode 格式化空格,constructor 构造函数的空格 会有问题,找到一个配置文件好使

    Ctrl+Shift+P "javascript.format.enable": false, "javascript.format.insertSpaceAfterCo ...

  7. .NET集成DeveloperSharp实现强大的AOP

    (适用于.NET/.NET Core/.NET Framework)[目录]0.前言1.第一个AOP程序2.Aspect横切面编程3.一个横切面程序拦截多个主程序4.多个横切面程序拦截一个主程序5.优 ...

  8. dbvisualizer不能执行pl/sql块

    如果是如下语句: begin          dbms_output.put_line('Hello World!'); end; 控制台会报错 解决方案:语句改写为如下 --/ begin    ...

  9. 对角矩阵try

    \begin{bmatrix}1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\end{bmatrix}

  10. AI 学习时代:大语言模型领域的行业黑话和专业术语解析

    近年来,深度学习技术的快速发展带动了大语言模型在自然语言处理领域的广泛应用.在这个激动人心的领域里,我们常常会遇到一些行业黑话和专业术语.为了帮助大家更好地入门,让我们深入探讨一些关键概念,以及它们在 ...