# 技术栈知识点巩固,开发多年 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区内存无法为一个新对象分配内存时,就会触发MinorGCFullGc:老年代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 文档**,有需求的朋友可以戳这里免费下载











评论