Java文件编译,加载过程
写好java文件,jdk会通过javac编译class文件,classLaoder通过classpath将字节码文件加载进入jre
jvm数据区
包含栈,堆,程序计数器,方法区,本地方法栈
JAVA里的常量,静态变量在JVM的什么区,对象在什么区?
常量和静态变量在JVM的方法区
对象在JVM的堆区
JVM运行时数据区都有那些?
本地方法栈,堆,栈,程序计数器,方法区
方法区: 方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域。
在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等
栈内存:是程序的运行单位,里面存储的信息都是与当前线程有关的内容,包括:局部变量,程序的运行状态,方法返回值
堆内存:JAVA的引用传递的实现就是依靠的堆内存,同一块堆内存空间可以被不同的栈内存所指向,包含:对象引用
程序计数器:是一个非常小的内存空间,这个空间主要是进行一个计数的操作,对象的晋升问题
方法栈内存:在进行递归调用的时候所保存的栈帧的内容,组成部分:局部变量表,操作数栈,当前方法所属类运行时常量的引用,返回地址
类加载器和双亲委派机制
java里,类加载器分为
Boostap ClassLoader(启动类加载器):
它是JVM的一部分,负责加载Java核心类库(如
java.lang
包中的类),它通常是用C/C++实现的,不是一个普通的Java类加载器
Extension ClassLoader(扩展类加载器)
也称为系统类加载器,负责加载Java的扩展类库,位于
java.ext.dirs
系统属性所指定的目录。
App ClassLoader(应用程序类加载器)
负责加载应用程序类路径(Classpath)上指定的类,这是大多数Java应用程序默认使用的类加载器
Custom ClassLoader(自定义类加载器)
可以由开发人员自定义实现的类加载器,用于加载特定的类或实现特定的类加载策略。
双亲委派机制:
当一个类加载器收到加载类的请求时,会先检查是否可以委托给父类加载器去加载,只有当父类加载器找不到加载类时,才会交给子类加载器加载
双亲委派机制的优势:
隔离性:每个类加载器只会加载自己的类,避免了不同的类加载器之间冲突
安全性:不同的类加载器分配的权限不同,防止恶意类被加载
复用性:已经加载过的类不会被重复加载,提高了运行效率
扩展性:通过扩展类加载器,可以扩展类的行为
Java类加载器和双亲委派加载机制是Java虚拟机保证类加载的安全性和隔离性的重要机制。它确保了类的唯一性和一致性,并为Java应用程序提供了高度的灵活性和可扩展性。
GC root 有哪些?
native:本地方法栈
对象:堆内存
final常量:方法区
线程:活动的线程
synchrozied引用的对象:堆内存
虚拟机栈引用的对象,在虚拟机栈内
垃圾回收算法有哪些?
标记-清除:找到有用的引用,并且标记,将没有标记的清理。
标记-复制:找到有用的引用,并且标记,然后复制到一片新的内存,将原先内存清理。
标记-整理:将标记的有用引用移到同一边内存,将另一边的内存清理。
引用计数法和根可达
引用计数法:是当一个对象被引用时,引用计数加一,当一个对象被销毁或者引用失效时,引用计数减一,当引用计数为零时,就可以被回收。
缺点是,容易受循环引用的影响,比如A引用B,B引用A
根可达分析:从根对象开始,通过对象之间的引用关系遍历,能够到达的标记可达,不能到达的标记不可达,最后,回收掉不可达的垃圾对象。
优点在于,不受循环引用的困扰,不会产生额外的引用计数开销,是现代编程语言中常用的垃圾回收策略。
分代GC
分代垃圾回收(Generational Garbage Collection)是一种垃圾回收策略,通常用于管理Java堆内存。它将堆内存分为不同的代(Generation),每个代有不同的特点和回收频率。分代垃圾回收的主要思想是根据对象的生命周期将对象分为不同的代,然后对不同代的对象采用不同的回收策略,以提高垃圾回收的效率。
在Java中,通常将堆内存分为以下三代:
-
年轻代(Young Generation):年轻代是新创建的对象的归宿。大多数对象在被创建后很快变成不可达,所以年轻代的垃圾回收频率比较高。年轻代通常被分为三部分:Eden区和两个Survivor区(通常称为S0和S1)。
-
老年代(Old Generation):老年代存放已经存活了一段时间的对象。对象在年轻代经历了多次垃圾回收后,仍然存活,就会被移到老年代。
-
永久代(Permanent Generation):永久代用于存放类的元数据、方法信息和静态变量等,不同于年轻代和老年代。在Java 8及更早版本中使用永久代,但在Java 8中被元数据区(Metaspace)所替代。
分代垃圾回收的工作原理如下:
-
新创建的对象会被分配到年轻代的Eden区。
-
当Eden区满了,触发一次年轻代垃圾回收。在回收过程中,存活的对象会被移到Survivor区,同时清空Eden区。
-
对Survivor区也会进行垃圾回收,将存活的对象移到另一个Survivor区。这个过程会多次迭代。
-
当一个对象在年轻代经历了多次回收后仍然存活,它会被晋升到老年代。
-
当老年代的空间满了,触发一次老年代垃圾回收,清理掉不再使用的对象。
分代垃圾回收的优点是,年轻代的垃圾回收频率高,能够快速释放短期存活的对象,而老年代的垃圾回收频率低,可以减少长期存活对象的回收成本。这种策略通常能够提高垃圾回收的效率和系统的性能。