阿里p7大牛私藏的JVM笔记,带你从零开始成为实战高手,限时分享

219 阅读5分钟

今日分享开始啦,请大家多多指教~

请你谈谈你对JVM的理解?Java8虚拟机和之前的变化更新?什么是OOM,什么是栈溢出StackOverFlowError?怎么分析?JVM的常用调优参数有哪些?内存快照如何抓取。怎么分析Dump文件?知道吗?谈谈JVM中,类加载器你的认识?

1 JVM的位置

image.png

2JVM的体系结构

image.png

3类加载器

作用:加载Class文件~

image.png

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

4. Native关键字

image.png

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

image.png

JDK8以后永久区叫元空间GC垃圾回收,主要在伊甸园区和养老区假设内存满了,OutOfMemoryError(OOM),堆内存不够!

image.png

9、新生区、老年区、永久区

新生区:

类诞生和成长的地方,甚至死亡;

伊甸园,所有的对象都是在伊甸园区new出来的!

幸存者区(0,1)

永久区

这个区域常驻内存的。用来存放JDK自身携带的Class对象。Interface元数据,存储的是Java运行时的一些类信息,这个区域不存在垃圾回收,关闭JVM虚拟就会释放这个区域的内存!

一个启动类,加载了大量的第三方jar包。tomcat部署了太多的应用,大量动态生成的反射类。不断地被加载,直到内存满,就会出现OOM。

jdk1.6之前:永久代,常量池是在方法区;

jdk1.7:永久代,但是慢慢地退化了,去永久代,常量池在堆中

jdk1.8之后,无永久代,常量池在元空间

image.png

源空间:逻辑上存在:物理上不存在

在一个项目中,突然出现了OOM故障,那么该如何排除~研究为什么出错

能够看到代码第几行出错:内存快照分析工具,MAT,Jprofiler

Debug,一行行分析代码!

MAT,Jprofiler作用:

●分析Dump内存文件,快速定位内存泄漏;

●获得堆中的数据

●获得大的对象~

●…

10、 堆内存调优

image.png

调优:第一步:

image.png

第二步:

输入:-Xms1024m -Xmx1024m -XX:+PrintGCDetails

image.png

image.png

-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保证同步

今日份分享已结束,请大家多多包涵和指点!