没有合适的资源?快使用搜索试试~ 我知道了~
看完白鹤翔jvm视频后,整理的笔记,2积分绝对超值,收获你的第一份jvm笔记吧~
资源推荐
资源详情
资源评论
JVM
本章内容:
、 虚拟机概述和基本概念
、堆、栈、方法区
、了解虚拟机参数
、垃圾回收概念和算法、及对象的分代转换
、垃圾收集器
、 性能影响实验
、性能监控工具
1 Java 虚拟机介绍
1.1 java 虚拟机原理
所谓虚拟机,就是一台虚拟的机器。它是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为 系统虚拟机和程序虚拟机,大
名鼎鼎的 、 就属于系统虚拟机,它们完全是对物理计算机的仿真,提供类一个可运行完整操作系统的软件平台。程序虚
拟机典型代表就是 虚拟机,它专门为执行单个计算机程序而设计,在 虚拟机中执行的指令是 字节码指令。无论是系统虚拟机
还是程序虚拟机。在上面运行的软件都被限制于虚拟机提供的资源中。 发展至今,出现过很多虚拟机,现在引用最广泛的是 虚
拟机,处理 以外,还有 !" 的 #,目前 # 和 都被 $ 收入旗下,大有整合的趋势。
1.2 java 虚拟机结构
) 类加载子系统:负责从文件系统或者网络中加载 % 信息,加载的类信息存放于一块称为方法区的内存空间。
) 方法区:存放类信息、常量信息、常量池信息,包括字符串字面量和数字常量等。
) 堆:虚拟机启动的时候建立,它是 程序最主要的内存工作区域。几乎所有的 对象实例都存放在 堆中。堆空间是所
有线程共享的。
) 直接内存: 的 &'$ 库允许 程序使用直接内存。直接内存是在 堆外的、直接向系统申请的内存空间。通常访问直接内存的
速度会优于 堆。因此出于性能的考虑,读写频繁的场合可能会考虑使用直接内存。
由于直接内存在 堆外,因此它的大小不会直接受限于 ( 指定的最大堆大小,但是系统内存是有限的, 堆和直接内存的总和依然受
限于操作系统能给出的最大内存。
) 栈:每一个 虚拟机线程都有一个私有的 栈,一个线程的 栈在线程创建的时候被创建, 栈中保存着帧信息,
栈中保存着局部变量、方法参数,同时和 方法的调用、返回值密切相关。
) 本地方法栈:本地方法栈和 栈非常类似,最大的不同在于 栈用于方法的调用,而本地方法栈则用于本地方法的调用,作为对
虚拟机的重要扩展, 虚拟机允许 直接调用本地方法(通常使用 % 编写)
) 垃圾回收系统: 虚拟机的重要组成部分,垃圾回收器可以对方法区、 堆和直接内存进行回收。其中, 堆是垃圾收集器的
工作重点。 虚拟机有自己一套垃圾回收机制,无需程序员手动清理,对于不再使用的垃圾对象,垃圾回收系统会在后台默默工作,
默默查找、标识并释放垃圾对象,完成包括 堆、方法区和直接内存中的全自动化管理。
)) *%(*+% )寄存器:也是每一个线程私有的空间, 虚拟机会为每一个 线程创建 *% 寄存器。在任意时刻,一个
线程总是在执行一个方法,这个正在被执行的方法称为当前方法。如果当前方法不是本地方法, *% 寄存器就会指向当前正在被执
行的指令。如果当前方法是本地方法,那么 *% 寄存器的值就是 ,- ,,寄存器存放如当前执行环境指针、程序计数器、操作栈指
针、计算的变量方法等信息。
.) 执行引擎: 虚拟机的最核心组件之一,它负责执行虚拟机的字节码,现代虚拟机为了提高执行效率,会使用即时编译技术将方法编
译成机器码后再执行。
2 堆、栈、方法区
2.1 三者概念与联系
堆解决的时数据存放的问题,即数据怎么放,放在那儿。
栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。
方法区则是辅助栈的快永久区(*),解决堆栈信息的产生、是先决条件。
创建一个新的对象 /,那么 / 类的一些信息(类信息、静态信息都存放在方法区中)
而 / 类实例化出来之后,被存储到 堆中,一块内存空间
使用的时候,都是使用 / 对象的引用,如 /0 1/23;
这里 就是存放在 栈中的,即 / 真实对象的一个引用。
2.2 Java 堆初步认识
堆是和应用程序关系最为密切的内存空间,几乎所有的对象都存放在堆上。并且 堆是完全自动化管理的,通过垃圾回收机制,
垃圾对象会被自动清理,而不需要显示的释放。
根据 回收机制的不同, 堆有可能拥有不同的结构。最为常见的一种构成是将整个 堆分为新生代和老年代。其中新生代存
放新生对象或者年龄不大的对象,老年代则存放老年对象。新生代有可能分为 , 区、4 区、 区,4 区和 区也被称为 5 和 区,
他们是两块大小相同、可以互换角色的内存空间。
如下图:显示了一个堆空间的一般结构:
在绝大多数情况下,对象首先分配在 , 区,在一次新生代回收之后,如果对象还存活,则进入 4 或者 ,每经过一次新生代回收,
对象如果存活,它的年龄就会加 。当对象的年龄达到一定条件后,就会被认为是老年对象,从而进入老年代。其具体的垃圾回收算法在后面
会介绍。
2.3 Java 栈初步认识
栈是一块线程私有的内存空间。如果说, 堆和程序数据密切相关,那么 栈就是和线程执行密切相关。线程执行的基本行为
是函数调用,每次函数调用的数据都是通过 栈传递的。
栈与数据结构上的栈有着类似的含义,它是一块先进后出的数据结构,只支持出栈和进栈两种操作,在 栈中保存的主要内容为
栈帧。每一次函数调用,都会有一个对应的栈帧被压入 栈,每一个函数调用结束,都会有一个栈帧被弹出 栈。
如下图:栈帧和函数调用。函数 对应栈帧 ,函数 对应栈帧 ,依次类推。函数 中调用函数 ,函数 中调用函数 ,函数 调用函数 。当函
数 被调用时,栈帧 入栈,当函数 调用时,栈帧 入栈,当函数 被调用时,栈帧 入栈,当函数 被调用时,栈帧 入栈。 当前正在执行的函数
所对应的帧就是当前帧(位于栈顶),它保存着当前函数的局部变量、中间计算结果等数据。
当函数返回时,栈帧从 栈中被弹出, 方法区有两种返回函数的方式,一种是正常的函数返回,使用 指令,另一种是抛出异常。不管使用
哪种方式,都会导致栈帧被弹出。
提示:由于每次函数调用都会产生对应的栈帧,从而占用一定的栈空间,因此,如果栈空间不足,那么函数调用自然无法继续进行下去。当请求的栈深度大于最大
可用栈深度时,系统会抛出 #$61! 栈溢出错误。
在一个栈帧中,至少包含局部变量表、操作数栈和帧数据区几个部分。
局部变量表:用于报错函数的参数及局部变量。
操作数栈:主要保存计算过程中的中间结果,同时作为计算过程中变量临时存储空间。
帧数据区:除了局部变量表和操作数栈以外,栈还需要一些数据来支持常量池的解析,这里帧数据区保存着访问常量池的指针,方便程序
访问常量池,另外,当函数返回或者出现异常时,虚拟机必须有一个异常处理表,方便发送异常的时候找到异常的代码,因此异常处理表也是
帧数据区的一部分。
详细参考:7899111: ;+:9<1;+99.4:7
2.4 Java 方法区认识
方法区和堆一样,方法区是一块所有线程共享的内存区域,它保存系统的类信息,比如类的字段、方法、常量池等。方法区的大小决
定类系统可以保存多少个类,如果系统定义太多的类,导致方法区溢出。虚拟机同样会抛出内存溢出的错误。方法区可以理解为永久区
(*)。
方法区理解:
它保存在着被加载过的每一个类的信息;这些信息由类加载器在加载类的时候,从类的源文件中抽取出来; static 变量信息也保存
在方法区中;
可以看做是将类(Class)的元数据,保存在方法区里;
方法区是线程共享的;当有多个线程都用到一个类的时候,而这个类还未被加载,则应该只有一个线程去加载类,让其他线程等待;
方法区的大小不必是固定的,jvm 可以根据应用的需要动态调整。jvm 也可以允许用户和程序指定方法区的初始大小,最小和最大
限制;
方法区同样存在垃圾收集,因为通过用户定义的类加载器可以动态扩展 Java 程序,这样可能会导致一些类,不再被使用,变为垃
圾。这时候需要进行垃圾清理。
详细解析:7899;+:, : 9= +=799,9..>?!?.?.?!??.?!?)%?"
3 虚拟机参数配置
在虚拟机运行的过程中,如果可以跟踪系统的运行状态,那么对于问题的故障排查一定会有一定的帮助,为此,虚拟机提供类一些跟踪系统状
态的参数,使用给定的参数执行 虚拟机,就可以在系统运行时打印相关日志,用于分析实际问题。我们继续虚拟机参数配置,其实主要就是
围绕堆、栈、方法进行配置。
3.1 堆参数
3.1.1 堆分配参数(一)
@((8A* B%:使用这个参数,虚拟机启动后,只要遇到 B% 就会打印日志。
@((8A/B%:配置串行回收器
@((8A* B%C:可以查看详细信息,包括各个区的情况
D((8A* % ,E F+:将传给虚拟机的参数输出
@(:设置 程序启动时初始堆大小
@(:设置 程序能获得的最大堆大小
说明:)@(( 对系统级别的()配置,如日志信息, 使用的垃圾回收器
)非@(( 基本上都是对应用层面上的配置
A表示启动配置 @表示禁用配置,如@((8A* B%、@((8@* B%
示例:【】
public class Test01 {
public static void main(String[] args) {
剩余20页未读,继续阅读
资源评论
ashencode
- 粉丝: 25
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Python的pyqt5写的图书管理系统期末大作业源码带文档设计.zip
- pcff_interface_v1_5.off
- apk.tw_LineLite_v8a_v.2.17.1_sign.apk
- Elasticsearch实战:构建高效搜索系统的秘诀.zip
- HTML+CSS+JS网页设计:从入门到精通.zip
- 数据库课程设计:从理论到实践的全面指南.zip
- Python闭包:深入理解与应用场景解析.zip
- Win64OpenSSL-3-3-0.exe
- 课高分程设计-基于C++实现的民航飞行与地图简易管理系统-南京航空航天大学
- 航天器遥测数据故障检测系统python源码+文档说明+数据库(课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功