1 . java运行时数据区域:
程序计数器,java 虚拟机栈,java堆,方法区(运行时常量池 )
程序计数器:是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。
java虚拟机栈: 与程序计数器一样也是线程私有的,生命周期与线程一样。虚拟机栈描述的是java方法执行的内存模型, 每个方法被执行的时候都会同时创建一个栈桢用于存储:局部变量表,操作栈,动态链接,方法出口等信息。
局部变量表存放了编译期可知的各种基本数据类型(boolean,byte,char,short,int,long,double,float),对象引用和returnAddress 类型(指向了一条字节码指令的地址)。
堆:是java 虚拟机所管理的内存中最大的一块。主要存放对象的实例(数组),在虚拟机启动时创建。
方法区:与java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,常量,静态变量等数据。运行时常量池也属于方法区。
2 . 垃圾收集算法
2.1判断对象是否存活的算法:
引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1,当引用失效时就减1;任何时候计数器都为0的对象就是不可能在被使用的。
其实现简单,判定效率高。java没有选用,主要原因是它很难解决对象之间的相互循环引用的问题。
根搜索算法:主流的商用程序语言中,都采用的算法判断对象是否存活。
其基本思路是通过一系列的名为"GC Roots"的对象作为起点,从这些结点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链时,则证明此对象是不可用的。
在java 中,可以作为 GC Roots的对象的包括以下几种 :
*虚拟机栈中引用的对象
*方法区中的类静态属性的对象
*方法区中的常量引用的对象
*本地方法栈中JNI的引用对象。
2.2 垃圾收集算法
2.2.1 标记-清理算法:算法分为"标记"和"清理"两阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,
*缺点有两个:一个是效率问题,标记和清理过程的效率都不高,另一个是空间问题,标记清理之后会产生大量不连续的内存碎片,空间碎片太多可能导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续的内存而不得不提前触发另一次垃圾收集操作。
2.2.2 复制算法:它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
优点:实现简单,运行高效
代价:这种算法的代价是将内存缩小为原来的一半。
现代商用虚拟机都采用这种算法来回收新生代,IBM的专门研究表明,新生代的对象98%是朝生夕死的,所以可以将内存分为一块交大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor,
当回收时,将Eden 和Survivor中还存活的对象一次性拷贝到另外一块Survivor上,最后清理掉Eden和刚用国的Survivor空间。
HotSpot 虚拟机默认Eden和Survivor的比例是8:1,也就是每次新生代中可用内存中间为整个新生代的90%(80%+10%),只有10%的空间是被"浪费"的。
当Survivor 空间不够时,需要依赖其他内存(这里指老年代)进行分配担保。
2.2.3 标记-整理算法
复制收集算法在对象存活率较高时就要执行较多的复制操作,效率将会变低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以老年代一般不能直接选用这种算法。
有人就提出了"标记-整理"算法,其标记过程仍然与"标记-清理"算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存,
3 内存分配与回收策略
3.1 对象优先在Eden 分配
3.2大对象直接进入老年代
3.3长期存活的对象将进入老年代
4.虚拟机类加载机制
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了:
加载,连接(验证,准备,解析),初始化,使用和卸载。
类加载器
虚拟机设计团队把类加载阶段中的"通过一个类的全限定名来获取描述此类的二进制字节流"这个动作放到java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被成为"类加载器"。
类加载器分为以下三种:
* 启动类加载器(Bootstrap ClassLoader):这个类加载器负责将放在<JAVA_HOME>\bin目录中的,或者被-Xbootclasspath 参数指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合的类即使放在lib 目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被java 程序直接引用。
*扩展类加载器(Extension ClassLoader):这个类加载器由sun.misc,Launcher$ExtClassLoader实现,它负责加载<JAVA_HOME>\lib\ext目录中的 ,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。
*应用程序类加载器(Application ClassLoader):这个类加载器由sun.misc.Launcher$AppClassLoader实现,由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也称为它为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
双亲委派模型:
上图所展示的类加载器之间的这种层次关系,就称为类加载器的双亲委派模型(Parents Delegation Model)。双亲委派模型要求除了顶层的启动器加载器外,其余的类加载器都应当有自己的父类加载器。
双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有 当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。
相关推荐
总结,Android的JAVA虚拟机是其生态系统的重要组成部分,无论是Dalvik还是ART,它们都为开发者提供了高效、稳定的运行环境。通过理解JAVA虚拟机的工作原理和优化技巧,开发者能够更好地构建高质量的Android应用。
总结来说,“一个简单的Java虚拟机实现(v032)”是一个C++编写的初级JVM示例,旨在帮助初学者了解Java虚拟机的基本工作流程。虽然它可能不包含完整的JVM特性,但对于学习JVM的内部机制和字节码执行过程而言,是一个...
Java虚拟机支持大约248个字节码指令,每个指令代表一个简单的CPU操作,比如加法或子程序调用等。字节码指令通常包含一个单字节的操作符和零个或多个操作数,用于指定具体的操作和参数。执行引擎的工作流程如下: 1....
### Java虚拟机(JVM)简介 #### 一、Java虚拟机的概念 Java虚拟机(Java Virtual Machine,简称JVM)是Java技术的核心组成部分之一,在Java编程领域占据着至关重要的地位。简单来说,JVM可以被理解为一种通过软件...
Java虚拟机(JVM)是Java程序运行的核心组件,它为开发者提供了跨平台的执行环境。深入理解JVM内核的原理、诊断与优化对于提升Java应用的性能至关重要。本教程将带你探索JVM的奥秘,从内存管理到垃圾回收,从编译...
### Java虚拟机的相关参数设置与调优 #### Java虚拟机简介 Java虚拟机(Java Virtual Machine,简称JVM)是一种抽象计算机模型,在物理计算机上通过软件实现。它有自己的硬件架构,例如处理器、堆栈、寄存器等,并...
### Java虚拟机(JVM)深度解析 #### 一、Java技术与Java虚拟机概述 Java不仅仅是一种编程语言,更是一项全面的技术,它包含了以下几个关键组成部分: 1. **Java编程语言**:这是一种面向对象的编程语言,以其简洁...
### JVM(Java虚拟机)的详细讲解 #### Java运行原理概览 Java作为一种跨平台的编程语言,其核心优势在于“一次编写,到处运行”的特性。实现这一目标的关键技术是Java虚拟机(JVM)。简单来说,Java源代码在编译后...
- **平台独立性**:通过Java虚拟机(JVM),Java程序可以在不同的操作系统上运行,无需修改代码。 **1.2 JDK、JRE和JVM的区别** - **JDK (Java Development Kit)**:这是Java开发工具包,包含了编译、调试和运行...
Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,提供内存管理、垃圾回收以及各种优化机制。本文将深入探讨基于Java虚拟机的动静结合自适应优化方法,这是一种旨在提高Java应用程序性能的技术。 ...
### Java虚拟机类装载的原理及实现 #### 引言 Java虚拟机(JVM)作为执行Java程序的核心,承担着解释执行字节码的重要任务。在这个过程中,类的装载是一个关键步骤,它确保了Java程序能够正确无误地运行。类装载...
### Java虚拟机(JVM)深度解析 #### JVM概念与架构 Java虚拟机(JVM)是一种用于执行Java字节码的虚拟计算机环境,它在不同的操作系统上提供了一致的运行平台,使得Java程序能够实现“一次编写,到处运行”的目标。...
例如,假设我们有一个简单的 Java 类库 `MyToolkit`,它包含了一个静态方法 `function1`: ```java public class MyToolkit { public static void function1(String param) { System.out.println("You input: " + ...
### 深入Java虚拟机加载初始化 #### Classloader的作用及意义 在深入了解Java虚拟机(JVM)的加载初始化之前,我们先明确一下`Classloader`的角色。简单地说,`Classloader`的主要职责是将编译后的`.class`文件...
总结起来,Java虚拟机的字节码指令集是执行Java代码的基础,它包含了数据操作、流程控制、对象操作、方法调用等各个方面,确保了Java程序的跨平台性和高效执行。理解和掌握这些指令对于深入理解Java的运行机制至关...
### 探索Java虚拟机的心脏:字节码执行全解析 #### Java语言概览 Java自1995年由Sun Microsystems(现归Oracle所有)发布以来,已成为全球范围内广泛应用的编程语言。作为一种面向对象的语言,Java将现实世界中的...
### 使用Java虚拟机(JVM)实现一个简单的在线购物系统 #### 一、项目概述 本文档介绍了一个基于Java虚拟机(JVM)的简单在线购物车管理系统的实现。该系统主要包括一个`ShoppingCart`类,它负责管理购物车中的商品...