一、JAVA跨平台
JVM(Java Virtual Machine)意思是java虚拟机,所有的java程序,都运行在这个虚拟机上,也因此java拥有了诞生之初最大的优势,[b]跨平台[/b]。java文件经过编译成为class文件,虚拟机识别class文件,并运行。程序并不直接与操作系统进行交互,所以java可以跨平台。虚拟机起到了中间作用,虚拟机本身不是跨平台的,所以我研究一下java虚拟机的原理,究竟是如何工作的。
二、类加载
类加载器一共分四种,引导类加载器,扩展类加载器,系统类加载器,自定义类加载器。他们之间有层级关系,具体关系如下图所示(图片来自于网络)
java在类加载过程中,检查加载是从下至上的,而加载过程是从上之下的。当一个类加载器接收到加载请求的时候,首先检查这个类是不是被自己加载过,如果没有,则提交给上级加载器去加载。上级加载器重复此过程,直到顶层,顶层发现自己也没有加载过,那么就去尝试加载此类,如果发现自己的加载范围内找不到该类,就会交给下层去加载,如果到最后,连classpath和指定目录都没有找到类,那么类加载器就会爆抛异常。
三、类链接和初始化
在类被加载都系统后,就会进行一些诸如分类内存空间,赋初始值,初始化变量等工作。
1.类链接
①验证:验证被加载后的类是否有正确的结构,类数据是否会符合虚拟机的要求。
②准备:分配内存,赋默认值,静态变量赋初始值等
③解析:将运行时常量池中的符号引用替换为直接引用(这句话我没懂,所以直接引用别人的)
2.类初始化
在一下情况下,类会被初始化
①创建类的实例,比如new一个类时
②初始化某个类的子类,因为初始化子类的时候,会先初始化父类
③反射,如用Class.forName()调用,直接.class不会
④ 访问类或接口的静态变量或者静态方法
⑤java虚拟机启动时被标明为启动类的类,比如含有Main的启动类
父类静态成员、静态代码块—>子类静态成员、静态代码块—>父类和子类实例成员内存分配—>父类实例成员、代码块—>父类构造函数—>子类实例成员、代码块—>子类构造函数
四、运行时数据区
在java程序运行的过程中,所有的数据都是存储在“运行时数据区”,比如类加载后,类的基本信息会存储在方法区,初始化某个对象后,对象会被存储在JAVA堆区,调用某个方法时,方法内部变量会存储在JAVA栈区。具体的情况如下:
运行时数据区分为5个大块,方法区,JAVA堆,JAVA栈,本地方法栈,PC计数器。其二者是线程共享的,后三者是线程独享的。
①PC计数器:线程执行Java方法时,记录其正在执行的虚拟机字节码指令地址,因为是线程独享,所以在线程相互切换执行时,不会混乱。
②本地方法栈:为执行本地方法而服务的栈。
③JAVA栈:JAVA栈是线程私有的,一个线程会对应一个JAVA栈,生命周期与线程相同,线程中每调用一个方法,就会JAVA栈就会产生一个栈帧,栈帧存储着方法的局部变量、操作栈、动态链接、方法出口的信息。每一次方法的调用,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程,如果递归调用,那么每一层深度,就会产生一个栈帧。
④JAVA堆:JAVA堆区域是线程共享区域,它存储了所有类的实例,是运行时区域中最大的一块。不断有新对象产生,也不断的被垃圾回收给销毁。JAVA堆的大小是可以配置的。
⑤方法区:也是线程共享的区域,存储类所有类的类信息,我称之为叫类的结构信息。值得注意的是,类的常量、静态变量也是存储在这一块的。因为静态变量不属于具体的某个对象,而是类本身的一个属性。
五、垃圾回收
垃圾回收主要针对的是JAVA堆区域,在这个区域,要存储每一个类的实例(对象),是一个很庞大的区域。
当一个对象不再被使用的时候,比如已经无法通过引用去找到的对象。就需要回收这部分内存,以供后边的实例使用。为了确定找到这些没有用的对象并清除掉,产生了一些经典的算法。
①引用计数器:创建的对象每多赋值一个变量,计数器就加一,反之就减一。当对象引用为零的时候,他就永远不能被访问了,就应该被清理了。缺点:不能识别闭环引用,假如A-B,B-A,那么AB都有一次引用,就永远不会清理。
②标记清除:利用有向图的思想,计算根节点到对象的路径,如果路径为无穷大,这表示对象不可达,应该被清除。缺点:产生内存碎片较多。
③标记清除压紧:为了解决②的碎片问题,在②的基础上增加一个操作,把所有存活的对象,都移动并对齐到JAVA堆的一边去。这样就不会产生碎片了,不过效率会更低一点。
④复制:把JAVA堆分成2个区域AB,活动对象在A中产生,当A内存满的时候,就扫描A,把A中的存活对象整齐的复制到B中。缺点:消耗内存大
⑤新生代老年代:由于大多数对象存活的时间较短,而少部分会存活很久。所以将JAVA堆分为多个区域,每个区域作为一代,如ABC,对象在A中产生,如果A满了就扫描一次,将存活对象复制到B,当B也满了,将B对象复制到C中,由于C里边的对象是存活了2轮的,所以很少会被清除掉,所以可以称之C为老年代,对应A为新生代,B为年轻代。优点:灵活(可以根据程序调整代的数量,代的大小)节省时间(新生代需要扫描次数较多)。
相关推荐
JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel、Parallel Old...
Java虚拟机(JVM)内存模型和垃圾回收机制是Java开发中至关重要的概念。本文将深入探讨这两个主题,帮助理解JVM如何管理和优化内存。 **一、类加载器和双亲委派机制** 类加载器是JVM的一个组成部分,负责加载Java...
理解JVM内存管理和垃圾回收机制对于优化Java应用程序性能至关重要,开发者可以通过调整JVM参数来定制适合应用需求的内存配置和垃圾回收策略。例如,设置新生代和老年代的大小、选择合适的垃圾回收器、设定最大暂停...
JVM的主要职责包括类加载、内存管理、执行字节码以及垃圾回收。以下是对这些核心功能的详细阐述: 1. **类加载机制**: 类加载是JVM启动后对类进行加载、验证、准备、解析和初始化的过程。在Java中,类加载器...
理解JVM内存结构和垃圾回收机制对于Java开发者至关重要,它可以帮助我们更好地优化程序性能,避免内存溢出等问题。通过调整JVM参数,如堆大小、新生代与老年代的比例、垃圾收集器的选择等,我们可以根据应用的需求...
此外,类的卸载在Java中相对复杂,通常只有在以下情况才会发生:类的加载器被垃圾收集器回收,且该类的所有实例都已被回收,同时系统中没有对该类的静态变量或静态方法的引用。 总结,Java 类加载器是JVM中的重要...
### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader...通过以上内容的学习,我们可以更深入地理解Java虚拟机的类加载机制和垃圾回收机制,这对于优化Java应用程序的性能以及排查相关问题都是非常有帮助的。
JVM的工作原理及其垃圾回收机制对于理解和优化Java应用程序至关重要。通过对JVM内存管理的理解,我们可以更好地控制对象的生命周期,减少不必要的内存消耗,并提高程序的性能。此外,了解不同的垃圾回收算法可以帮助...
当类加载器不再被引用且其加载的所有类都卸载后,类加载器才可能被垃圾回收。然而,由于类加载器与系统类(如java.lang.Object)的关系,完全卸载一个类加载器很困难,这也是Java内存泄露的一个潜在原因。 6. **类...
你可以在这里找到关于JVM行为的实验,比如如何触发垃圾回收,如何观察内存使用情况,以及如何调试类加载和字节码执行等问题。 通过研究这个代码仓库,你将能够深入理解JVM的内部运作,并具备诊断和优化JVM相关问题...
JVM的垃圾收集机制可以回收不再使用的对象,但类加载器却难以卸载。这是因为类加载器与类的关系是“父子关系”,而非“拥有关系”,只有当类加载器被回收,它所加载的类才会一同卸载。 6. **类加载器优化** 优化...
通过深入理解JVM的运行时数据区域、垃圾回收机制和类加载机制,开发者能够更好地优化Java应用程序的性能,避免常见的内存泄漏问题,并充分利用JVM的强大功能。这些核心概念不仅对于日常开发至关重要,也是深入学习...
在JVM的学习中,理解其内存模型、垃圾收集算法以及类加载机制至关重要。 1. **JVM内存模型** - **方法区**:也称为“永久代”,存储虚拟机加载的类信息、常量、静态变量等,是线程共享的区域。在Java 8之后,这...
本文将深入探讨JVM的四个关键领域:类的加载机制、内存结构、垃圾回收(GC)算法以及GC分析和命令调优。 首先,我们来看类的加载机制。类的加载始于加载阶段,它将类的.class文件中的二进制数据读入内存,并在方法...
Java虚拟机(JVM)是Java程序的核心,它负责管理程序的运行时环境,包括内存分配和垃圾回收。垃圾回收(GC)是JVM的一项重要功能,它自动管理内存,释放不再使用的对象所占用的空间,避免内存泄漏。理解JVM的垃圾...
这两个条件满足时,对应的常量池条目和类对象可以被垃圾回收。 为了监控和优化JVM的垃圾回收,开发者可以使用如VisualVM、JConsole、JMX等工具,通过观察内存分配、垃圾回收日志、GC停顿时间等指标来调整JVM参数,...
Java虚拟机(JVM)的内存管理和垃圾回收是其性能优化的关键环节。本文主要探讨JVM内存分配、对象回收的判断标准以及垃圾收集算法。 1. JVM内存分配与回收 在JVM中,内存分为新生代、老年代和持久代。新生代又细分...
Java虚拟机(JVM)内存管理是Java程序性能优化的关键环节。...理解JVM内存管理和垃圾回收机制对于诊断和解决OOM问题至关重要。通过调整JVM参数,优化垃圾回收策略,可以有效地防止内存溢出,提升应用的稳定性和性能。
在Java开发过程中,JVM(Java虚拟机)的性能优化是一项至...开发者需要根据应用特性选择合适的垃圾回收策略,并通过调整JVM参数来优化内存分配和垃圾回收效率,同时利用各种监控工具进行实时诊断,以确保应用稳定运行。
随后的1.2版本引入了类加载器改进和垃圾收集器优化。 3. **J2SE, J2EE, J2ME**:2000年代初,Sun Microsystems将JVM分为三个平台版本:J2SE(标准版),J2EE(企业版)和J2ME(微型版),分别针对桌面应用、企业级...