JVM(Java SE 11版本)加载类和接口
本文介绍了Java虚拟机(Java SE 11版本)加载类和接口。
加载类和接口
加载是指查找具有特定名称的类或接口类型的二进制形式的过程。典型的做法是,查找事先由Java编译器从源代码计算而来二进制表示,但也可能是通过动态计算。 二进制形式最终会构造成一个Class对象。
加载的精确语义在Java Java Machine Specification,Java SE 11 Edition的第5章中给出。在这里,我们从Java编程语言的角度概述了该过程。
类或接口的二进制格式通常是上面引用的Java虚拟机规范Java SE 11版中描述的类文件格式,但只要满足第13.1节中规定的要求,其他格式也是可能的。
类ClassLoader的方法defineClass可用于从类文件格式的二进制表示构造Class对象。
表现良好的类加载器维护这些性质:
- 给定相同的名称,一个好的类加载器应该总是返回相同的类对象。
- 如果类加载器L1将类C的加载委托给另一个加载器L2,那么对于作为直接超类或C的直接超接口出现的任何类型T,或作为C中的字段类型,或作为类型方法的正式参数或 C中的构造函数,或者作为C,L1和L2中方法的返回类型应该返回相同的Class对象。
恶意类加载器可能违反这些性质。但是,它不能破坏类型系统的安全性,因为Java虚拟机可以防范这种情况。
有关这些问题的进一步讨论,请参阅Java虚拟机规范,Java SE 11版和Java虚拟机中的动态类加载,作者:Sheng Liang和Gilad Bracha,作为ACO SIGPLAN发布的OOPSLA '98会议录。通告,第33卷,第10期,1998年10月,第36-44页。Java编程语言设计的基本原则是运行时类型系统不能被用Java编程语言编写的代码破坏,即使是这样的实现也是如此。否则敏感的系统类如ClassLoader和SecurityManager。
加载过程
加载过程由类ClassLoader及其子类实现。
ClassLoader的不同子类可以实现不同的加载策略。特别地,类加载器可以缓存类和接口的二进制表示,基于预期的使用来预取它们,或者将一组相关的类加载在一起。 例如,如果找不到新编译的类,因为旧版本由类加载器缓存,这些活动可能对正在运行的应用程序不完全透明。但是,类加载器的责任是仅在程序中可能出现的情况下反映加载错误,而无需预取或组加载。
如果在类加载期间发生错误,那么将在程序中(直接或间接)使用该类型的任何点抛出类LinkichError的以下子类之一的实例:
- ClassCircularityError:无法加载类或接口,因为它将是自己的超类或超接口(第8.1.4节,第9.1.3节,第13.4.4节)。
- ClassFormatError:声称指定所请求的编译类或接口的二进制数据格式错误。
- NoClassDefFoundError:相关类加载器无法找到所请求的类或接口的定义。
因为加载涉及新数据结构的分配,所以它可能会因OutOfMemoryError而失败。
参考引用
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Container及其内部进程监控剖析
目前市场上的虚拟化技术种类很多,例如moby(docker)、LXC、RKT等等。在带来方便应用部署和资源充分利用的好处的同时,如何监控相应Container及其内部应用进程成为运维人员不可避免遇到的新情况。UAV.Container从虚拟化技术的基础原理和Linux操作系统的内核特性出发,得到Container容器和内部进程的各维度监控数据,使无论是虚拟机或物理机运维人员,还是业务运维人员角度,都能得到合适的监控维度。 虚拟化技术从基础原理上主要是cgroups、namespace和file system的应用,而操作系统作为cgroup和namespace根节点,无论在container里启动何种应用,从内核角度上来说,肯定在操作系统有其一定的特征和表现形式。我们需要做的就是对这些特征做加工处理,以得到相应的监控数据。 下面我们以docker技术举例,其他虚拟化技术类似。 1. Container ID Container ID是一个Container的唯一标识。从容器监控的角度我们需要能得到该进程在哪个Container里运行。在操作系统层面,进程的cgroup的挂载情况就能有所...
- 下一篇
如何用CSS3画出懂你的3D魔方?
前言 最近在写《每周动画点点系列》文章,上一期分享了< 手把手教你如何绘制一辆会跑车 >,本期给大家带来是结合CSS3画出来的一个立体3d魔方,结合了js让你随心所欲想怎么转,就怎么转,这里是 @IT·平头哥联盟,我是首席填坑官∙苏南(South·Su),我们先来看看效果,然后再分解它的实现过程吧 作者:首席填坑官∙苏南 交流:912594095、GZ好:honeyBadger8,本文原创,著作权归作者所有,转载请注明原链接及出处。 绘制过程: 好吧,gif图看着好像有点不是很清晰,想在线预览的同学,可点击在线预览 ,废话不多扯了,先来分析一下,看如何实现这个功能吧。 ∙ API预热 : 本次示例是一个立体的正方形,既然有立体效果,肯定少不了CSS3中的 -webkit-perspective-透视、preserve-3d-三维空间,这个两个是重点哦,当然还有transform-origin、transition、transform等,先来回故一下 API 怎么是讲的吧: perspective 取值 : none :不指定透视 ; length :指定观察者与「z=0」平...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程