没有合适的资源?快使用搜索试试~ 我知道了~
jvm学习笔记(jvm内存模型&垃圾收集算法&类加载机制)
需积分: 42 19 下载量 99 浏览量
2019-01-03
23:10:58
上传
评论 2
收藏 4.69MB DOCX 举报
温馨提示
试读
18页
对jvm内存模型&垃圾收集算法&类加载机制进行了整理,读者可以作为参考进行学习和探讨,,
资源推荐
资源详情
资源评论
一:体系结构 内存模型
1, Java 技术体系模块图
2, JVM 内存区域模型:
1.方法区
也称”永久代” 、“非堆”, 它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程
共享的内存区域。默认最小值为 16MB,最大值为 64MB,可以通过-XX:PermSize 和 -
XX:MaxPermSize 参数限制方法区的大小。
运行时常量池:是方法区的一部分,Class 文件中除了有类的版本、字段、方法、接口等
描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容
将在类加载后放到方法区的运行时常量池中。
2.虚拟机栈
描述的是 Java 方法执行的内存模型:每个方法被执行的时候 都会创建一个“栈帧”用于存储
局部变量表(包括参数)、操作栈、方法出口等信息。每个方法被调用到执行完的过程,就
对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。声明周期与线程相同,是线程私有的。
局部变量表存放了编译器可知的各种基本数据类型
(boolean、byte、char、short、int、!oat、long、 double)、对象引用(引用指针,
并非对象本身),其中 64 位长度的 long 和 double 类型的数据会占用 2 个局部变量的空间,
其余数据类型只占 1 个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方
法时,这个方法需要在栈帧中分配多大的局部变量是完全确定的,在运行期间栈帧不会改
变局部变量表的大小空间。
3.本地方法栈
与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的 java 方法服务,而本地方法栈则
是为 Native 方法服务。
4.堆
也叫做 java 堆、GC 堆是 java 虚拟机所管理的内存中最大的一块内存区域,也是被各个
线程共享的内存区域,在 JVM 启动时创建。该内存区域存放了对象实例及数组(所 有 new
的对象)。其大小通过-Xms(最小值)和-Xmx(最大值)参数设置,-Xms 为 JVM 启动时申请
的最小内存,默认为操作系统物理内存的 1/64 但小于 1G,-Xmx 为 JVM 可申请的最大内
存,默认为物理内存的 1/4 但小于 1G,默认当空余堆内存小于 40%时,JVM 会增大
Heap 到 -Xmx 指定的大小,可通过-XX:MinHeapFreeRation=来指定这个比列;当空
余堆内存大于 70%时,JVM 会减小 heap 的大小到 -Xms 指定的大小,可通过
XX:MaxHeapFreeRation=来指定这个比列,对于运行系统,为避免在运行时频繁调整
Heap 的大小,通常 -Xms 与-Xmx 的值设成一样。
由于现在收集器都是采用分代收集算法,堆被划分为新生代和老年代。新生代主要存储新
创建的对象和尚未进入老年代的对象。老年代存储经过多次新生代 GC(Minor GC)任然存
活的对象。
新生代:
程序新创建的对象都是从新生代分配内存,新生代由 Eden Space 和两块相同大小的
Survivor Space(通常又称 S0 和 S1 或 From 和 To)构成,可通过-Xmn 参数来指定新生
代的大小,也可以通过-XX:SurvivorRation 来调整 Eden Space 及 Survivor Space 的
大小。
老年代:
用于存放经过多次新生代 GC 任然存活的对象,例如缓存对象,新建的对象也有可能直接
进入老年代,主要有两种情况:①.大对象,可通过启动参数设置 -
XX:PretenureSizeThreshold=1024(单位为字节,默认为 0)来代表超过多大时就不在
新生代分配,而是直接在老年代分配。 ②.大的数组对象,切数组中无引用外部对象。
老年代所占的内存大小为-Xmx 对应的值减去-Xmn 对应的值。
5.程序计数器
是最小的一块内存区域,它的作用是当前线程所执行的字节码的行号指示器,在虚拟机的
模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节
码指令,分支、循环、异常处理、线程恢复等基础功能都需要依赖计数器完成。
三:直接内存
直接内存并不是虚拟机内存的一部分,也不是 Java 虚拟机规范中定义的内存区域。
jdk1.4 中新加入的 NIO,引入了通道与缓冲区的 IO 方式,它可以调用 Native 方法直接分
配堆外内存,这个堆外内存就是本机内存,不会影响到堆内存的大小。
Java 虚拟机学习(2):垃圾收集算法
跟踪收集器
跟踪收集器采用的为集中式的管理方式,全局记录对象之间的引用状态,执行时从一些列 GC
Roots 的对象做为起点,从这些节点向下开始进行搜索所有的引用链,当一个对象到 GC Roots
没有任何引用链时,则证明此对象是不可用的。
下图中,对象 Object6、Object7、Object8 虽然互相引用,但他们的 GC Roots 是不可到达的,所
以它们将会被判定为是可回收的对象。
可作为 GC Roots 的对象包括:
虚拟机栈(栈帧中的本地变量表)中的引用对象。
方法区中的类静态属性引用的对象
方法区中的常量引用的对象
本地方法栈中 JNI 的引用对象。
主要有复制、标记清除、标记压缩三种实现算法。
1. 标记 – 清除算法
标记清除算法是最基础的收集算法,其他收集算法都是基于这种思想。标记清除算法分为“标
记”和“清除”两个阶段:首先标记出需要回收的对象,标记完成之后统一清除对象。
它的主要缺点:
②. 标记和清除过程效率不高
②.标记清除之后会产生大量不连续的内存碎片
剩余17页未读,继续阅读
资源评论
cj198872
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- main.c
- Unity 创建快捷方式自动启动
- 一分钟一条原创视频,蹭热点撸收益,条条爆款,狂撸各大平台,轻松日入1000+-教程网盘链接提取码下载 .txt
- 51单片机实现万年历,包括闹钟的设置与秒表功能(汇编)
- STM32单片机FPGA毕设电路原理论文报告铁合金电炉单片机电力监控系统的研究
- STM32单片机FPGA毕设电路原理论文报告贴片元件封装机的智能控制系统设计
- STM32单片机FPGA毕设电路原理论文报告体育高考投篮自动测试系统的设计与实现
- STM32单片机FPGA毕设电路原理论文报告提高放疗精度的单片机控制方法
- C++ matplot学习及demo实操
- STM32单片机FPGA毕设电路原理论文报告提高单晶炉加热电源控制电路精度的研究
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功