写点什么

# 技术栈知识点巩固,开发多年 HashMap 原理不知道

发布于: 2 小时前

新生代中为什么要分为 Eden 和 Survivor
  • 如果没有Survivor区,那么Eden每次满了清理垃圾,存活的对象被迁移到老年区,老年区满了,就会触发Full GCFull GC是非常耗时的。

  • Jvm优化主要就是增加Minor Gc减少FullGc



JVM 出现 FullGC 很频繁,怎么去线上排查问题?

原因


  • 程序执行了System.gc() 有可能触发FullGC

  • 老年代空间不足。

  • 方法区空间不足。


解决方法


  • 通过Jvm参数获取堆快照



# 生成内存快照文件
-XX:HeapDumpBeforeFullGC
-XX:HeapDumpPath=保存dump文件的文件绝对路径
复制代码


  • 通过Jdk自带的工具



# 导出内存dump文件
jmap -F -dump:live,file=jmap.hprof [PID]
# 把dump文件从线上主机下载到本地
scp local_file remote_ip:remote_file
复制代码


  • 生成内存快照,分析内存快照。



JVM 中一次完整的 GC 流程是怎样的,对象如何晋升到老年代
说说你知道的几种主要的 JVM 参数。
  • Xms:最小堆内存

  • Xmx:堆的最大内存

  • Xmn:新生代内存



Java 对象的创建过程
  • 类的生命周期可见:https://blog.csdn.net/qq_37248504/article/details/106302662

  • JVM首先会检查相关类型是否已经加载并初始化,如果没有,则 JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。




类初始化顺序


  • 父类静态变量、静态初始化块

  • 子类静静态变量、静态初始化块

  • 父类初始化块、构造方法

  • 子类初始化块、构造方法



Jvm 参数配置


常用参数



-Xms:初始堆大小(最小堆)。
-Xmx:最大堆大小。
-Xmn:年轻代大小(Sun官方推荐配置为整个堆的3/8)。
-Xss:每个线程的堆大小(在相同物理内存下,减小这个值能生成更多的线程)。
-Xms 和 -Xmx 设置成一致的值可以避免堆自动扩展。
JVM内存大小 = 年轻代大小 + 老年代大小 + 持久代大小(perm)。
复制代码



G1 和 cms 区别

G1


  • G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用。

  • 可预测垃圾回收停顿时间。

  • 使用标记整理算法,降低内存空间碎片。


Cms


  • CMS收集器是老年代的收集器,可以配合新生代的 Serial 和ParNew收集器一起使用。

  • 使用标记清除算法,容易产生内存碎片。



打出线程栈信息
  • 找出服务进程idps -ef|grep java



sudo -u admin jstack pid > jstack.txt
复制代码



类加载的执行过程



对象的访问定位有哪两种方式?

User user = new User();
复制代码


  • user表示一个本地引用,存储在栈的本地变量表中,表示一个引用类型的数据。

  • new User()作为实例对象放在堆中,Java堆中存放了对象的类型、方法等信息。


使用句柄




直接指针


  • 图片来自:https://www.jianshu.com/p/8580ab50e261




jvm 调优的工具
JVM 垃圾回收机制,何时触发 MinorGC 等操作呢?
  • MinorGC:新生代GC,对象优先在 eden 创建并区分配内存,当 eden 区内存无法为一个新对象分配内存时,就会触发 MinorGC

  • FullGc:老年代GCjvm调优主要是尽可能增加MinorGC减少FullGc



对象什么时候会进入老年代?
  • 对象年龄达到一定的大小 ,就会离开年轻代, 进入老年代。

  • 若对象体积太大, 新生代无法容纳这个对象。



内存泄漏和内存溢出区别?

内存泄漏


  • 程序在申请内存后,无法释放已申请的内存空间就造成了内存泄漏,内存泄漏堆积后的后果就是内存溢出。

  • 对象被引用,无法回收。例如没有关闭流、集合没有清空


内存溢出


  • 指程序申请内存时,没有足够的内存供申请者使用。

  • 例如 从数据库中查出大量数据、创建大量的对象没有回收。



什么情况下会发生栈内存溢出。什么时候发生堆溢出?你是怎么排错的?

栈溢出


  • 方法不能存栈帧中弹出,例如递归调用死循环。


堆溢出


  • 创建大量的对象后,没有进行垃圾回收。


排错方法


  • 生成内存快照文件,分析快照文件。

  • 查看程序输出的日志文件。



tomcat 类加载机制
  • Tomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),各个web应用自己的类加载器(WebAppClassLoader)会优先加载,加载不到时再交给commonClassLoader走双亲委托。

  • 图片来源:https://www.cnblogs.com/aspirant/p/8991830.html




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()



public static void gc() {
Runtime.getRuntime().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 禁止内存重排序

指令重排序


  • 所谓指令重排序,是指计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令进行重排。指令重排必须保证最终执行结果和代码顺序执行结果一致。

  • 在单线程中不会有问题,但是在多线程环境下会出问题。



public void test(){
// a b c 通过指令重排 执行的顺序不一定
int a = 1;
int b = 2;
int c = a+4;
int d = a*a;
}
复制代码

Kafka 进阶篇知识点


Kafka 高级篇知识点



44 个 Kafka 知识点(基础+进阶+高级)解析如下



由于篇幅有限,小编已将上面介绍的**《Kafka 源码解析与实战》、Kafka 面试专题解析、复习学习必备 44 个 Kafka 知识点(基础+进阶+高级)都整理成册,全部都是 PDF 文档**,有需求的朋友可以戳这里免费下载

用户头像

VX公众号:编程进阶路 2020.11.28 加入

还未添加个人简介

评论

发布
暂无评论
# 技术栈知识点巩固,开发多年HashMap原理不知道