JVM入门_笔记_狂神说

JVM探究

请你谈谈你对jvm的理解?java8虚拟机和之前的变化更新?

什么事oom,什么是栈溢出StackOverFlowError?怎么分析?

jvm的常用调优参数有哪些?

内存快照如何抓取,怎么分析Dump文件?知道吗?

谈谈jvm,类加载器你的认识?

1、jvm的位置

在操作系统之上,包含在jre里。

2、jvm的体系结构

栈、本地方法栈、程序计数器不会发生gc。

jvm调优主要在堆,方法区有一小部分。

3、类加载器

作用:加载.class文件。

新建的对象放入堆里面,引用(地址)放到栈,其中引用指向堆里面对应的对象。

1)虚拟机自带的加载器
2)启动类(根)加载器 Bootstrap ClassLoader
3)扩展类加载器 Extension ClassLoader
4)应用程序(系统类)加载器 Application ClassLoader

4、双亲委派机制

检查顺序从下至上,加载顺序从上到下。

如果一个类加载器需要加载类,那么首先它会把这个类请求委派给父类加载器去完成,每一层都是如此。一直递归到顶层,当父加载器无法完成这个请求时,子类才会尝试去加载。

5、沙箱安全机制

控制远程代码执行的权限。

jdk1.6之后的域。

6、native

包含native关键字的方法,说明java的作用范围拿不到了,会去调用底层c语言的库。

会进入本地方法栈。

调用本地方法接口JNI。

JNI作用:扩展java的使用,融合不同的编程语言为java所用。 最初:c、c++

它在内存区域中专门开辟了一块标记区域:native method stack,登记native方法

在最终执行的时候,通过JNI加载本地方法库中的方法

7、pc寄存器

线程私有,保证线程顺序。

8、方法区

方法区是被所有线程共享的,所有的字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,简单说,所有定义方法的信息都保存在该区域,此区域属于共享空间

存储内容:static、final、.class、常量池

9、栈

一旦线程结束,栈就over了。

存储:8大基本类型 + 对象引用 + 实例的方法

10、三种jvm

HotSpot

JRockit BEA

J9 vm IBM

11、堆

Heap,一个JVM只有一个堆内存,堆内存的大小是可以调节的。

堆内存划分:

1)新生区 :Eden、S0、S1。对象在这里诞生、成长、甚至死亡

Eden:所有对象都是在eden区new出来的。

2)老年区

3)永久区:jdk1.8以后,叫元空间(方法区在这里,常量池在方法区里)。这个区域是常驻内存的,用来存放jdk自身携带的class对象。

12、新生区、老年区

13、永久区(元空间)

元空间使用的是直接内存,与新生代和老年代分开。

14、堆内存调优

OOM:1)尝试扩大堆内存看结果
​ 2)分析内存,看一下哪个地方出了问题(专业工具)
Xms1024m Xmx1024m -XX:+PrintGCDetails
在一个项目中,突然出现了OOM故障,那么该如何排除?研究为什么出错
jprofiler作用:
1)分析dump内存文件,快速定位内存泄露
2)获得堆中的数据
3)获得大的对象

15、GC -> 常用算法

轻GC
重GC
引用计数法:记录每个对象 的引用次数,长时间没有被引用的对象就被清除掉。

复制算法:


好处:没有内存碎片
坏处:浪费内存空间,多了一半to空间永远是空的。
复制算法最佳使用场景:对象存活度较低的时候 -> 新生区
标记清除算法:

优点:不需要额外的空间。
缺点:两次扫描,严重浪费时间,会产生内存碎片。
标记压缩:
标记 -> 清除 -> 压缩

16、JMM

17、总结

原文地址:https://www.cnblogs.com/fxw-learning/p/13776432.html