# 技术栈知识点巩固,开发多年 HashMap 原理不知道
新生代中为什么要分为 Eden 和 Survivor
如果没有
Survivor
区,那么Eden
每次满了清理垃圾,存活的对象被迁移到老年区,老年区满了,就会触发Full GC
,Full GC
是非常耗时的。Jvm
优化主要就是增加Minor Gc
减少FullGc
。
JVM 出现 FullGC 很频繁,怎么去线上排查问题?
程序执行了
System.gc()
有可能触发FullGC
。老年代空间不足。
方法区空间不足。
通过
Jvm
参数获取堆快照
通过
Jdk
自带的工具
生成内存快照,分析内存快照。
JVM 中一次完整的 GC 流程是怎样的,对象如何晋升到老年代
说说你知道的几种主要的 JVM 参数。
Xms
:最小堆内存Xmx
:堆的最大内存Xmn
:新生代内存
Java 对象的创建过程
类的生命周期可见:https://blog.csdn.net/qq_37248504/article/details/106302662
JVM
首先会检查相关类型是否已经加载并初始化,如果没有,则 JVM立即进行加载并调用类构造器完成类的初始化
。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。
父类静态变量、静态初始化块
子类静静态变量、静态初始化块
父类初始化块、构造方法
子类初始化块、构造方法
Jvm 参数配置
G1 和 cms 区别
G1
收集器收集范围是老年代和新生代。不需要结合其他收集器使用。可预测垃圾回收停顿时间。
使用标记整理算法,降低内存空间碎片。
CMS
收集器是老年代的收集器,可以配合新生代的 Serial 和ParNew
收集器一起使用。使用标记清除算法,容易产生内存碎片。
打出线程栈信息
找出服务进程
id
:ps -ef|grep java
类加载的执行过程
对象的访问定位有哪两种方式?
user
表示一个本地引用,存储在栈的本地变量表中,表示一个引用类型的数据。new User()
作为实例对象放在堆中,Java
堆中存放了对象的类型、方法等信息。
图片来自:https://www.jianshu.com/p/8580ab50e261
jvm 调优的工具
JVM 垃圾回收机制,何时触发 MinorGC 等操作呢?
MinorGC
:新生代GC
,对象优先在eden
创建并区分配内存,当eden
区内存无法为一个新对象分配内存时,就会触发MinorGC
FullGc
:老年代GC
,jvm
调优主要是尽可能增加MinorGC
减少FullGc
对象什么时候会进入老年代?
对象年龄达到一定的大小 ,就会离开年轻代, 进入老年代。
若对象体积太大, 新生代无法容纳这个对象。
内存泄漏和内存溢出区别?
程序在申请内存后,无法释放已申请的内存空间就造成了内存泄漏,内存泄漏堆积后的后果就是内存溢出。
对象被引用,无法回收。例如没有关闭流、集合没有清空
指程序申请内存时,没有足够的内存供申请者使用。
例如 从数据库中查出大量数据、创建大量的对象没有回收。
什么情况下会发生栈内存溢出。什么时候发生堆溢出?你是怎么排错的?
方法不能存栈帧中弹出,例如递归调用死循环。
创建大量的对象后,没有进行垃圾回收。
生成内存快照文件,分析快照文件。
查看程序输出的日志文件。
tomcat 类加载机制
Tomcat
的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object
,String
等),各个web
应用自己的类加载器(WebAppClassLoader
)会优先加载,加载不到时再交给commonClassLoader
走双亲委托。
JIT
JIT
即时编译:在运行时候将字节码翻译为机器码。C1(Client)
:编译速度块,优化方式比较保守。C2(server):编译速度慢,优化方式比较激进。
C1+C2
(分层编译):在开始阶段采用C1
编译,当代码运行到一定热度之后采用G2
重新编译。
逃逸分析技术
在编程语言的编译优化原理中,分析指针动态范围的方法称之为逃逸分析。
方法逃逸:对象作为参数进行传递。
线程逃逸:类变量、实例变量被不同的线程访问。
调用 System.gc()会发生什么?
System.gc()
:告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的。System.runFinalization()
: 强制调用已经失去引用的对象的finalize
方法。
MinorGC 条件 FullGC 条件
老年代最大的可用连续空间是否大于新生代的所有对象总空间,如果大于则执行
MinorGC
老年代空间不足触发
FullGC
System.gc()和 Runtime.gc()会做什么事情?
System.gc()
Runtime.gc()
调用了
System.gc()
或者Runtime.gc()
只是告诉虚拟机可以 gc了
,但是什么时候gc
依然由虚拟机自身决定,调用之后是否回收资源是由虚拟机自身控制的,这个方法仅仅只是告诉他可以gc
了,gc
有一系列复杂的机制,至于它什么时候gc
由这些机制决定。
主内存与工作内存
主内存是所有的线程所共享的,工作内存是每个线程自己有一个。
内存间交互操作
? Java
内存模型将内存分为工内存和主内存,变量从主内存拷贝到工作内存的过程中,java
内存模型定义了 8 中操作完成。
锁定
lock
:锁定主内存中的变量,将变量表示为一个线程独占的状态。解锁
unlock
:释放主内存中锁定的变量,释放的变量被其他的线程使用读取
read
:将主内存中的变量传输到线程工作内存中。载入
load
:将read
的变量放到工作内存的共享变量副本中。使用
use
:把工作内存中一个变量的值传递给执行引擎。赋值
assign
:把一个从执行引擎接收的值赋给工作内存的变量。存储
store
:把工作内存中一个变量的值传送到主内存中,以便随 后的write
操作使用。写入
write
:把store
操作从工作内存中得到的变量的值放入主内存的 变量中。
volatile 禁止内存重排序
所谓指令重排序,是指计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令进行重排。指令重排必须保证最终执行结果和代码顺序执行结果一致。
在单线程中不会有问题,但是在多线程环境下会出问题。
Kafka 进阶篇知识点
Kafka 高级篇知识点
44 个 Kafka 知识点(基础+进阶+高级)解析如下
由于篇幅有限,小编已将上面介绍的**《Kafka 源码解析与实战》、Kafka 面试专题解析、复习学习必备 44 个 Kafka 知识点(基础+进阶+高级)都整理成册,全部都是 PDF 文档**,有需求的朋友可以戳这里免费下载
评论