为什么 Java 中某些新生代和老年代的垃圾收集器不能组合使用?比如 ParNew 和 Parallel Old回答重点
这张图是 2008 年 HostSpot 一位 GC 组成员画的,那时候 G1 还没问世,在研发中,所以画了个问号在上面。
里面的回答是 :
“ParNew” is written in a style… “Parallel Old” is not written i...
JVM 垃圾回收时产生的 concurrent mode failure 的原因是什么?回答重点concurrent mode failure 是在 Java 虚拟机使用 CMS(Concurrent Mark-Sweep)垃圾收集器 时的一种失败现象。当 CMS 在执行垃圾回收时,发现内存中的老年代(Old Generation)空间不足以继续分配新对象时,导致垃圾回收被迫转为 Full ...
为什么 Java 中 CMS 垃圾收集器在发生 Concurrent Mode Failure 时的 Full GC 是单线程的?**以下的回答来自 R 大 **。
因为没足够开发资源,偷懒了。就这么简单。没有任何技术上的问题。 大公司都自己内部做了优化。
所以最初怎么会偷这个懒的呢?多灾多难的CMS GC经历了多次动荡。它最初是作为Sun Labs的Exact VM的低延迟GC而设计实现的...
JVM 新生代垃圾回收如何避免全堆扫描?回答重点JVM 在进行新生代垃圾回收时,通过以下方式避免全堆扫描:
1)卡表(Card Table)机制:JVM 使用卡表记录老年代引用新生代对象的指针变化,从而在进行新生代回收时,只扫描那些老年代中确实有引用指向新生代的区域,避免了全堆扫描。
2)写屏障(Write Barrier):当老年代中的对象引用新生代对象时,写屏障会拦截这种引用,并在卡表中...
Java 的 CMS 垃圾回收器和 G1 垃圾回收器在记忆集的维护上有什么不同?回答重点CMS 垃圾回收器:
CMS 使用卡表(Card Table,记忆集的一种实现) 来记录老年代中引用新生代的对象。卡表的维护较为简单,老年代对象指向新生代对象时,会触发写屏障并标记相应的卡片。
CMS 的卡表是通过写屏障维护的,当老年代对象引用新生代对象时,CMS 会在卡表中将对应区域标记为“脏卡”,以...
为什么 G1 垃圾收集器不维护年轻代到老年代的记忆集?回答重点G1 分了 young GC 和 mixed gc。
young gc 会选取所有年轻代的 region 进行收集。
midex gc 会选取所有年轻代的 region 和一些收集收益高的老年代 region 进行收集。
所以年轻代的 region 都在收集范围内,因此不需要额外记录年轻代到老年代的跨代引用。
Java 中的 CMS 和 G1 垃圾收集器如何维持并发的正确性?回答重点CMS 和 G1 分别通过增量更新(Incremental update)和 SATB(snapshot-at-the-beginning)来打破这两个充分必要条件,维持了 GC 线程与应用线程并发的正确性。
并发执行可能出现对象漏标,而漏标的两个充分必要条件是:
1)将新对象插入已扫描完毕的对象中,即插入黑色对象到白...
什么是 Java 中的 logging write barrier?回答重点Java 中的 logging write barrier(日志写屏障)是一种与垃圾回收(GC)相关的机制,主要用于追踪和记录对象引用的变化,特别是在并发和增量式垃圾回收过程中。通过 write barrier,在应用程序运行期间,垃圾收集器可以检测对象的引用关系何时发生变化,从而维护记忆集或卡表等数据结构,避免全堆...
Java 的 G1 垃圾回收流程是怎样的?回答重点G1 从大局上看分为两大阶段,分别是并发标记和对象拷贝。
并发标记并发标记是基于 SATB 的,可以分为四大阶段:
**1)初始标记(initial marking)**,这个阶段是 STW 的,扫描根集合,标记根直接可达的对象即可。在G1中标记对象是利用外部的bitmap来记录,而不是对象头。
2、并发阶段(concurrent marki...
Java 的 CMS 垃圾回收流程是怎样的?回答重点1)初始标记(initial mark)
在这个阶段,CMS 会进行一个快速的初始标记,标记所有根对象(如栈中的引用)直接可达的对象。此过程是 STW的,但时间较短。
2)并发标记(Concurrent marking)
初始标记后,CMS 进入并发标记阶段。在此阶段,垃圾收集器与应用线程并发运行,从上一步标记的根直接可达对象开始进行...
JVM 垃圾回收调优的主要目标是什么?回答重点分别是最短暂停时间和高吞吐量。
最短暂停时间:垃圾回收调优的首要目标是减少应用程序的停顿时间,确保在垃圾回收过程中尽量保持应用的响应能力,特别是对于实时或高并发应用。
高吞吐量:第二个目标是提高应用的吞吐量,即在单位时间内完成更多的业务处理。通过合理的GC策略和配置,减少GC的频率和时间,从而提升整体性能。
针对最短暂停时间和高吞吐举个例子:...
如何对 Java 的垃圾回收进行调优?回答重点
GC 调优这种问题肯定是具体场景具体分析,但是在面试中就不要讲太细,大方向说清楚就行,不需要涉及具体的垃圾收集器比如 CMS 调什么参数,G1 调什么参数之类的。
GC 调优的核心思路就是尽可能的使对象在年轻代被回收,减少对象进入老年代。
具体调优还是得看场景根据 GC 日志具体分析,常见的需要关注的指标是 Young GC 和 Full G...
常用的 JVM 配置参数有哪些?回答重点
-Xms:初始化堆内存大小
-Xmx:最大堆内存大小
-Xss:设置每个线程的栈大小
-XX:MetaspaceSize:初始化元空间大小
-XX:MaxMetaspaceSize:最大元空间大小
-XX:+HeapDumpOnOutOfMemoryError:当发生 OutOfMemoryError 时,生成堆转储(heap dump)
-XX:+...
你常用哪些工具来分析 JVM 性能?回答重点
jmap:用于生成堆转储的命令行工具,可以用于分析JVM内存使用情况,尤其是内存泄漏问题
jstack:用于生成线程转储的命令行工具,可以用于分析线程状态,排查死锁等问题
jstat:用于监控JVM统计信息的命令行工具,提供了实时的性能数据,如类加载、垃圾回收、编译器等信息
MAT:用于分析堆转储文件的工具,可以帮助识别内存泄漏和优化内存使用
j...
如何在 Java 中进行内存泄漏分析?回答重点先确认是否真的发生了内存泄漏,即观察内存使用情况。
利用 jstat 命令(jstat -gc <pid> <interval in ms> )来观察 gc 概要信息,如果发现 GC 后内存并没有明显的减少且还是持续增加持续触发 gc,那说明内存泄漏的概率很大。
此时可以利用 jmap(jmap -dump:format=...
JVM 由哪些部分组成?回答重点JVM 的主要组成部分包括 类加载器子系统(ClassLoader)、运行时数据区(Runtime Data Area)、执行引擎(Execution Engine) 以及 本地方法接口(Native Interface,JNI)。
我们要知道Java 虚拟机(JVM)是一个运行 Java 程序的虚拟环境,它负责将 Java 字节码转换为机器码并执行。
...
JVM 方法区是否会出现内存溢出?回答重点Java 7 及之前的方法区被实现为永久代(PermGen)中,它是固定大小的内存区域,不能动态扩展。如果加载的类过多或常量池的数据过多,超出了永久代的限制,就会出现 OutOfMemoryError: PermGen space 错误。
在 Java 8 及之后,方法区改用元空间(Metaspace)来代替永久代。元空间不再使用堆内存,而是使用本地...
JVM 有那几种情况会产生 OOM(内存溢出)?回答重点Java 中常见的 OOM 情况可以概括为以下几种:
OOM 错误类型
原因
常见解决方法
Java Heap Space
堆内存不足,常见于大量对象创建
优化对象使用或增大堆内存
StackOverflowError
栈空间耗尽,常见于递归或深层嵌套调用
优化递归逻辑或增大栈空间
PermGen Space ...
MySQL 插入一条 SQL 语句,redo log 记录的是什么?回答重点因为 redo log 是物理日志,记录“某页(Page)某位置的数据被修改为某值”。它不记录逻辑操作(如 “插入一行”),而是直接记录对页的变更。所以在插入操作中,redo log 记录的是事务在数据页上的修改
数据页的插入点、记录的偏移量和插入的实际数据并更新页目录、页头等元数据。
扩展知识插入操作 redo l...
MySQL 中 LIMIT 100000000, 10 和 LIMIT 10 的执行速度是否相同?回答重点速度差很多,limit 10 快很多!
原因如下:
1)LIMIT 100000000, 10 需要先处理(通常是读取并跳过)前 100000000 条记录,然后再获取到需要的 10 条记录,开销成本很大,因为需要扫描 100000000 数据才能得到后面的 10 条数据,会导致大量的磁...
SQL 中 select、from、join、where、group by、having、order by、limit 的执行顺序是什么?回答重点
执行顺序
SQL 子句
说明
1
FROM
确定数据源,执行表连接操作。
2
JOIN
执行连接操作,结合多张表的数据。
3
WHERE
过滤不符合条件的行。
4
GROUP BY
将数据按指定的列分组。
5
HAVIN...
为什么阿里巴巴的 Java 手册不推荐使用存储过程?回答重点1)可移植性差
数据库依赖性:存储过程是在数据库服务器上执行的,通常使用数据库特定的 SQL 方言和功能,这会导致应用程序的数据库依赖性增加,迁移到其他数据库系统时有成本。
跨平台问题:不同的数据库系统实现存储过程的方式和支持的功能不完全相同,维护比较复杂。
2)调试困难
调试工具有限:相比应用层代码,数据库层的存储过程缺乏良...
数据库的三大范式是什么?回答重点第一范式(1NF):
确保每个列的值都是原子值,表中的每个字段只能包含单一的数据项,不允许重复的列和多值字段。
第二范式(2NF):
在满足第一范式的基础上,确保表中的每个非主键字段完全依赖于主键,而不是部分依赖。即,非主键字段必须依赖于整个主键。
第三范式(3NF):
在满足第二范式的基础上,确保非主键字段之间不依赖,即消除传递依赖。所有非主键字段...
MySQL 中 DATETIME 和 TIMESTAMP 类型的区别是什么?回答重点存储方式:
DATETIME:以字符串形式存储,范围为 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59',占用 8 字节。
TIMESTAMP:以 Unix 时间戳形式存储,范围为 '1970-01-01 00:00:01...
在 MySQL 中,你使用过哪些函数?回答重点这道题目被问的几率不是很大,大家可以熟悉下,可以在实际开发中使用。
以下列举一些常用的函数类别:
1)字符串函数,用于处理文本数据:
CONCAT:连接字符串。
SUBSTRING:提取子字符串。
LENGTH:返回字符串的长度。
REPLACE:替换字符串中的子字符串。
UPPER 和 LOWER:将字符串转换为大写或小写。
TRIM:去除字...
MySQL 中 AUTO_INCREMENT 列达到最大值时会发生什么?回答重点在 MySQL 中,如果表定义的自增 ID 到达上限后,再申请下一个 ID,得到的值不变! 因此会导致报重复值的错误。
扩展知识自增 ID 上限实验例如 int 是 4 个字节,上限是 2 的 32 次方 -1,即 2147483647,当到达这个值的之后,下次插入得到的还是这个值,来看一下实验:
123456c...
什么是数据库的视图?回答重点数据库的视图是一个虚拟表,它并不存储实际的数据,而是通过查询其他表的数据来生成的。视图可以简化复杂的查询、增强数据安全性(限制访问某些数据)以及提供数据的不同表示方式。
它可以包含一个或多个表的数据,并且可以对这些数据进行筛选、计算、排序等操作。
扩展知识视图的作用
简化复杂查询:视图可以将复杂的查询封装成一个简单的视图,使得用户在查询数据时更加方便。
安全性:通...
MySQL 中 TEXT 类型最大可以存储多长的文本?回答重点TEXT 是非标准字符串类型,除了它还有 TINYTEXT、MEDIUMTEXT 和 LONGTEXT,一般我们存储一些不确定的较长文本才会使用到它们,例如文章之类的。
它们的存储的文本长度汇总如下:
1)TINYTEXT:最大长度为 255 字节。
2)TEXT:最大长度为 65,535 字节(约 64 KB)。
3)MEDIU...
什么是数据库的游标?回答重点
这道题面试遇到的几率比较低,但是游标这个概念还是需要了解。
数据库游标是一个数据库对象,使得应用程序可以逐行访问查询结果集,而不仅仅是一次性处理所有结果。它允许开发者在结果集中的行之间移动,方便进行复杂的数据操作,比如更新或删除特定的行。
扩展知识游标的作用和性能问题
逐行处理:游标允许逐行处理查询结果集,在需要对结果集中的每一行进行复杂操作时,非常有用。
灵...
相比于 Oracle,MySQL 的优势有哪些?回答重点与 Oracle 相比,MySQL 有以下优势:
1)MySQL 有免费版本,成本低,Oracle 数据库的许可费用和维护成本较高。
2)MySQL 是开源的,有广泛的社区支持和丰富的文档资源,能快速上手和解决问题。
3)MySQL 适合小型和中型应用,相比 Oracle 资源占用较少,更加轻量。
而 Oracle 在处理大...