JVM补充1

本文详细解析了Java虚拟机(JVM)的内存模型,包括堆区、方法区、本地方法栈等部分,以及垃圾回收机制。阐述了对象在Eden区、Survivor区和老年代的分配与晋升策略,探讨了不同类型的垃圾回收器及其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GC 经常发生的区域是堆区,堆区还可以细分为新生代、老年代,新生代还分为一个 Eden 区和两个 Survivor 区。

对象优先在 Eden 中分配,当 Eden 中没有足够空间时,虚拟机将发生一次 Minor GC,因为 Java 大多数对象都是朝生夕灭,所以 Minor GC 非常频繁,而且速度也很快;
Full GC,发生在老年代的 GC,当老年代没有足够的空间时即发生 Full GC,发生 Full GC 一般都会有一次 Minor GC

类的实例化顺序,比如父类静态数据,构造函数,字段,他们的执行顺序
答:先静态、先父后子
1. 先静态:父静态>子静态
2. 优先级:父类>子类 静态代码块>非静态代码块>构造函数

一个类的实例化进程:
1. 父类中static代码块,当前类的是static
2. 顺序执行父类的普通代码块
3. 父类的构造函数
4. 子类普通代码块
5. 子类(当前类)的构造函数。按顺序执行
6. 子类方法的执行

Jvm的内存模型
1. 方法栈:线程创建时,方法执行时生成栈帧
2. 本地方法栈
3. 方法区:存储类的元素信息,常量等
4. 堆:java代码中所有的new操作
5. 非堆:jvm自用的区域,方法区,jvm内部处理、类方法,构造方法等

Java8的内存分代改进:
从永久代到元空间,在小范围自当扩展永生代避免溢出

Jvm垃圾回收机制,何使触发MinorGC等操作
1. 分代垃圾回收机制:不同的对象声明周期不同,把不同的生命周期的对象放在不同的代上,不同代上采用最合适它的垃圾回收方式进行回收

Jvm共划分三个代:年轻代、年老代和持久代。
1. 年轻代:存放所有新生成的对象
2. 年老代:在年轻代中经历N次垃圾回收仍存活得对象,将被放在年老代中,故都是一些生命周期较长的对象。
3. 持久的:用于存放静态文件。如java类、方法等
4. 新生代的垃圾回收器命名为“full GC” 老年代的GC命名为“major GC”或者“major GC” 其中用system.gc( )强制执行的是full Gc

1. 判断对象是否需要回收的方法有两种


1. 引用计数:当对象引用数为0时,便可以进行垃圾回收集
2. 对象引用遍历:如果某对象不能从这些根对象的一个到达,则将他们作为垃圾收集,在对象遍历阶段,GC必须计入哪些对象可以到达,一边删除不可到达对象,这称为标记对象


1. 触发Gc的条件

	1. GC在有限级最低的线程中运行,有伴在应用程序空虚即没有应用程序在运行时被调用
	2. Java堆内存不足时,GC会被调用

Jvm中一次完整的Gc流程(从ygc到fgc)是怎样的,重点讲讲对象如何调用晋升到老年代等
1. 对象优先在新生代区分配,若没有足够的空间,MinorGc;
2. 大对象(需要大量连续的内存空间)直接进入老年代,长期存活的对象进入老年代,如果对象在新生代初始并经过一次MGC后仍存活,年龄+1,若年龄超过一定限制(15),则被晋升到老年态

你知道几种垃圾回收器,各自优缺点,重点讲下cms,g1
1. 串行收集器:暂停所有应用的线程来工作;单线程
2. 并行收集器:默认的垃圾收集器,暂停所有应用;多线程
3. G1收集器:用于大堆区域,堆内存分割。并发回收
4. CMS收集器:多线程扫描,标记需要回收的实例,清除

JVM主要参数:堆设置、回收器选择(串行、并行、并发收集器)

深入分析classloader,双亲委派机制
1. classloader:类加载器用来加载java到java虚拟机中,java源程序在经过java编译器编译之后被转换称java字节码文件,类加载器负责读取java字节码。并且转换称java.long.Class类的一个实例。
2. 双亲委派机制:某个特定的类架子器在街道加载类的请求时,首先将加载热舞委托给父类加载器,依次递归,如果父类架子器可以完成类加载任务,就成功返回;如果父类加载器无法完成此加载任务时,才自己区加载

Eden和Survivor的比例分配
答:默认8:1

对java内存模型的理解,以及其在并发中的应用
1. java内存模型的主要目标:定义程序中各个遍历的访问规则
2. java线程之间的通信由java内存模型控制
3. 所有遍历存储都是主程序,每条线程还都又自己的工作内存,线程的工作内存中保存了该线程使用到变量的主内存副本拷贝,线程对变量的所有操作必须在工作内存完成,而不能之间兑取主内存中的变量,不同的线程之间无法访问对方工作内存中的变量,线程间变量的传递均需要通过主内存来完成

说一下强引用、弱引用、软引用、虚引用以及他们和GC的关系
1. 强引用:new出的对象之类的引用,只要强引用还在,永远不会回收
2. 软引用:引用但非必须对象,内存溢出异常之前,回收
3. 弱引用:非必须的对象,对象能生存到i下一次垃圾收集发生之前
4. 虚引用:对生存时间无影响,在垃圾回收时得到通知

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值