文章目录

  • 深入理解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. 验证
  1. 文件格式验证
  2. 元数据验证
  3. 字节码验证
  4. 符号引用验证
3. 准备

假设有:

public static int value = 123;

一种特殊情况是,如果字段属性表中包含ConstantValue属性,那么准备阶段变量value就会被初始化为ConstantValue属性所指定的值,比如上面的value如果这样定义:

public static final int value = 123;

【JVM】LXF_深入理解JVM专题(5-)相关推荐

  1. 【JVM】LXF_深入理解JVM专题(1-4)

    文章目录 前言 深入理解JVM虚拟机开篇:JVM介绍与知识脉络梳理 深入理解JVM虚拟机1:JVM内存模型 与 永久代的消失 深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法 1. 各种GC的触发 ...

  2. JVM之深入理解JVM内存结构(Java内存结构/Java内存区域)、Java内存模型

    Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文我们要讨论的JVM内存结构.JAVA内存结构.JAVA内存 ...

  3. 深入理解JVM文章合集

    原文地址:http://ddrv.cn/a/88331 Java动态追踪技术探究 在Java虚拟机中,字符串常量到底存放在哪 一次生产 CPU 100% 排查优化实践 聊聊 Java 虚拟机:类的加载 ...

  4. Java快速创建大量对象_3分钟 快速理解JVM创建对象的步骤!

    原标题:3分钟 快速理解JVM创建对象的步骤! 我们平时创建一个对象只需要new.然而我们知道对象的创建到底经历了哪些呢?实际上只不过仅仅的3步就完成了.先来看看完整的创建过程,再来一步一步的分析. ...

  5. java visualvm远程监控_深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...

  6. [译]深入理解JVM

    深入理解JVM 原文链接:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals 每个使用Java的开发者都知道Java ...

  7. 深入理解JVM(一)编译openJDK

    此文总结的很不错:https://www.cnblogs.com/ACFLOOD/p/5528035.html 准备openJDK源码和环境 1.在linux和macOS上编译openJDK更加友好, ...

  8. 深入理解JVM(2)——GC算法与内存分配策略

    说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...

  9. java 句柄池_深入理解JVM之Java对象的创建、内存布局、访问定位详解

    本文实例讲述了深入理解JVM之Java对象的创建.内存布局.访问定位.分享给大家供大家参考,具体如下: 对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含 ...

最新文章

  1. 学Python的好处有哪些?
  2. amaze ui各个模块简单说明
  3. python---4
  4. 人类信息接收过去、现在与未来 ——我对于内容产业的判断
  5. C#模拟网站登录介绍
  6. android paint 线宽_android Paint 设置线宽setStrokeWidth()的单位
  7. linux的物理内存中swap压缩,linux中Centos7增加swap分区详解
  8. HBase配置(伪分布式模式)
  9. 一步一步学Silverlight 2系列(5):实现简单的拖放功能_转载
  10. Hibernate---简介
  11. [处理数据的心得][1]--相关矩阵的可视化
  12. 一种可以穿透还原卡和还原软件的代码(转)
  13. “00后”消费数据分析,一文教你撩动“00后”购物欲
  14. 杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法
  15. 电影爱好者福利,一些电影网站汇总
  16. java模拟器怎么调中文_电脑java模拟器(javagame模拟器)
  17. HDU 6318 Swaps and inversions
  18. 光纤设备及跳线接口图鉴
  19. 学会做笔记-子弹笔记学习概要一
  20. ADV-201 我们的征途是星辰大海

热门文章

  1. 与NLP博士的问答(干货满满)
  2. 如何使用老毛桃PE启动盘给电脑重装系统
  3. 激光雷达--资料汇总
  4. ik中文分词器安装以及简单新增词典操作
  5. 【愚公系列】2023年06月 移动安全之安卓逆向(IDA动态分析)
  6. 视频添加图片水印?教你一招,给视频添加自己的水印
  7. 多传感器融合感知:传感器外参标定及在线标定算法详解
  8. 南京师范大学计算机技术调剂,2016年南京师范大学接收双“985工程”高校优秀调剂生...
  9. linux ls -l命令含义
  10. Thinkpad 各系列简介