当前位置: 首页 > news >正文

成都网站开发制作中国新设计师联盟

成都网站开发制作,中国新设计师联盟,全网vip视频网站怎么做,wordpress数据库恢复插件在操作系统OS中为了优化内存的使用会采用一种动态链接方式#xff0c;一个文件想要在操作系统中运行必须经过编译、汇编译、链接、装载等步骤。可以参考Java程序是怎么跑起来的。本篇主要讲解Java栈帧中动态链接部分与操作系统的的动态链接的区别与联系操纵系统为什么需要动态… 在操作系统OS中为了优化内存的使用会采用一种动态链接方式一个文件想要在操作系统中运行必须经过编译、汇编译、链接、装载等步骤。可以参考Java程序是怎么跑起来的。本篇主要讲解Java栈帧中动态链接部分与操作系统的的动态链接的区别与联系操纵系统为什么需要动态链接OS是向下统一管理机器硬件、向上给各个应用程序提供统一的系统调用的程序。其中对内存的管理也是重头戏以下是32位Linux操作系统中虚拟内存的空间分配图每一个应用程序看到的内存就是这样的一段虚拟内存空间。应用程序的代码指令就存储在.text段也叫代码段只读。.data段也叫数据段用于存储程序的静态变量、全局变量可读可写在应用程序的运行中除了运行自身的代码指令外还需要加载一些系统的公共库比如用于网络收发的socket库等。在windows中这些共享库以.dll(Dynamic-Link Libary 动态链接库)结尾在Linux中以.so(Shared Object)结尾。加载这些共享库可进行对系统资源的调用静态链接当应用程序代码经历链接过程生成可执行文件时每链接一个共享库就将共享库代码复制一份进应用程序的可执行文件中因此有多少应用程序调用同一个共享库文件该共享库文件中的代码就在内存中加载多少份动态链接在没用动态链接前系统确实是采用静态链接的方式链接共享库但是发现对内存的使用是一种极大的浪费因此动态链接孕育而生。为了达到各个应用程序只加载同一个共享库但内存只存在一份共享库代码动态链接首先解决的技术问题是地址无关性PLT、GOT表解决地址无关性我们都知道程序代码指令加载进内存的代码段是可执行只读的无法动态的修改代码指令。那么当共享库载入内存中时是怎么被各个不同的应用程序找到的呢其实在应用程序的可执行文件加载进内存后该程序的内存数据段(.data)存在一张GOT(Global Offset Table)全局偏移表GOT表中当有需要引用共享库地址的方法指令都会查询 GOT根据GOT表找到共享库方法指令的地址位置并调用。因为GOT存在于数据段因此当共享库发生变化时应用程序也不需要重新编译可以直接动态的改变GOT表中的虚拟内存从而找到最新的共享库。共享库载入实际的物理内存虽然物理内存不会变但是每个应用程序看到的虚拟内存不一样所以共享库在不同的应用程序中的虚存地址是不一样的好在每个应用程序都拥有自己的GOT表能够准确的记录了共享库的位置。这也就达到了地址无关性。PLT(Procedure Link Table)程序链接表存在于内存的代码段中主要是用于延迟绑定我们可以将其理解为跳表。应用程序先是调用PLT表中查询需要调用的GOT表的地址位置跳到GOT表后查询出共享库的虚存然后再去调用共享库方法。因为很多动态装载的函数库都是不会被实际调用到的而共享库中存在非常多的函数因此采用PLT可达到延迟加载。像动态链接这样通过修改“地址数据”来进行间接跳转去调用一开始不能确定位置代码的思路Java中的多态也采用了这种思想。Java栈帧中的动态链接以前的文章中解释了栈帧(拆解栈帧中本地变量表)其中动态链接也是组成栈帧的一部分。在上面对OS的解释中动态链接是一种技术名称在Java栈帧这里怎么就成了一个实体了呢其实根据Java虚拟机对动态链接的描述翻译成中文就是一个【引用】那么栈帧存在的这个【引用】是干什么的呢在解释这个【引用】的作用之前还是先说明一点Java栈帧中的动态链接的目的其实跟OS的是一样的都是为了节省内存空间知道这个目的后我们再说明为什么可以节省。也因此在看JVM的时候我总是会与OS做类比。这个【引用】在虚机规范的解释为指向运行时常量池的方法引用。每当栈帧中调用其他方法时都会存在一个【引用】。在.class文件中所有的变量和方法引用都是符号引用(Symbolic Reference)也就是下面字节码中的 #数字。比如下面用javap反编译的.class文件中的Constant pool。public class com.ethan.chapter02.Test02LocalVariablesminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPERConstant pool:   #1  Methodref          #7.#28         // java/lang/Object.:()V   #2  Class              #29            // com/ethan/chapter02/Test02LocalVariables   #3  Methodref          #2.#28         // com/ethan/chapter02/Test02LocalVariables.:()V   #4  Methodref          #2.#30         // com/ethan/chapter02/Test02LocalVariables.test3:()V   #5  Long               100l   #7  Class              #31            // java/lang/Object   #8  Utf8                  #9  Utf8               ()V  #10  Utf8               Code  #11  Utf8               LineNumberTable  #12  Utf8               LocalVariableTable  #13  Utf8               this  #14  Utf8               Lcom/ethan/chapter02/Test02LocalVariables;  #15  Utf8               main  #16  Utf8               ([Ljava/lang/String;)V  #17  Utf8               args  #18  Utf8               [Ljava/lang/String;  #19  Utf8               variablesTable  #20  Utf8               num  #21  Utf8               I  #22  Utf8               test3  #23  Utf8               q  #24  Utf8               J  #25  Utf8               a  #26  Utf8               SourceFile  #27  Utf8               Test02LocalVariables.java  #28  NameAndType        #8:#9          // :()V  #29  Utf8               com/ethan/chapter02/Test02LocalVariables  #30  NameAndType        #22:#9         // test3:()V  #31  Utf8               java/lang/Object{public com.ethan.chapter02.Test02LocalVariables();    descriptor: ()V    flags: ACC_PUBLIC    Code:      stack1, locals1, args_size10: aload_01: invokespecial #1                  // Method java/lang/Object.:()V4: return      LineNumberTable:        line 10: 0      LocalVariableTable:        Start  Length  Slot  Name   Signature0       5     0  this   Lcom/ethan/chapter02/Test02LocalVariables;public static void main(java.lang.String[]);    descriptor: ([Ljava/lang/String;)V    flags: ACC_PUBLIC, ACC_STATIC    Code:      stack2, locals3, args_size10: new           #2                  // class com/ethan/chapter02/Test02LocalVariables3: dup4: invokespecial #3                  // Method :()V7: astore_18: bipush        1010: istore_211: aload_112: invokevirtual #4                  // Method test3:()V15: return      LineNumberTable:        line 12: 0        line 13: 8        line 14: 11        line 15: 15      LocalVariableTable:        Start  Length  Slot  Name   Signature0      16     0  args   [Ljava/lang/String;8       8     1 variablesTable   Lcom/ethan/chapter02/Test02LocalVariables;11       5     2   num   Ipublic void test3();    descriptor: ()V    flags: ACC_PUBLIC    Code:      stack2, locals4, args_size10: ldc2_w        #5                  // long 100l3: lstore_14: bipush        106: istore_37: return      LineNumberTable:        line 20: 0        line 21: 4        line 22: 7      LocalVariableTable:        Start  Length  Slot  Name   Signature0       8     0  this   Lcom/ethan/chapter02/Test02LocalVariables;4       4     1     q   J7       1     3     a   I}在.class文件中的常量池会随着文件被加载而转换进JVM中的运行时常量池中。由于存在了这些【符号引用】可以使用Java层面的动态链接技术将这些符号引用转换为调用方法的直接引用。比如字节码中的 invokevirtual指令就能够支持动态链接。在类加载子系统中一个.class文件被加载进JVM共需要经历3步骤加载-链接-初始化。而在链接阶段中的第三步【解析】的目的就是将常量池内的符号引用转换为直接引用的过程也就是动态链接产生的过程。我们类比一下OS的动态链接与Java的动态链接。Java的.class文件类比于OS的每一个应用程序的可执行文件.class文件中的常量池类比于GOT表java的运行时常量池类比于共享库。java产生动态的链接是在.class的解析阶段根据.class文件中的符号引用去查询常量池然后将.class文件中的符号引用转换为直接应用并存于栈帧中。因为在加载不同的.class文件时都可能调用相同的常量或者方法所以只需要在运行时常量池存储一份然后记录其直接引用即可因此节省了空间。解释完Java层面的动态链接我们也就能解释Java多态的实现过程了在Java源代码编译期间方法的重写导致无法确认出调用方法的真正位置只有在运行时将符号引用转为为直接应用采用确定方法的位置。这个过程也就是在【解析】阶段实现的。这种编译时期无法确定方法的调用位置只能够在程序运行期根据实际的类型绑定相关方法这种绑定方式也就被称之为晚期绑定。
http://www.pierceye.com/news/312919/

