【JVM】LXF_深入理解JVM专题(5-)
文章目录
- 深入理解JVM虚拟机5:虚拟机字节码执行引擎
- 一、方法调用的本质
- 二、运行时栈帧结构
- 1. 局部变量表
- 2. 操作数栈
- 3. 返回地址
- 4. 方法调用
- 5. 静态分派
- 6. 动态分派
- 7. 动态类型特性的支持
- 深入理解JVM虚拟机6:深入理解JVM类加载机制
- 一、类加载的时机
- 二、类加载的过程
- 1. 加载
- 2. 验证
- 3. 准备
深入理解JVM虚拟机5:虚拟机字节码执行引擎
原文地址:https://blog.csdn.net/a724888/article/details/78404643
一、方法调用的本质
下面我们看看一段 C 代码:
#include<stdio.h>
void sayHello(int age)
{int x = 32;int y = 2323;age = x + y;
}void main()
{int age = 22;sayHello(age);
}
很简单的一段代码,我们汇编生成相应的汇编代码,省略了部分链接代码,留下的是核心的部分:
main:pushl %ebpmovl %esp, %ebpsubl $20, %espmovl $22, -4(%ebp)movl -4(%ebp), %eaxmovl %eax, (%esp)call sayHelloleaveretsayHello:pushl %ebpmovl %esp, %ebpsubl $16, %espmovl $32, -4(%ebp)movl $2323, -8(%ebp)movl -8(%ebp), %eaxmovl -4(%ebp), %edxaddl %edx, %eaxmovl %eax, -12(%ebp)leaveret
leave 指令等效于以下两条指令之和:
movl %ebp %esp
popl %ebp
二、运行时栈帧结构
1. 局部变量表
局部变量表不同于操作数栈,它采用索引机制访问元素,而不同于操作数栈的出入栈方式。例如:
public void sayHello(String name){int x = 23;int y = 43;x++;x = y - 2;long z = 234;x = (int)z;String str = new String("hello wrold ");}
2. 操作数栈
3. 返回地址
4. 方法调用
那么哪些方法是被静态解析了,哪些方法需要动态解析呢?
比如下面这段代码:
Object obj = new String("hello");
obj.equals("world");
5. 静态分派
首先我们看一段代码:
public class Father {}
public class Son extends Father {}
public class Daughter extends Father {}
public class Hello {public void sayHello(Father father){System.out.println("hello , i am the father");}public void sayHello(Daughter daughter){System.out.println("hello i am the daughter");}public void sayHello(Son son){System.out.println("hello i am the son");}
}
public static void main(String[] args){Father son = new Son();Father daughter = new Daughter();Hello hello = new Hello();hello.sayHello(son);hello.sayHello(daughter);
}
6. 动态分派
public class Father {public void sayHello(){System.out.println("hello world ---- father");}
}
public class Son extends Father {@Overridepublic void sayHello(){System.out.println("hello world ---- son");}
}
public static void main(String[] args){Father son = new Son();son.sayHello();
}
7. 动态类型特性的支持
Object obj = new String("hello-world");
obj.split("-");
JDK1.7 提供了两种方式来支持 Java 的动态特性,invokedynamic 指令和 java.lang.invoke 包。这两者的实现方式是类似的,我们只介绍后者的基本内容。
//该方法是我自定义的,并非 invoke 包中的
public static MethodHandle getSubStringMethod(Object obj) throws NoSuchMethodException, IllegalAccessException {//定义了一个方法模板,规定了待搜索的方法的返回值和参数类型MethodType methodType = MethodType.methodType(String[].class,String.class);//查找符合指定方法简单名称和模板信息的方法return lookup().findVirtual(obj.getClass(),"split",methodType).bindTo(obj);
}
public static void main(String[] args){Object obj = new String("hello-world");//定位方法,并传入参数执行方法String[] strs = (String[]) getSubStringMethod(obj).invokeExact("-");System.out.println(strs[0]);
}
深入理解JVM虚拟机6:深入理解JVM类加载机制
原文地址:https://blog.csdn.net/a724888/article/details/78396462
一、类加载的时机
二、类加载的过程
1. 加载
2. 验证
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
3. 准备
假设有:
public static int value = 123;
一种特殊情况是,如果字段属性表中包含ConstantValue属性,那么准备阶段变量value就会被初始化为ConstantValue属性所指定的值,比如上面的value如果这样定义:
public static final int value = 123;
【JVM】LXF_深入理解JVM专题(5-)相关推荐
- 【JVM】LXF_深入理解JVM专题(1-4)
文章目录 前言 深入理解JVM虚拟机开篇:JVM介绍与知识脉络梳理 深入理解JVM虚拟机1:JVM内存模型 与 永久代的消失 深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法 1. 各种GC的触发 ...
- JVM之深入理解JVM内存结构(Java内存结构/Java内存区域)、Java内存模型
Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文我们要讨论的JVM内存结构.JAVA内存结构.JAVA内存 ...
- 深入理解JVM文章合集
原文地址:http://ddrv.cn/a/88331 Java动态追踪技术探究 在Java虚拟机中,字符串常量到底存放在哪 一次生产 CPU 100% 排查优化实践 聊聊 Java 虚拟机:类的加载 ...
- Java快速创建大量对象_3分钟 快速理解JVM创建对象的步骤!
原标题:3分钟 快速理解JVM创建对象的步骤! 我们平时创建一个对象只需要new.然而我们知道对象的创建到底经历了哪些呢?实际上只不过仅仅的3步就完成了.先来看看完整的创建过程,再来一步一步的分析. ...
- java visualvm远程监控_深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战
本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...
- [译]深入理解JVM
深入理解JVM 原文链接:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals 每个使用Java的开发者都知道Java ...
- 深入理解JVM(一)编译openJDK
此文总结的很不错:https://www.cnblogs.com/ACFLOOD/p/5528035.html 准备openJDK源码和环境 1.在linux和macOS上编译openJDK更加友好, ...
- 深入理解JVM(2)——GC算法与内存分配策略
说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...
- java 句柄池_深入理解JVM之Java对象的创建、内存布局、访问定位详解
本文实例讲述了深入理解JVM之Java对象的创建.内存布局.访问定位.分享给大家供大家参考,具体如下: 对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含 ...
最新文章
- 学Python的好处有哪些?
- amaze ui各个模块简单说明
- python---4
- 人类信息接收过去、现在与未来 ——我对于内容产业的判断
- C#模拟网站登录介绍
- android paint 线宽_android Paint 设置线宽setStrokeWidth()的单位
- linux的物理内存中swap压缩,linux中Centos7增加swap分区详解
- HBase配置(伪分布式模式)
- 一步一步学Silverlight 2系列(5):实现简单的拖放功能_转载
- Hibernate---简介
- [处理数据的心得][1]--相关矩阵的可视化
- 一种可以穿透还原卡和还原软件的代码(转)
- “00后”消费数据分析,一文教你撩动“00后”购物欲
- 杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法
- 电影爱好者福利,一些电影网站汇总
- java模拟器怎么调中文_电脑java模拟器(javagame模拟器)
- HDU 6318 Swaps and inversions
- 光纤设备及跳线接口图鉴
- 学会做笔记-子弹笔记学习概要一
- ADV-201 我们的征途是星辰大海