JVM内存与垃圾回收
2021-07-19 15:26:50 0 举报
AI智能生成
登录查看完整内容
Java Virtual Machine 深入了解
作者其他创作
大纲/内容
是什么?
系统虚拟机
程序虚拟机
Java的核心技术就是Java 虚拟机(Java Virtual Machine) 因为所有的Java程序都运行在Java 虚拟机内部
什么是Java虚拟机?
font color=\"#ff0000\
一次编译处处运行
自动内存管理
自动内存回收
特点
Java 虚拟机作用?
虚拟机(Virtual Machine)
Java 编译器输入的指令流基本上是一种基于 font color=\"#ff0000\
栈的指令集架构
寄存器的指令集架构
JVM 的架构模型
虚拟机启动
虚拟机执行
程序正常执行结束
程序在执行过程中遇到了异常或错误而异常终止
由于操作系统出现错误而导致Java虚拟机进程终止
虚拟机退出
JVM的生命周期
oracle 的HotSpot 虚拟机
oracle 的 JRockit
IBM 公司 J9
VM虚拟机
内存结构概述
类加载子系统作用
类加载器的分类
这个类加载font color=\"#ff0000\
并不继承与java.lang.ClassLoader 没有父类加载器
加载 扩展类加载器 和 应用程序加载器 并指定它们的父类加载器
启动类加载器(Bootstrap Class Loader)
派生于 ClassLoader类
父类加载器启动为启动类加载器
扩展类加载器 (Extension Class Loader)
父类加载器启动为 扩展类加载器
通过 classLoader#getSystemClassLoader() 方法可以获取该类加载器
应用程序加载器(Application Class Loader)
什么情况下需要自定义类加载器呢?
用户自定义类加载器
JVM虚拟机自带的加载器
Java 虚拟机对class 文件采用font color=\"#ff0000\
双亲委派模式优势?
沙箱安全机制
双亲委派机制
在 JVM中表示两个 class 对象是否为同一个类存在的两个必要条件
对类加载器的引用
主动使用分为以下7种方式
类的主动使用和被动使用
类加载器与类加载过程
什么是线程?
这些后台系统线程在 HotSpot JVM里面主要是以下几个?
概述
字节码解释器在工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令
它是唯一一个在Java 虚拟机规范中没有规定任何 outofMemoryError 情况的区域
介绍
CPU时间片
JVM 的字节码解释器就需要通过改变pc 寄存器的值来明确下一条应该执行什么样的字节码指令
使用pc 寄存器存储字节码指令地址有什么用呢?
pc 寄存器为什么会被设定为线程私有的?
两个常见的问题
程序计数器 (PC Register)
出现背景
与线程一致
生命周期
作用
JVM 直接对Java 栈的操作只有两个
对于栈来说不存在垃圾回收问题
优点
outofmemoryError(内存溢出)
stackOverflowError(栈溢出)
开发中遇到的异常有哪些?
在这个线程上正在执行的每个方法都各自对应一个栈帧
基本介绍
与当前栈帧相对应的方法就是font color=\"#ff0000\
执行引擎运行的所有字节码指令只针对在当前栈帧进行操作
运行原理
局部变量表也被称为局部变量数组或本地变量表
Slot 的理解
Slot 重复利用问题
静态变量与局部变量的对比
补充
局部变量表 (Local Variables)
栈中的任何一个元素都是可以任意的Java 数据类型
操作数栈font color=\"#ff0000\
常见的 i++和 ++i的区别
操作数栈 (Operand Stack)(或表达式栈)
栈顶缓存(Top of Stack Cashing) 技术
每一个栈帧内部包含一个font color=\"#ff0000\
为什么需要常量池呢?
动态链接 (或指定运行时常量池的方法引用)
静态链接
动态链接
早期绑定 (Early Binding)
如果font color=\"#ff0000\
晚期绑定 ( Late Binding)
Java 中任何一个普通方法的方法都具备虚函数(晚期绑定)的特征(Java 字节码 invokevirtual 表示 C++用 virtual 表示) font color=\"#ff0000\
方法调用
虚方法
其它方法称之为 虚方法
非虚方法
虚拟机提供了一下几条方法调用指令
两者区别在于font color=\"#ff0000\
静态类型语言(Java)与动态类型语言区别
Java 语言中方法重写的本质
虚方法表在类加载的font color=\"#ff0000\
那么虚方法表什么时候创建?
虚方法表
存放调用该方法的pc 寄存器的值
方法font color=\"#ff0000\
而通过font color=\"#ff0000\
简介
正常完成出口和异常完成出口的区别在于: 通过异常完成出口退出不会给他的上层调用者产生任何的返回值
方法返回地址 (方法正常退出或者异常退出的定义)
一些附加信息
举例栈溢出的情况?(StackOverFlowError)
分配的栈内存越大越好?
垃圾回收是否涉及到虚拟机栈?
方法中定义的局部变量表是否线程安全?
面试题
栈帧的内部架构
栈的存储单位
Java虚拟机栈
什么是本地方法?
为什么要使用 native method?
现状
本地方法接口(Native Inteface)
允许被实现固定或者是可扩展的内存大小(内存溢出方面是相同的)
本地方法是使用C 语言实现的
font color=\"#0000ff\
本地方法栈 (Native Method Stack)
<JVM规范> 中对java 堆的描述是: 所有的对象实例以及数组都应当在运行时分配在堆上
堆是GC 执行垃圾回收的重点区域
Java7之前的内存逻辑上区分为 新生代+老年代+永久区
Java 8之后的内存逻辑上区分为 新生代+老年代+元空间
Java 7 与Java 8堆的区别
默认情况下 初始内存大小 : 物理电脑内存大小的/64
jps 查看程序运行端口
jstat -gc 端口
方式1
-XX: +PrintGCDetails
方式2
如何查看使用gc情况
年轻代( YongGen)
老年代 (OldGen)
font color=\"#000000\
年轻代与老年代参数怎么调整
当然开发人员可以使用 -XX:SurvivorRatio=value 来调整这个空间比例
几乎所有的Java 对象都在Eden中被new 创建出来的
绝大部分的Java 对象销毁都在新生代进行了
可以使用选项 -Xmn 设置新生代最大内存大小
年轻代与老年代
过程
总结
对象分配过程
JDK命令行
Jconsole
VisualVM
Jprofiler
Java Flight Recorder
GCViewer
GC Easy
常用调优工具有哪些
新生代收集(Young GC/minor GC)
目前只有CMS GC 会有单独收集老年代的垃圾收集器
老年代收集(Major GC / old GC)
混合回收( Mixed GC) : 收集整个新生代以及部分老年代的垃圾收集
整堆收集(Full GC): 收集整个java堆和方法区的垃圾收集器
年轻代GC(Young GC/Minor GC) 触发机制:
老年代GC(Major GC /Full GC) 触发机制
Full GC 触发机制
为什么需要把Java 堆分代?不分代就不能正常工作?
为什么需要把Java 堆分代? 不分代就不能正常工作了?
堆空间分代思想
优先分配到Eden
大对象直接存放到老年代 -- 尽量避免程序中出现过多的大对象
长期存活的对象分配到老年代
动态对象年龄判断
空间分配担保
内存分配策略 ( 或 对象提升(Promotion)规则)
为什么要有TLAB (Thread Local Allocation Buffer)?
什么是TLAB?
TLAB 说明?
为对象分配内存TLAB
-XX:+PrintFlagsInitial : 查看所有的参数默认值大小
-XX:+PrintFlagsFinal : 查看所有参数的最终值
-Xms : 堆初始默认值大小(默认物理内存的1/64)
-Xmx: 堆最大空间大小(默认物理内存1/4)
-Xmn: 设置新生代的大小
-XX:NewRadio: 配置新生代与老年代在堆结构的占比
-XX:SurvivoRatio: 设置新生代中 Eden 与 S0/S1空间的比例
-XX:MaxTenuringThreshold : 设置新生代垃圾的最大年龄
-XX:+PrintGCDetails : 输出详细的GC处理日志
-XX: HandlePromotionFailure : 是否设置空间内存担保
堆空间的参数设置
在<深入理解java虚拟机>关于java 堆内存有这样一段描述:
堆是分配对象存储的唯一选择?
这是一种可以有效减少java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法
逃逸分析的基本行为就是分析对象动态作用域
参数设置
代码优化
逃逸分析
堆 (heap)
方法区在哪里?
HotSpot 方法区
设置方法区/元空间 内存大小
方法区(Method Area)
运行时数据区概述及线程
类装载器 ClassLoader
Native Inteface本地接口
PC寄存器又叫程序计算器(类似于排班值日表)
方法区 (MethodArea)
font color=\"#c41230\
8中基本数据类型的变量+对象的引用变量+实例方法都是在函数的栈内存中分配
本地变量(Local Variables) : 输入参数 和输出参数 以及方法内变量
栈操作 (Operand Stack) : 记录入栈和出栈的操作
栈存储了什么?
遵循 font color=\"#c41230\
栈运行原理
Exception in thread \"main\" java.lang.StackOverflowError
栈 (Java stack)--栈管运行
详细介绍
伊甸园
幸存者0区
幸存者1区
新生代
养老区
元空间和永久代之间最大的区别是: font color=\"#c41230\
1.8 元空间
堆 (Java Heap)--堆管存储
jvm 体系结构概述
-Xms
-Xmx
输出详细的GC处理日志
堆物理内存分析
VM options : -Xms1024m -Xmx1024m -XX:+PrintGCDetails
idea如何进行调优呢?
byte[] by=new byte[1024*1024*40];
如何产生这错误
Exception in thread \"main\" java.lang.OutOfMemoryError: Java heap space
输出详细GC收集日志信息
GC (Allocation Failure)
[DefNew{新生代发生GC}: 2694K{new GC新生代内存占用}->320K{new GC后新生代占用也就是说2694-320就是节约出来的内存}(3072K)font color=\"#c41230\
[Times: user=0.00{用户耗时} sys=0.00font color=\"#c41230\
GC
Full GC (Allocation Failure)
FullGC
总结: [名称: GC前内存占用->GC后内存占用 (该区内存总大小)]
:+PrintGCDetails
堆 参数调优入门
次数上频繁收集 new 区
次数上较少收集 old 区
基本不动 元空间
GC是什么(分代收集算法)
GC 算法总体概览
引用计数法
子主题
原理
动态演示
what
复制算法缺点
复制算法 (copying)
老年代一般是由标记清除或者标记整理的混合使用
节约内存空间
好处
坏处
标记清除(Mark-Sweep)
老年代一般是由标记清除和标记压缩混合使用
缺点
标记压缩(Mark-Compact)
标记清除
标记压缩
标记 -清除-压缩
4大算法
GC4大算法
保证可见性
不保证原子性
禁止指令重排
volatile是java虚拟机提供的轻量级的同步机制 (丐版的synchronized)
可见性
原子性
VolatileDemo代码演示可见性+原子性代码
有序性
JMM你谈谈
JMM(Java内存模型)
JVM (Java Virtual Machine)
0 条评论
回复 删除
下一页