相关文章:

  • 购物网站设计的目的wordpress 游戏主题下载失败
  • 兰州最好的网站开发公司单页网站是什么样子的
  • 在线购物商城网站江苏营销型网站
  • 如何在百度上为企业做网站wordpress轮播图设置
  • qt 网站开发怎样开发一个app软件
  • html5博客网站模板泉州市住房与城乡建设网站
  • 没网站怎么做app创意设计图片
  • 重庆涪陵网站设计公司推荐外贸优化网站制作
  • 网页怎么制作四页石家庄seo排名外包
  • 高校信息化建设 网站东阳网络科技有限公司
  • 网站 如何做 中英文切换网站怎么提升关键词排名
  • 企业只有建立自己的网站平台金坛建设局网站
  • 网站建设及维护费用网站开发质量控制计划书
  • dede免费网站模板内蒙古住房与建设官方网站
  • 网络设计开发网站电子商务网站建设财务分析
  • 牛商做网站的理念国外便宜域名注册商
  • 深圳网站制作880网页设计与制作教程 个人简历代码
  • 皇岗网站建设济南市住房和城乡建设局
  • 产品创新设计方案seo 网站案例
  • 做名片最好的网站上海网站开发制作公司
  • 网站如何做三端适配wordpress get_the_author_meta
  • 个人介绍微电影网站模板网站制作策划
  • 怎么在网上注册自己的网站网站框架建设
  • 哪个网站做自媒体比较好广西模板十大名牌排名榜
  • 苏州手机网站制作建设视频网站费用
  • 301的网站用什么来做为企业为什么做网站
  • wordpress怎安装关键词优化排名易下拉排名
  • 怎么做网站评估android安卓软件下载
  • 网站建设设计培训班南昌广告公司
  • 网站问责建设书企业网站建设 百度文库