阿里 p7 大牛私藏的 JVM 笔记,带你从零开始成为实战高手,限时分享
今日分享开始啦,请大家多多指教~
请你谈谈你对 JVM 的理解?Java8 虚拟机和之前的变化更新?什么是 OOM,什么是栈溢出 StackOverFlowError?怎么分析?JVM 的常用调优参数有哪些?内存快照如何抓取。怎么分析 Dump 文件?知道吗?谈谈 JVM 中,类加载器你的认识?
1 JVM 的位置
2JVM 的体系结构
3 类加载器
作用:加载 Class 文件~
1)虚拟机自带的加载器 2)启动类(根)加载器 3)扩展类加载器 4)应用程序加载器
4. Native 关键字
5、 PC 寄存器
程序计数器: Program Counter Register
每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码(用来存储指向像一条指令的地址, 也即将要执行的指令代码),在执行引擎读取下一条指令, 是一个非常小的内存空间,几乎可以忽略不计。
6、方法区
Method Area 方法区
方法区是被所有线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,简单说,所有定义的方法的信息都保存在该区域,此区域属于共享区间;
静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中,但是实例变量存在堆内存中,和方法区无关。
static、final、Class、常量池~
7、 三种 JVM
Java HotSpot™ 64-Bit Server VM (build 25.241-b07, mixed mode)
BEA JRockit
IBM J9 VM
8、 堆(Heap)
Heap,一个 JVM 只有一个堆内存,堆内存的大小是可以调节的。
类加载器读取类文件后,一般会把什么东西放到堆中呢?类的实例,方法,常量,变量~,保存我们所有引用类型的真实对象。
堆内存中还要细分为三个区域:
1)新生区(伊甸园区) Young/New
2)养老区 Old
3)永久区 Perm
JDK8 以后永久区叫元空间 GC 垃圾回收,主要在伊甸园区和养老区假设内存满了,OutOfMemoryError(OOM),堆内存不够!
9、新生区、老年区、永久区
新生区:
类诞生和成长的地方,甚至死亡;
伊甸园,所有的对象都是在伊甸园区 new 出来的!
幸存者区(0,1)
永久区
这个区域常驻内存的。用来存放 JDK 自身携带的 Class 对象。Interface 元数据,存储的是 Java 运行时的一些类信息,这个区域不存在垃圾回收,关闭 JVM 虚拟就会释放这个区域的内存!
一个启动类,加载了大量的第三方 jar 包。tomcat 部署了太多的应用,大量动态生成的反射类。不断地被加载,直到内存满,就会出现 OOM。
jdk1.6 之前:永久代,常量池是在方法区;
jdk1.7:永久代,但是慢慢地退化了,去永久代,常量池在堆中
jdk1.8 之后,无永久代,常量池在元空间
源空间:逻辑上存在:物理上不存在
在一个项目中,突然出现了 OOM 故障,那么该如何排除~研究为什么出错
能够看到代码第几行出错:内存快照分析工具,MAT,Jprofiler
Debug,一行行分析代码!
MAT,Jprofiler 作用:
●分析 Dump 内存文件,快速定位内存泄漏;
●获得堆中的数据
●获得大的对象~
●…
10、 堆内存调优
调优:第一步:
第二步:
输入:-Xms1024m -Xmx1024m -XX:+PrintGCDetails
-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError 命令,可以在 Jprolier 软件中检测到哪里出了问题
-Xms 设置初始化内存大小 1/64
-Xmx 设置最大分配内存,默认 1/4
-XX:+PrintGCDetails//知道 GC 垃圾回收的信息
-XX:+HeapDumpOnOutOfMemoryError//OOM DUMP
-XX:+ 启用选项
-XX:- 不启用选项
-XX:= 给选项设置一个数字类型值,可跟单位,例如 32k, 1024m, 2g
-XX:= 给选项设置一个字符串值,例如-XX:HeapDumpPath=./dump.core
11、GC 垃圾回收
JVM 在进行 GC 时,并不是对这三个区域统一回收●新生代●幸存区●老年区 GC 两种类:轻 GC(Minor GC),重 GC(Full GC)
12、JMM
Java 平台自动集成了线程以及多处理器技术,这种集成程度比 Java 以前诞生的计算机语言要厉害很多,该语言针对多种异构平台的平台独立性而使用的多线程技术支持也是具有开拓性的一面,有时候在开发 Java 同步和线程安全要求很严格的程序时,往往容易混淆的一个概念就是内存模型。
究竟什么是内存模型?内存模型描述了程序中各个变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节,对象最终是存储在内存里面的,这点没有错,但是编译器、运行库、处理器或者系统缓存可以有特权在变量指定内存位置存储或者取出变量的值。
【JMM】(Java Memory Model 的缩写)允许编译器和缓存以数据在处理器特定的缓存(或寄存器)和主存之间移动的次序拥有重要的特权,除非程序员使用了 volatile 或 synchronized 明确请求了某些可见性的保证。
volatile 保证可见性和有序性,防止指令重排。
synchronized 保证同步
今日份分享已结束,请大家多多包涵和指点!
评论