了解 java 虚拟机基础知识
来源:互联网 发布:游戏辅助编程 编辑:程序博客网 时间:2024/05/16 07:34
要点:
1、内存模型
设计不同的模型,方便回收内存,不同的模型,占用内存的生命周期不同,分级处理
2、内存回收机制
针对不同的内存模型=》采取相应的 内存回收机制 =》因地制宜,分类回收
内存模型
一 、每个线程单独拥有的
特点:分配的内存 跟 线程的生命周期一致,线程消亡,所占内存就被回收,占用内存周期短而少,分配内存频率高
(1)虚拟机栈,或 java 栈
a、方法执行的内存模型
b、方法在执行的同时都会创建一个栈帧,栈帧,存储 局部变量表、操作栈 等信息;局部变量表在 编译期间完成分配,方法运行期间不改变大小;c、局部变量表 存储了编译期可知道的 基本数据类型、引用类型
(2)程序计数器
每一个线程都必须用一个独立的程序计数器,用于记录下一条要运行的指令
二 、所有 线程共享的,
特点:(1)多线程 关注的 关键 (2)分配内存块大,周期长,回收率低
(1)Java 堆
几乎所有的对象实例,都在 堆上分配内存。
如果大部分对象的寿命比较长,长期占用大量连续的内存空间
(2)方法区
存储 已被虚拟机加载的
【1】 类信息,这里是只对 类信息的描述,包括有类的接口、类名、属性、方法等,应用在 Class<?>, 使用类加载器加载ClassLoder
【2】常量,不变的数据,例如,final
【3】静态变量 ,
【4】运行时的常量池,包括 字符串池/字符串常量池;
三 、内存回收
1、哪些内存需要回收? 给出回收的标准
2、什么时候回收 ? 1、间隔一定时间定时回收,回收时禁止再分配内存 2、定时回收,边收变用
3、如何回收?
由以上内存模型的特点进行 分类回收
1、新生代(minor GC)
2、老年代(major GC)
怎样分类?最普遍的内存分配规则
(1)介绍 3个内存区
新生代的 Eden区, 新生代过度到老年代的中间过渡区 survivor 区, 老年代
(2)大对象直接进入老年代
(3)引入年龄机制,新生代在多次 minor GC 仍存活,每一次GC, 年龄增加 ,进入 survivor 区 ,甚至是 老年代
针对不同的区,采取不同的回收策略,目的是(1)高效 (2)减少内存碎片
1、对于老年代,内存占用大,时间较长,内存碎片少,使用 标记整理算法,这样移动的内存块较少,
2、对于新生代,使用复制算法, 完整复制1分内存过去,复制的内存块是整块的,因为新生代 生命周期短,复制的使用内存少而消亡的内存碎片多
4、可达性分析算法,判断哪些对象占用的内存该回收了。
(1)GCRoots 树, GC roots 不可达
通过一系列的“GC Roots”对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的
(2)可作为 GC Roots 的对象包括以下:
1.虚拟机栈中引用的对象
2.方法区中类静态属性引用的对象
3.方法区中常量引用的对象
- 了解 java 虚拟机基础知识
- Java基础知识了解
- java基础知识了解
- 了解JAVA虚拟机
- Java虚拟机初步了解
- java虚拟机深入了解
- 深入了解java虚拟机
- 了解Java虚拟机
- 深入了解java虚拟机
- 深入了解java虚拟机
- 深入了解Java虚拟机
- 深入了解Java虚拟机
- 深入了解java虚拟机!
- java虚拟机基础知识
- Java虚拟机基础知识
- Java虚拟机基础知识
- Java虚拟机基础知识
- Java虚拟机基础知识
- Problem J: 时间类的流插入、提取和递增、递减运算
- bootstrap的tab选项卡
- kubelet 最佳配置
- Android一个应用多个图标的几种实现方式
- codeforces 300C 乘法逆元 (乘法逆元模为素数的模板)
- 了解 java 虚拟机基础知识
- uboot的Makefile
- 字符串字典树判重Linux内核代码风格
- Ubuntu16.04 QT "QMYSQL driver not loaded on Ubuntu"问题
- Ubuntu14.04不能全屏显示的解决办法
- 2017.4.26 补天挖洞
- Ubuntu 16.04 安装mysql并设置远程访问
- Caffe学习:pycaffe接口配置
- php如何实现递归遍历文件目录?