1.垃圾回收算法有哪些
1.标记-清除法
标记:遍历内存区域,对需要回收的对象打上标记。
清除:再次遍历内存,对已经标记过的内存进行回收
2.复制算法
将内存划分为等大的两块,每次只使用其中的一块。当一块用完了,触发GC时,将该块中存活的对象复制到另一块区域,然后一次性清理掉这块没有用的内存。下次触发GC时将那块中存活的的又复制到这块,然后抹掉那块,循环往复。
3.标记-整理法
4.分代收集法
根据对象的存活的时间的长短,将内存分为了新生代和老年代,这样就可以针对不同的区域,采取对应的算法
MinorGC和FullGC的区别
MinorGC:发生在新生代的垃圾回收,因为新生代的特点,MinorGC非常频繁,且回收速度比较快,每次回收的量也很大。
FullGC:发生在老年代的垃圾回收,也称MajorGC,速度比较慢,相对于MinorGc慢10倍左右。进行一次FullGC通常会伴有多次多次MinorGC
2.常见的垃圾回收器
Serial 收集器:工作在新生代,采用单线程,工作时需要暂停其他线程,采用复制算法。
Serial Old 收集器:工作在老年代,和Serial工作方式相同,采用标记-整理法。
ParNew收集器:工作在新生代,本质是Serial的多线程版本,采用复制算法,
Parallel Scavenge收集器(吞吐量优先收集器):工作新生代,JKD8的默认收集器,因为需求为高吞吐量使用该收集器,采用复制算法。
Paralel old 收集器:工作在老年代,是Parallel Scavenge收集器的老版本,采用标记-整理法
CMS 收集器:工作在老年代,即Concurrent Mark Sweept收集器,追求最短停顿时间。采用标记-清除法
G1收集器:全代收集器,可设置STW时间
3. 类加载器和双亲委派
bookstrapclassluader:启动类加载器 使用C++实现,加载java核心类库。加载jre/lib 下的jar包文件等。
extclassloader:扩展类加载器 加载ext目录下的文件
appclassloader:应用程序加载器 classpath目录下的类
customclassloader:自定义加载器
双亲委派:核心思想 向上委派向下加载
当需要把一个class文件加载到运行时数据区时,首先应用程序加载器会根据传进来的类的全限定名称去查找本地缓存是否加载过,如果没有就到他的父级也就是扩展类加载器去加载,如果还是找不到就继续委派到启动类加载器去查找。向下加载呢就是,当顶级的启动类加载器也找不到,就会去查询lib目录下面有没有,有就加载,没有就给到下一级扩展类去查找,如果没有就继续返回到应用系统类加载器去查找。
打破双亲委派的有:
tomcat实现的webappclasslaoder加载器 优先加载应用程序的类,找不到才会委派给父类加载,从而实现了应用的隔离。
Java的api机制,比如jdbc的实现 核心接口Dervier是启动类加载,具体实现是应用程序加载器加载,主要通过传递类加载器加载
4.运行时数据区
堆:新生代:eden区、servirv区(两个区,s0,s1 内存占比例时8:1:1), 老年代:存放s区满的,或者一些分代年龄大于15的 与老年代内存比例为3:1
栈:局部变量表、操作数栈、动态链接、返回地址
本地方法栈:C++ 底层方法使用,native的方法
方法区/元空间:类信息、常量池、静态变量
程序计数器:记录下一条指令的地址,多线程切换时能正确找到执行程序的位置,当是执行native方法时,这个数是null
5.jvm类加载的过程
加载:通过类的全限定名称去查找字节码文件,转成二进制流
链接:
准备:
验证:
解析:
初始化:
使用:
卸载:
6.jvm修改调优参数的方式有哪些?
1.通过war包部署在tomcat中的
修改tomcat的bin/catalina.sh文件JAVA_OPTS = -xms512m -xmx1024m
2.通过jar包部署的
java -jar 启动命令上添加jvm参数
7.jvm调优的参数可以修改哪些?
jvm调优就是对新生代、老年代、元空间(方法区)大小的设置,和垃圾回收器的选择
1.设置堆空间的大小:-Xms(堆的初始大小) -Xmx(堆的最大值) 一般都设置为相同大小,避免jvm在运行过程中堆空间收缩影响jvm性能默认单位为字节 byte
2.设置虚拟机栈的大小:-Xss 每个线程栈的大小
3.年轻代区的eden区和两个survivor区的大小比例:-XXSurvivorRatio = 8 默认为8:1:1
4.年轻代晋升为老年代的阈值 -XX:Max 默认15次
5.设置垃圾回收器:-XX:+ xxx
8.说一下jvm常用的调优工具
命令工具:
jps 查看进程的信息
jstack 查看进程内线程的堆栈信息
jmap 查看堆转信息 可以生成
jhat 堆转储快照分析工具
jstat jvm统计监测工具
可视化工具
jconsole 用于对 jvm 内存、线程、类的监控
VisualVM 能够监控线程,内存情况
9.Java内存泄漏的排查思路
1.通过jmap 指定打印他的内存快照dump文件
使用jmap命令获取在运行中程序的dump文件
使用vm参数获取dump文件(程序启动不了的时候)
2.拿到dump文件后,使用VisualVM工具分析dump文件,就可以查看报错和堆的信息了
10.CPU飙高排查方案和思路
1.使用top命令查看cpu占用情况,从而知道哪一个进程CPU占用较高,拿到进程id
2.查看进程中所有线程的CPU占用率,使用PS命令,拿到线程id
3.拿到线程id后就可以使用jstack 查看线程的信息了,然后再查看到打印线程的日志,一般会提示哪一行代码有问题 (注意展示的是16进制的线程id,需要转换一下)
86万+

被折叠的 条评论
为什么被折叠?



