`
matchless1688
  • 浏览: 26442 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

深入JVM学习笔记 连接模型

阅读更多
连接模型

1、Class文件中的常量池<——映射——>类型的运行时常量池(JVM装载后产生的内部版本的常量池,是一个特定于实现的数据结构)

2、动态扩展的两种方法:Class.forName()  ClassLoader.loadClass()
   区别:前者的单参数或者三参数且initial为true可以保证返回的类型一定被初始化了。后者返回的类型有可能没有初始化,后者适合用户自定义加载机制(特定的装载需求或者安全性考虑)

3、双亲委派模型 —— 推荐使用双亲委派模型来创建类加载器
   --当符合双亲委派模型的类装载一个类型的时候,它首先委派它的双亲——请求它的双亲试着装载这个类型,它的双亲再依次调用各自的双亲。这个委派的过程一直进行到委派链的末端,一般来说应该是启动类装载器。
  
   --在Java术语中,要求某个类装载器去装载一个类型,但是却返回了其他类装载器装载的类型,这种装载器被称为是那个类型的初始类装载器(包括定义的那个);而实际定义那个类型的类装载器被称为该类型的定义类装载器。
  
4、常量池解析
  --数组类:如果是关于引用的数组,数组会被标记为是由定义它的元素类型的类装载器定义的;如果是关于基本类型的数组,数组类会被标记为是由启动类装载器定义的。
  如果数组是关于基本类型的数组,那么虚拟机立即就会创建关于那个元素类型的新数组类,维数也在此时确定,然后创建一个Class的实例来代表这个类型。如果数组是关于引用的数组,那么这一步骤发生在解析了元素类型之后。
 
  --非数组类和接口
    每一个Java虚拟机必须维护一张内部列表,它列出了所有在运行程序的过程中已被"拘留intern"的字符串对象的引用。维护这个列表的关键是任何特定的字符序列在这个列表上只出现一次。
    所有字面上表达的字符串都在解析CONSTANT_String_info入口的过程中被拘留了。
    例如:
Class Example{
    		public void main(String[] args){
    			String argZero = args[0]; //it's assigned a String from the command line,does                                                   //not reference a string literal.so not interned.
    			String literalString = "Hi";
    			
    			System.out.println("Before intern..");
    			if(argZero == literalString)
    				System.out.println("They are same");
    			else 
    				System.out.println("They are different");
    			
    			System.out.println("After intern..");
    			argZero = argZero.intern();
    			if(argZero == literalString)
    				System.out.println("They are same");
    			else 
    				System.out.println("They are different");
    		}
    	  }

    运行结果(把字符串"Hi"作为命令行第一个参数),第一次不相同,第二次相同;
   
  --装载约束
 
 
  --编译时常量解析
    被初始化为编译时常量的静态final变量的引用,在编译时被解析为常量池的一个本地拷贝,这对于所有的基本类型和java.lang.String都是正确的。这种对于常量的特殊处理使Java语言具有了两个特性。
    首先,常量值的本地拷贝使得静态final变量可以用于switch语句中的case表达式。在字节码中实现switch语句需要case值内嵌在字节码流中。这些指令不支持运行时解析case值。
    其次,另一个动机就是条件编译。
   
  --直接引用的格式
    对于实例方法和实例变量都是通过偏移量寻找,而且子类相应覆盖方法的偏移量和父类保持一致。对于每个类型,它都有一个单独的方法表。例如java.lang.Object中toString()方法的偏移量是7,那么继承它的子类的toString()在它的方法表中的偏移量也是7。
   
    当虚拟机有一个指向类类型的引用的时候,它总是可以依靠方法表偏移量。如果在Dog类中sayHello()方法出现在偏移量7,那么在Dog的所有子类中它都出现在偏移量7.不过当引用是指向接口类型时,这就不成立了。当通过接口引用来访问实例方法的时候,直接引用不能保证得到方法表偏移量,必须搜索对象的类的方法表来找到一个合适的方法。这种调用接口引用的实例方法的途径会比在类引用上调用实例方法慢很多。
   
  --对于CONSTANT_String_info入口的解析过程
  例如 ldc #3。ldc指令引用了第3个常量池入口,那是一个CONSTANT_String_info入口,表示指向文字字符串"Hello World"的符号引用,虚拟机在常量池中查找,发现这个入口还没有被解析过。为了解析它,虚拟机创建一个值为"Hello World"的新字符串对象,并且在内部拘留它,然后把这个新对象的引用放到常量池入口3,把ldc指令替换成ldc_quick。
 
  --当Java虚拟机解析一个符号引用的时候,它使用和定义引用类型的同一个类装载器来初始装载被引用的类型。
 
  --类型安全性问题
    出现原因:因为在一个Java虚拟机中的多个命名空间可能共享类型。如果某个类装载器委派另外一个类装载器,而后者定义了这个类型,这两个类装载器都会被标记为这个类型的初始类装载器。被委派的类装载器装载的这个类型,在所有被标记为该类型的初始类装载器的命名空间中共享。——产生"类型混淆"问题
   
    要唯一的确定一个类型,Java虚拟机需要知道类型的全限定名以及这个类型的定义类装载器(与初始类装载器区分)。
   
    装载约束:当多个类装载器被标记为同名类型的初始化加载器后,便会有一个装载约束记录下来(这两个装载器中的类型必须为同一个类型),在以后的解析中,便会进行比较,从而避免类型混淆的发生。
  • 大小: 121.3 KB
  • 大小: 244.5 KB
分享到:
评论

相关推荐

    java之jvm学习笔记十一(访问控制器)-源码

    本文将深入探讨JVM中的访问控制器,主要基于“java之jvm学习笔记十一(访问控制器)-源码”这一主题,以及相关的源码分析。 首先,我们得了解Java的安全模型。Java安全模型基于一种称为安全管理器(SecurityManager)...

    JVM学习笔记核心知识点整理

    ### JVM学习笔记核心知识点整理 #### 一、引言与背景 随着软件开发技术的不断发展,Java作为一种广泛应用的编程语言,其背后的核心技术——Java虚拟机(JVM)的重要性日益凸显。掌握JVM不仅可以帮助开发者更好地理解...

    java之jvm学习笔记九(策略文件)

    本篇笔记将深入探讨Java策略文件的概念、结构以及如何使用。 策略文件是Java安全模型的一部分,它定义了哪些代码可以执行特定的操作,例如访问网络、读写文件或运行系统命令。这些限制通常基于代码的来源,比如是否...

    Java分布式应用学习笔记02再谈JVM

    ### Java分布式应用学习笔记02再谈JVM 在深入探讨Java虚拟机(JVM)时,我们再次聚焦于这个核心组件,它不仅是Java运行环境的心脏,也是构建分布式应用的关键技术之一。JVM作为Java语言的核心执行环境,其设计与...

    j2se学习笔记和java学习笔记

    本学习笔记旨在深入理解J2SE的基础概念、核心特性以及实际应用。 一、Java基础 Java是一种面向对象的编程语言,由Sun Microsystems(现已被Oracle收购)于1995年发布。它的主要特点包括跨平台性(Write Once, Run ...

    韩顺平编写的java学习笔记(全)

    韩顺平编写的《Java学习笔记》全面涵盖了Java的基础知识和发展方向,不仅适合初学者入门,也适合进阶开发者深入了解Java的各项技术栈。通过对本书的学习,读者能够掌握Java的核心概念、编程技巧以及实际应用场景,为...

    JVM和性能优化学习思维笔记.rar_java

    在深入理解JVM与性能优化的过程中,我们需要关注以下几个关键知识点: 1. **JVM架构**:JVM主要由类加载器、运行时数据区、执行引擎、本地方法接口和本地库组成。每个部分都有其特定的功能,如类加载器负责加载类到...

    JAVA学习笔记JDK6课件含演示代码

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。...每个主题都可以深入研究,例如深入理解JVM内存模型、优化多线程程序、利用NIO实现高性能服务器等,这将有助于提升为一名专业Java开发者。

    软件工程师JAVA学习笔记

    这份“软件工程师JAVA学习笔记”不仅覆盖了Java的基础知识,还深入到高级特性和实践应用,是学习和提升Java技能的宝贵资料。通过系统学习并实践其中的内容,相信你将能够成为一个出色的Java软件工程师。如果你在学习...

    Jack_《JVM从入门到入魔》笔记.pdf

    Java虚拟机(JVM)是Java开发的核心组成部分,它是实现Java“一次编写,到处运行”(Write Once Run Anywhere,WORA)理念的关键。...在学习过程中,结合实战项目和开源工具的使用,可以更深入地体会JVM的精髓。

    Java架构面试专题汇总(含答案)和学习笔记.zip

    这个压缩包包含的学习笔记和习题集全面覆盖了Java架构师所需的核心知识点,下面我们将深入探讨其中的关键内容。 1. **Java基础** - **数据类型与变量**:理解基本数据类型、引用数据类型,以及它们在内存中的存储...

    Java学习笔记JDK6.rar

    这份"Java学习笔记JDK6.rar"压缩包显然是一份针对初学者或希望深入理解Java基础的开发者的学习资料,它涵盖了JDK6版本的相关知识。 在JDK6中,有几个关键的知识点值得深入探讨: 1. **基础语法**:Java的基础语法...

    java学习笔记JDK6课件和课本代码

    8. **JVM内存模型**:理解Java虚拟机的工作原理,包括垃圾收集机制。 9. **单元测试**:学习如何使用JUnit进行代码测试,确保程序的正确性。 10. **项目实践**:通过实际的小项目来综合运用所学知识,提高编程能力...

    Java架构面试专题寒冬(含答案)和学习笔记.zip

    这份资料旨在帮助求职者全面了解并掌握Java核心技术,包括但不限于基础语法、多线程、并发编程、JVM内存模型、设计模式、Spring框架、数据库、微服务等关键领域。以下是这些知识点的详细解析: 1. **Java基础**: ...

    CoreJava学习笔记.doc

    本学习笔记旨在深入浅出地介绍Java的核心概念,帮助初学者快速掌握这一强大的工具。 1. Java特点 Java语法简洁且严谨,与C++相比,它去除了指针、内存管理等复杂特性,降低了程序出错的可能性。Java的一大亮点在于...

    java学习笔记4

    Java学习笔记第四部分主要涵盖了Java编程语言的深入学习内容,可能是继基础语法、面向对象编程之后的高级主题。"良葛格"作为编著者,可能以易懂且实用的方式阐述了这些概念。以下是根据标题和描述可能包含的知识点:...

    信息系统项目管理师学习笔记

    【信息系统项目管理师学习笔记】是一份针对信息系统项目管理的专业学习资料,主要涵盖了信息系统的基础知识、软件工程原理以及软件构件和中间件的应用。以下是对这些知识点的详细解释: 1. **信息系统生命周期**:...

    良葛格Java JDK 5.0学习笔记

    良葛格的这本学习笔记详细记录了这些关键知识点,为初学者和有经验的开发者提供了深入理解Java 5.0的宝贵资料。 首先,JDK 5.0对类型安全进行了增强,引入了泛型(Generics)。泛型允许在定义类、接口和方法时指定...

    java学习笔记刚学习。

    这份"java学习笔记"显然是针对初学者的,旨在帮助他们理解和掌握Java的基础知识。下面将详细阐述Java的一些核心概念和重要知识点。 1. **Java基础语法**: Java是一种面向对象的语言,它的语法基于C++,但更简洁、...

    Java JDK 6学习笔记

    Java JDK 6学习笔记是针对Java开发环境的重要参考资料,它涵盖了Java Development Kit(JDK)6版本的关键特性和使用方法。JDK是Java编程语言的核心工具集,包含了编译器、调试器、JVM(Java虚拟机)以及一系列用于...

Global site tag (gtag.js) - Google Analytics