当前课程知识点:JAVA程序设计进阶 > 第六章 Java虚拟机 > 6.2 Java虚拟机内存划分 > Video
这一节我们将介绍
Java虚拟机的内存划分
也就是说Java虚拟机
在运行过程当中
它内部的这些内存结构
到底是分成哪几块
我们来看看这张图
在这张图上很明显的
把我们的Java虚拟机的内存
划分为以下这五个部分
我们从左边看的话
它分别是我们的方法区
和堆这个区
然后右半边的话
会包括我们的虚拟机栈
还包括我们的本地方法栈
以及我们的程序计数器
那这五个部分的话
我们还可以按照它的这个特性
分成两种属性
左半部这两部分的话
属于线程共享区域
也就是说不同的线程
可以去共享这部分这个区域
那右半边这部分的话
我们称之为线程私有
也就是说每个线程
都有独立拥有自己的这三个部分
那下面我们来具体介绍
这五个部分都分别是什么
首先是程序计数器
那程序计数器的话
是对于我们当前线程
执行到某条字节码的
行数的一个指示
那Java虚拟机
会根据计数器的值
来选取需要执行的操作语句
那程序计数器
它属于线程私有不可共享的
也就是说每个线程
都有自己的程序计数器
那如果你要把这个
当做共享区域来进行共享的话
会导致我们的程序计数器混乱
无法准确的执行
当前线程所需要执行的语句
那在这个区域的话
不会出现任何的
OutOfMemoryError的情况
也就是说这个
内存出界的这个错误
那我们Java虚拟机
内存的第二部分是虚拟机栈
虚拟机栈的话
也是我们经常所说到的栈内存
Java当中每一个方法
从调用直至到它这个完整的过程
就对应着一个栈帧
在虚拟机栈中
入栈到出栈的整个过程
如果我们线程请求的
栈的深度大于虚拟机
所允许的深度那就会抛出
StackOverflowError
也就是栈溢出的这种异常
那一般情况下
说我们虚拟机栈
它是可以动态扩展的
也就是说当前
大部分Java虚拟机
它是有这个特性
可以动态扩展
只不过说Java虚拟机规范中
也允许你实现虚拟机
说有固定长度的虚拟机栈
如果我们在扩展的时候
无法申请到足够多的内存
那同样也会抛出
OutOfMemoryError
这样的异常
那我们Java虚拟机中
内存的第三个部分
叫本地方法栈
本地方法栈它是用来执行
本地方法 什么叫本地方法
也就是本地方法
它不一定是拿Java语言
来编写的方法
因为我们说我们Java虚拟机的话
它是会运行在不同的操作系统
和硬件上面
那在本身Java虚拟机的
内部实现的时候
也会有一部分代码是
运行的是本地代码
非Java这个代码
包括你们自己写程序的时候
也可以比如用C或C加加
写一段程序
最后把它嵌入到Java代码当中
这也是可以的
那我们这个本地方法栈
主要是用来执行本地方法
那它同样有可能会抛出异常
那所谓的抛出异常的种类
也和我们的虚拟机栈一样
而我们的虚拟机栈
它的对应的功能
主要是用来执行我们的Java方法
那我们在Java虚拟机内存的
内部结构的第四部分就是堆
那堆的话是Java虚拟机当中
内存最大 线程共享的一块区域
它唯一的目的
是存储各种对象实例
那堆的话也是我们垃圾回收器
主要工作的区域
那由于现在垃圾收集器
采用的是分代收集算法
所以Java堆
也分为新生代的堆和老年代的堆
如果大家在运行
这个Java程序的时候
你一样也可以通过一些参数
来去配置一下
你运行Java虚拟机的时候
它的一些内存的大小
比如说你可以通过参数-Xmx
来设计一下
就是说配置一下
我们Java虚拟机最大可用内存
或者用-Xms来去设置一下
我们的这个Java虚拟机的初始内存
当然这些设置
如果到了一定程度
比如说我们随着这个
Java程序运行过程当中
占用的内存越来越多的时候
那我们的内存无法扩展时
它就会出现
OutOfMemoryError
也就是这个内存超出的这种错误
那我们Java虚拟机内存的
内部结构的第五部分叫方法区
那方法区的话
是虚拟机当中内存共享的一片区域
它主要用来存储我们各种类信息
存储我们的常量
存储静态变量 存储class文件
那我们的垃圾回收器
也会对这部分区域进行回收
比如对常量池的清理
和对类型的卸载
那当我们方法区的内存
不够用的时候
它同样也会抛出
OutOfMemoryError这样错误
那关于Java虚拟机的内存的
内部结构的内容
这一节就介绍到这里
-1.0 导学
--Video
-1.1 线程的基本概念
--Video
-1.1 线程的基本概念--作业
-1.2 通过Thread类创建线程
--Video
-1.2 通过Thread类创建线程--作业
-1.3 线程的休眠
--Video
-1.3 线程的休眠--作业
-1.4 Thread类详解
--Video
-1.5 通过Runnable接口创建线程
--Video
-1.5 通过Runnable接口创建线程--作业
-1.6 线程内部的数据共享
--Video
-2.0 导学
--Video
-2.1 线程同步的思路
--Video
-2.2 线程同步的实现方式—Synchronization
--Video
-2.3 线程的等待与唤醒
--Video
-2.4 后台进程
--Video
-2.5 线程的生命周期与死锁
--Video
-2.6 线程的调度
--Video
-3.0 导学
--Video
-3.1 线程安全与线程兼容与对立
--Video
-3.2 线程的安全实现-互斥同步
--Video
-3.3 线程的安全实现-非阻塞同步
--Video
-3.4 线程的安全实现-无同步方案
--Video
-3.5 锁优化
--Video
-4.0 导学
--Video
-4.1 URL对象
--Video
-4.2 URLConnection对象
--Video
-4.3 Get请求与Post请求
--Video
-4.4 Socket通信原理
--Video
-4.5 Socket通信实现
--Video
-5.0 导学
--Video
-5.1 Socket 多客户端通信实现
--Video
-5.2 数据报通信
--Video
-5.3 使用数据报进行广播通信
--Video
-5.4 网络聊天程序
--Video
-6.0 导学
--Video
-6.1 Java虚拟机概念
--Video
-6.2 Java虚拟机内存划分
--Video
-6.3 Java虚拟机类加载机制
--Video
-6.4 判断对象是否存活算法及对象引用
--Video
-6.5 分代垃圾回收
--Video
-6.6 典型的垃圾收集算法
--Video
-6.7典型的垃圾收集器
--Video
-7.0 导学
--Video
-7.1 集合框架与ArrayList
--Video
-7.2 LinkedList
--Video
-7.3 HashMap与HashTable
--Video
-7.4 TreeMap与LinkedHashMap
--Video
-7.5 HashSet
--Video
-8.0 导学
--Video
-8.1 Java反射机制
--Video
-8.2 Java静态代理
--Video
-8.3 Java动态代理
--Video
-8.4 Java 反射扩展-jvm加载类原理
--Video
-8.5 Java进阶课程总结
--Video