java虚拟机
- 格式:doc
- 大小:884.50 KB
- 文档页数:28
java 虚拟机规范Java虚拟机规范(Java Virtual Machine Specification)是由Java语言设计者为了保证Java程序在任何平台上都能够运行,而定义的虚拟机的行为规范。
本文将详细介绍Java虚拟机规范,内容约1000字。
Java虚拟机规范定义了Java虚拟机(JVM)的结构、指令集、运行时数据区域、内存管理、异常处理、线程和同步等方面的规范。
通过遵循这些规范,开发者可以编写出具有良好可移植性和跨平台性的Java程序。
首先,Java虚拟机规范定义了JVM的结构。
JVM由类加载器、运行时数据区域、执行引擎和本地方法接口等组成。
类加载器负责加载类文件,并进行验证、解析和初始化。
运行时数据区域则包括了方法区、堆、虚拟机栈、本地方法栈和程序计数器等。
执行引擎根据操作码执行相应的指令,并对操作数栈和局部变量表进行操作。
本地方法接口则是Java虚拟机与本地操作系统的接口。
其次,Java虚拟机规范定义了JVM的指令集。
指令集包括了加载、存储、算术运算、类型转换、比较和控制流等各种指令。
每个指令都对应了Java虚拟机的一种行为,可以通过指定操作数来执行相应的操作。
Java虚拟机规范还定义了JVM的运行时数据区域。
运行时数据区域包括了方法区、堆、虚拟机栈、本地方法栈和程序计数器。
方法区用于存储类的结构信息、常量池、静态变量和方法等。
堆用于存储对象实例和数组。
虚拟机栈用于存储方法调用的局部变量表、操作数栈、动态链接和方法返回值等。
本地方法栈用于支持本地方法的调用。
程序计数器则用于记录当前线程执行的字节码指令地址。
此外,Java虚拟机规范还定义了JVM的内存管理、异常处理、线程和同步等方面的规范。
内存管理包括了垃圾收集和内存分配等。
异常处理定义了异常的分类、异常的处理流程和异常的处理方式。
线程规范包括了线程的创建、启动、执行和销毁等。
同步规范则定义了同步的机制和语义。
总结起来,Java虚拟机规范定义了Java虚拟机的行为规范,包括了JVM的结构、指令集、运行时数据区域、内存管理、异常处理、线程和同步等方面的规范。
java虚拟机的工作原理Java虚拟机(JVM)是Java程序运行的环境,它负责解释和执行Java字节码。
JVM的工作原理可以分为三个主要的部分:类加载、字节码执行和垃圾回收。
1.类加载:JVM通过类加载器将Java字节码加载到内存中。
类加载器根据类路径在文件系统或网络中查找并读取字节码文件,然后将其转化为JVM运行时数据结构,如类和方法的元数据。
加载完成后,JVM会在方法区中存储类的元数据,并在堆中分配内存来存储类的实例。
2.字节码执行:3.垃圾回收:JVM提供垃圾回收机制来自动释放不再使用的内存。
JVM会跟踪每个对象的引用,当一个对象没有引用时,即被视为垃圾。
垃圾回收器定期执行垃圾收集操作,释放垃圾对象占用的内存。
垃圾回收器有不同的实现策略,如标记-清除、引用计数、复制、标记-整理等。
除了以上三个主要的部分,JVM还包含其他组件,如堆内存、栈、方法区等。
堆内存用于存储对象实例,栈用于存储局部变量和方法调用参数,方法区用于存储类的元数据和静态数据。
JVM的工作过程如下:1. 通过类加载器加载Java字节码。
2.解释执行或JIT编译字节码。
3.根据需要进行垃圾回收和内存管理。
4.执行程序。
JVM的优点是跨平台性、自动内存管理和高性能。
通过JVM,Java程序可以在不同的硬件和操作系统上运行,无需修改源代码。
JVM的自动内存管理功能减轻了开发人员对内存管理的负担,避免了内存泄漏和越界访问等错误。
JVM的即时编译技术能够将热点代码优化为本地机器代码,提高程序的执行效率。
在实际的Java应用开发中,了解JVM的工作原理有助于编写高效的代码和解决性能问题。
开发人员可以通过调整JVM参数、选择合适的垃圾回收器和内存分配策略来优化程序的性能。
同时,了解JVM的工作原理还有助于理解虚拟机层面的问题和调优技巧,提升应用的可靠性和稳定性。
八股文java面试题一、Java面试题1.JVM(Java虚拟机)的作用是什么?JVM是Java虚拟机的简称,它可以在操作系统之上独立运行,是用于运行Java程序的虚拟机,它通过编译Java源代码,并将它转换为与硬件无关的JVM可执行程序,能够做到跨平台,且拥有安全性、负责性、健壮性和可伸缩性等特点,可以使Java程序在计算机上运行。
2.Java垃圾回收机制的原理是什么?Java垃圾回收机制是通过“引用计数”和“可达性分析”算法去探测到未使用的内存,来调整可用的内存。
“引用计数”就是将每一个内存单元与其他内存单元的引用被计算,以确定它是否被引用,如果没有任何的引用则说明该内存不再使用,可以做回收。
“可达性分析”是一种自动分析可达内存的技术。
当Java程序运行时,垃圾回收器会通过从根对象(如类或线程)到目前可访问对象的跟踪对象,来判断对象和空间之间的关系,以确定哪些对象或空间应该被回收。
3.什么是java的三大特性?1) 跨平台性:Java可以在多种类型的操作系统上运行,例如Windows、Linux、Unix等,只要将Java编译成本机的指令就可以运行,因此Java 可以说是跨平台的;2) 可移植性:Java代码可以在不同平台方便地移植;3) 安全性:Java的安全性涉及Java语言的安全特性和Java的安全体系,Java语言提供了一些访问控制机制,使开发者只能访问具有受保护状态的类和方法,同时Java安全体系还提供了一套安全策略,管控Java小应用和原始Java构件的访问权限。
4.Java数组是如何实现的?Java数组是一种特殊的对象,它允许存储任意类型的对象的集合,他的实现有两种方式:一种是用Java的Array类,每个元素都有一个下标,可以使用get和set方法访问数组元素;另一种是用Java语言自己实现,可以使用数组拷贝、搜索和排序等方法来处理数组。
5.Java泛型的含义是什么?Java泛型是在Java中提供的非常有用的编译时类型安全机制,可以在编译时检查类型安全。
深入理解java虚拟机(一)虚拟机内存划分Java虚拟机在执行Java程序时,会把它管理的内存划分为若干个不同的数据区。
这些区域有不同的特性,起不同的作用。
它们有各自的创建时间,销毁时间。
有的区域随着进程的启动而创建,随着进程结束而销毁,有的则始终贯穿虚拟机整个生命周期。
Java虚拟机运行时内存区域主要分为七部分,分别是:程序计数器,Java虚拟机栈,本地方法栈,方法区,Java堆,运行时常量池,直接内存。
如上图所示(图片来源于网络):蓝色区域包裹的部分为运行时几个数据区域:白色的部分为线程私有的,既随着线程的启动而创建。
每个线程都拥有各自的一份内存区域。
它们是:JAVA栈(JAVA STACK),本地方法栈(NATIVE METHOD STACK),和程序计数器(PROGRAM COUNTER REGISTER)。
黄色部分是线程共享的,所有的线程共享该区域的内容。
他们是:方法区(METHOD AREA),堆(HEAP)。
我们分别来介绍这些区域。
(1)程序计数器(program counter register)学过计算机组成原理的都知道计算机处理器中的程序计数器。
当处理器执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”。
与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址。
此后经过分析指令,执行指令。
完成第一条指令的执行,而后根据PC取出第二条指令的地址,如此循环,执行每一条指令。
处理器的程序计数器是指寄存器,而java程序计数器是指一小块内存空间。
java代码编译字节码之后,虚拟机会一行一行的解释字节码,并翻印成本地代码。
这个程序计数器盛放的就是当前线程所执行字节码的行号的指示器。
在虚拟机概念模型中,字节码解释器工作室就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理等都依赖于它。
Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,因此为了线程切换后还能恢复执行位置,每条线程都需要一个独立的程序计数器。
recognizes class file version全文共四篇示例,供读者参考第一篇示例:Java虚拟机(Java Virtual Machine)是一种能够执行Java字节码的虚拟机,是Java程序运行的基础。
Java虚拟机可以在任何支持Java的平台上运行,这为跨平台开发提供了便利。
在Java编程中,我们通常会编写Java源代码,然后通过编译器将其编译成字节码文件。
而Java虚拟机会加载并执行这些字节码文件。
在加载字节码文件时,Java虚拟机会检查字节码文件的版本号,以确保其能够正确解析和执行。
Java虚拟机对于不同版本的Java字节码文件都有对应的支持,因此当我们编写Java程序时,需要根据所使用的Java开发工具版本来选择合适的Java字节码版本。
Java虚拟机能够识别和支持的Java字节码版本可以通过java -version命令查看。
Java字节码文件的版本号主要由主版本号和次版本号组成,例如45.0、46.0、47.0等。
主版本号用于表明Java编译器的主要版本,而次版本号则表示该版本的修订号。
Java虚拟机会根据主版本号来确定其是否支持该版本的字节码文件,如果不支持,则会抛出UnsupportedClassVersionError异常。
在Java 8之后,主要的Java版本发布如下:- Java SE 8对应的主版本号是52,是Java 8发布的版本。
- Java SE 9对应的主版本号是53,是Java 9发布的版本。
- Java SE 10对应的主版本号是54,是Java 10发布的版本。
- Java SE 11对应的主版本号是55,是Java 11发布的版本。
- Java SE 12对应的主版本号是56,是Java 12发布的版本。
- Java SE 13对应的主版本号是57,是Java 13发布的版本。
- Java SE 14对应的主版本号是58,是Java 14发布的版本。
MiniJavaVM——一个Java虚拟机的设计和实现摘要本文叙述了Java虚拟机(JVM)的概念及如何设计和实现一个Java虚拟机——MiniJavaVM。
着重介绍了虚拟机的体系结构及如何设计和实现这个体系结构。
在探讨虚拟机的设计过程中详细介绍了MiniJavaVM虚拟机各部分的设计,包括类的装载和解析,内存管理,执行引擎,方法调用和异常处理部分。
最后通过测试MiniJavaVM来验证设计和实现的正确性。
关键词Java虚拟机(JVM) 字节码类装载执行引擎本地方法MiniJavaVM – a design and implementation of a Java Virtual MachineAbstractThis paper describes the conception of Java Virtual Machine (JVM) and how to design and implement a Java Virtual Machine – MiniJavaVM. It emphasizes the architecture of JVM and how to design and implement the architecture. It describes the details about each part of JVM when discussing how to design the JVM, including class-loading and resolution, memory management, execution engine, method invoking andexception-handling. At last, the correctness of the design and implementation is validated by testing MiniJavaVM.KeywordsJava Virtual Machine(JVM), byte code, Class-loading, execution engine, Native Method目录第一章绪论61.1Java及Java虚拟机61.2Java虚拟机的体系结构71.3MiniJavaVM的功能101.4MiniJavaVM的运行环境及开发工具12第二章系统设计142.1唯一的虚拟机MiniJavaVM142.2MiniJavaVM的构成要素142.2.1虚拟机总体框架142.2.2命令参数解析模块162.2.3类的装载和解析模块162.2.4内存管理模块172.2.5执行引擎模块182.2.6方法调用模块182.2.7异常处理模块19第三章虚拟机框架的实现213.1JVM工程223.2JavaVM工程233.2.1Java虚拟机的数据类型和字长考量23 3.2.2JavaVM类253.3JavaNativeCall工程29第四章类的装载和解析314.1Java Class文件314.2Class文件在MiniJavaVM中的数据结构表示334.3类的装载和解析37第五章内存管理435.1对象、堆、方法区的管理435.2MiniJavaVM的垃圾回收过程46第六章执行引擎——Java操作码实现496.1Java虚拟机中的操作码功能分类496.2操作码功能实现——JavaOperatorExecute类52 第七章方法调用的实现537.1Java中的方法调用537.2非本地方法的实现547.3本地方法的实现557.3.1Java中的本地方法557.3.2NativeMethod_access类577.3.3如何处理本地方法可变参数问题57第八章异常的实现608.1Java中的异常608.2异常在MiniJavaVM中的实现60第九章验证MiniJavaVM的正确性629.1MiniJavaVM的使用方法629.2测试操作码实现的正确性659.2.1方法调用的正确性659.2.2数学运算的正确性689.2.3控制流语句的正确性699.3测试本地方法调用71 9.4测试异常处理72第十章不足与后续工作74 10.1本地方法7410.2I/O操作7410.3多线程7410.4效率74致谢76参考文献77第一章绪论1.1Java及Java虚拟机说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。
联想java面试题1. 引言Java作为一门广泛应用于软件开发领域的编程语言,已成为许多公司面试过程中的重要考察要素。
本文将介绍一些常见的联想Java面试题,旨在帮助读者更好地准备面试。
2. Java基础知识2.1 什么是Java虚拟机(JVM)?Java虚拟机(Java Virtual Machine)是Java运行环境的一部分,它负责解释和执行Java字节码,并提供了内存管理、垃圾回收等功能。
2.2 Java中的四个访问修饰符分别是什么?Java中的四个访问修饰符分别是public、protected、default(默认,不用关键字修饰)和private。
它们用于控制类、方法、变量的访问权限。
2.3 什么是Java中的关键字final和finally?关键字final应用于类、方法和变量,用于表示它们是最终的,不可继承、重写或修改。
关键字finally用于定义一个代码块,其中的代码无论是否发生异常都会被执行,通常用于释放资源或进行清理操作。
3. Java面向对象3.1 面向对象的特征有哪些?面向对象的特征包括封装、继承和多态。
- 封装(Encapsulation)将数据和方法封装在一个类中,以达到保护数据、隐藏实现的目的。
- 继承(Inheritance)允许一个类继承另一个类的属性和方法,实现代码的重用性和扩展性。
- 多态(Polymorphism)指对象可以根据具体的类型表现出不同的行为,提高代码的灵活性和可扩展性。
3.2 接口和抽象类有什么区别?接口(Interface)是一种完全抽象的类,它只定义了方法的签名,没有实现。
一个类可以实现多个接口。
抽象类(Abstract Class)是一个只能被继承的类,它可以包含抽象方法和非抽象方法。
一个类只能继承一个抽象类。
4. Java集合框架4.1 Java集合框架的主要接口有哪些?Java集合框架的主要接口有List、Set、Map和Queue等。
深入剖析java虚拟机源码剖析与实例详解《深入剖析Java虚拟机源码剖析与实例详解》一书是近年来Java虚拟机领域的一本经典著作。
本文将从四个方面对这本书进行详细的剖析和评价。
一、内容概述本书主要从解读Java虚拟机的本质来讲解Java虚拟机,全书共分八个章节,内容分为虚拟机概述、运行时内存区域、执行引擎、类加载机制、字节码指令集和类文件结构六大块。
作者通过对Java虚拟机的实现原理剖析和对源代码关键代码的解析,帮助Java开发人员和技术爱好者更好地理解Java虚拟机的实现机制。
二、内容分析1. 虚拟机概述本章主要是介绍了Java虚拟机的工作原理、Java虚拟机与JDK、JRE的关系等,也阐述了一些JVM的基本概念和相应的JVM命令,如应用程序、类、对象、内存划分、垃圾回收、线程、栈等。
2. 运行时内存区域本章主要介绍Java虚拟机运行时内存的区域,分为线程共享区、堆、方法区、程序计数器,其中程序计数器是一种较为特殊的内存区域,主要用来记录线程正在执行的字节码指令的地址。
3. 执行引擎本章主要介绍Java虚拟机的执行引擎,执行引擎是JVM最具有特色的功能之一,主要起到将字节码翻译成具体的硬件指令的作用。
4. 类加载机制本章主要介绍Java类加载的机制,从类文件的加载、连接和初始化这三个阶段来解析。
5. 字节码指令集本章主要介绍了Java字节码指令集,这是Java虚拟机实现的关键之一。
字节码指令集是一个指令集,主要用来描述Java程序的行为。
6. 类文件结构本章主要介绍了Java类文件的内部结构,包括常量池、类信息、字段、方法等内容。
这些知识对于理解Java 虚拟机内部的运行机制和机制实现是非常有帮助的。
三、优点分析1. 按照设计和实现原理展开本书以Java虚拟机的设计原理和实现机制为主干,一步步推展,非常有条理和逻辑。
仔细分析每个过程,熟悉JVM的理论知识,加深JVM使用的理解,促进JVM的实际应用。
4. 说一下 JVM由那些部分组成,运行流程是什么?JVM包含两个子系统和两个组件: 两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。
Class loader(类装载):根据给定的全限定名类名(如:ng.Object)来装载class文件到Runtime data area中的method area。
Execution engine(执行引擎):执行classes中的指令。
Native Interface(本地接口):与native libraries交互,是其它编程语言交互的接口。
Runtime data area(运行时数据区域):这就是我们常说的JVM的内存。
程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解线程A在看直播突然,线程B来了一个视频电话,就会抢夺线程A的时间片,就会打断了线程A,线程A 就会挂起解析栈帧:1. 局部变量表:是用来存储我们临时8个基本数据类型、对象引用地址、returnAddress类型。
(returnAddress中保存的是return后要执行的字节码的指令地址。
)2. 操作数栈:操作数栈就是用来操作的,例如代码中有个 i = 6*6,他在一开始的时候就会进行操作,读取我们的代码,进行计算后再放入局部变量表中去3. 动态链接:假如我方法中,有个 service.add()方法,要链接到别的方法中去,这就是动态链接,存储链接的地方。
4. 出口:出口是什呢,出口正常的话就是return 不正常的话就是抛出异常落一个方法调用另一个方法,会创建很多栈帧吗?答:会创建。
如果一个栈中有动态链接调用别的方法,就会去创建新的栈帧,栈中是由顺序的,一个栈帧调用另一个栈帧,另一个栈帧就会排在调用者下面栈指向堆是什么意思?栈指向堆是什么意思,就是栈中要使用成员变量怎么办,栈中不会存储成员变量,只会存储一个应用地址递归的调用自己会创建很多栈帧吗?答:递归的话也会创建多个栈帧,就是在栈中一直从上往下排下去8. 你能给我详细的介绍Java堆吗?(重点理解)java堆(Java Heap)是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建。
概述什么是Java虚拟化技术?Java虚拟机的基本概念Java虚拟机的工作原理Java程序的编译与执行过程JVM的基本组成和功能类加载器与字节码解释器JIT编译器和运行时优化Java虚拟化技术的应用服务器端应用移动设备应用嵌入式系统应用云计算和大数据应用Java虚拟化技术的挑战与未来性能问题与优化手段安全隐患与防范措施跨平台兼容性与标准化新兴技术的发展与应用结论Java虚拟化技术的原理与实践概述在计算机领域,Java虚拟化技术是一种通过Java虚拟机(JVM)实现的硬件和操作系统无关的编程方式。
它可以将Java程序编译成字节码,然后在不同的平台上运行。
本文将介绍Java虚拟化技术的原理和实践,深入探讨其在不同领域的应用和挑战,并展望其未来发展的方向。
Java虚拟机的工作原理Java程序的编译与执行过程在Java开发中,程序员首先使用Java编译器将Java源代码编译成字节码。
然后,这些字节码被加载到JVM中,并由JVM的解释器将其转换为机器码执行。
这种分阶段的执行方式有助于提高程序的可移植性和跨平台性。
JVM的基本组成和功能JVM由四个主要组件组成:类加载器、字节码解释器、即时编译器(JIT)和运行时数据区域。
类加载器负责加载和验证字节码文件,字节码解释器将字节码转换为机器码执行,JIT编译器则负责将热点代码编译为本地机器码以提高执行效率。
运行时数据区域包括堆、栈、方法区等,用于存储程序执行过程中的数据和运行时状态。
类加载器与字节码解释器类加载器是JVM的关键组件之一,它负责动态加载类文件并将其转换为可执行代码。
字节码解释器则负责解释和执行字节码指令。
这种分离的设计能够在运行时动态加载和执行代码,增强了程序的灵活性和可扩展性。
JIT编译器和运行时优化JIT编译器是JVM中的一个重要组件,它在运行时动态地将热点代码编译为本地机器码。
通过使用JIT编译器,Java虚拟机能够实现更高的执行效率,减少解释器的性能损失。
Java摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想;它提供了一种相对安全的内存管理和访问机制,避免了绝大部分的内存泄露和指针越界问题;它实现了热点代码检测和运行时编译及优化,这使得java应用能随着运行时间的增加而获得更高的性能。
JDK:java程序设计语言、java虚拟机、java API类库。
Java API类库中的java SE API子集和java虚拟机这两部分统称为JRE。
Java技术关注的重点业务领域划分:1.java Card:支持一些java小程序运行在小内存设备上的平台。
2.Java ME:支持java程序运行在移动终端上的平台。
3.Java SE:支持面向桌面级应用的java平台。
4.Java EE:支持使用多层架构的企业应用。
运行时数据区:1.程序计数器:一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。
Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的。
此内存区域是唯一一个在java虚拟机规范中没有规定任何outofmemoryerror情况的区域。
2.Java虚拟机栈:是线程私有的。
它的生命周期与线程相同。
虚拟机描述的是java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。
每一个方法被调用直至执行完成的过程,就对应于一个栈帧在虚拟机栈中从入栈到出栈的过程。
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出stackoverflowerror异常;如果虚拟机可以动态扩展,当扩展时无法申请到足够的内存时会抛出outofmemoryerror异常3.本地方法栈:与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行java方法服务,而本地方法栈则是为虚拟机使用到的native方法服务。
4.Java堆:java堆是被所有线程共享的一块内存区域。
用来存放对象实例。
是垃圾收集器管理的主要区域。
现在收集器基本上都是采用的分代收集算法。
5.方法区:是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。
运行时常量池:是方法区的一部分。
用于存放编译期生成的各种字面量和符号引用。
如果使用直接指针访问方式,java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,reference中直接存储的就是对象地址。
如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots的引用链。
掌握了泄漏对象的类型信息,以及GC Roots引用链的信息,就可以比较准确的定位出泄漏代码的位置。
不存在泄漏,那么应当检查虚拟机的堆参数,与机器物理内存对比看是否可以调大。
为什么要了解GC和内存分配:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。
我们只有在程序处于运行期间才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器所关注的是这部分内存。
引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器就减1;任何时刻计数器都为0的对象就是不可能再被使用的。
有个例子:objA和objB都有字段instance,赋值令objA.istance=objB及objB.instance=objA。
除此之外,这两个对象再无任何引用,实际上这两个对象已经不可能再被访问,但是他们因为互相引用着对方,导致它们的引用计数都不为0,于是引用计数算法无法通知GC收集器回收他它们。
System.gc()。
虚拟机并没有因为这两个对象互相引用就不回收它们。
说明虚拟机并不是通过引用计数算法判断对象是否存活。
根搜索算法:通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
GC Roots的对象包括下面几种:虚拟机栈中的引用的对象;方法区中的类静态属性引用的对象;方法区中的常量引用的对象;本地方法栈中JNI的引用的对象。
对象回收:首先对象在进行跟搜索后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()的方法。
当对象没有覆盖finalize()方法或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。
如果这个对象被判定为有必要执行finalize()方法,那么这个对象将会被放置在一个名为F-Queue的队列中,并在稍后由一条有虚拟机自动建立的、低优先级的finalizer线程去执行。
这时,在进行第二次小规模的标记,如果此时有对象重新与引用链的任何一个对象建立关联,那么就被移除出“即将回收”的集合。
剩下的,就等着回收。
垃圾收集算法:1.最基础的收集算法是“标记-清除”算法:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
缺点:效率不高;会产生大量不连续的内存碎片。
2.复制算法。
将内存容量划分为大小的两块。
每次只使用其中的一块。
当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
3.标记-整理算法:标记过程与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
4.分代收集算法:根据对象的存活周期的不同将内存划分为几块。
一般是把java堆分为新生代和老生代,这样就可以根据各个年代的特点采用最适当的收集算法。
在新生代中,每次垃圾收集时发现大批对象死去,只有少量存活,那么选用复制算法。
在老生代中,对象存活率高,没有额外的空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。
23种设计模式:1.抽象工厂模式:他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。
在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。
抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。
产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。
所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。
2.工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
优点:可以使代码结构清晰,有效地封装变化;对调用者屏蔽具体的产品类;降低耦合度。
3.单例模式:单例模式有一下特点:1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。
这些应用都或多或少具有资源管理器的功能。
Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。
由结果可以得知单例模式为一个面向对象的应用程序提供了对象惟一的访问点,不管它实现何种功能,整个应用程序都会同享一个实例对象。
4.代理模式:代理模式:给某一对象提供代理对象,并由代理对象控制具体对象的引用.代理模式涉及的角色:1:抽象主题角色.声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替.2:代理主题角色.含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题.代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作.3:真实代理对象.定义了代理角色所代表的具体对象.java对代理模式的支持---动态代理上面的代理,我们强迫代理类RedWineProxy实现了抽象接口SellInterface.这导致我们的代理类无法通用于其他接口,所以不得不为每一个接口实现一个代理类.幸好,java为代理模式提供了支持.java主要是通过Proxy类和InvocationHandler接口来给实现对代理模式的支持的.通过上面的代码可以看出,代理主题ProxyObject类并没有实现我们定义的SellInterface借口, 而是实现了java的InvocationHandler接口,这样就把代理主题角色和我们的业务代码分离开是实现了java的InvocationHandler接口,这样就把代理主题角色和我们的业务代码分离开来,使代理对象能通用于其他接口. 其实InvocationHandler接口就是一种拦截机制,当系统中有了代理对象以后,对原对象(真实主题)方法的调用,都会转由InvocationHandler接口来处理,并把方法信息以参数的形式传递给invoke方法,这样,我们就可以在invoke方法中拦截原对象的调用,并通过反射机制来动态调用原对象的方法来,使代理对象能通用于其他接口.5.责任链模式:责任链模式是一种对象的行为模式。
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。
请求在这个链上传递,直到链上的某一个对象决定处理此请求。
发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
6.观察者模式:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。
观察者模式的组成:1.抽象主题角色2.抽象观察者角色:3.具体主题角色(Watched):把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。
抽象主题提供一个接口,可以增加和删除观察者角色。
一般用一个抽象类或接口来实现。
4.具体观察者角色(Watcher):为所有具体的观察者定义一个接口,得到主题的通知时更新自己1.抽象主题角色类2.抽象观察者角色3.具体主题角色(Watched)4.具体观察者角色(Watcher)从AWT1.1开始图形系统的事件模型采用观察者模式,因此观察者模式在Java语言中的地位极其重要。