前言
想写一个系列的java虚拟机相关的学习笔记,因为最近通过读费曼学习法这本书意识到自己的以前的学习方式很有问题,看书只会一个劲的闷头看,笔记记得少,导致知识都是碎片化没有形成体系,看过后也缺乏系统性的学习和思考,很少去和别人交流沟通这样就无法印证自己学习的成果和正确性,所以决定通过笔记输出的方式公开的和他人去交流,以掌握正确的学习方法和学习经验,也希望大家批评指正共同进步,废话不多说。
java内存区域的划分
首先让我们先来了解一下jvm的内存,可划分为两大类六个区域
1.线程共享区域:
- 堆
- 方法区
- 运行时常量池
2.线程私有区域:
- 程序计数器(pc)
- 虚拟机栈
- 本地方法栈
下面我们会一一了解每一个区域形成笔记文章,下面看什么是程序计数器。
程序计数器
- 我们写的代码再被cpu执行的时候cpu是根据什么知道我当要执行哪条程序指令和下一条要执行的程序指令呢?其实就是通过程序计数器来实现的,程序计数器中存放的就是指令,当程序开始被执行的时候会把指令序列的起始地址加载到程序计数器中,cpu获取程序计数器中的指令并解析执行,然后通过改变这个程序计数器中的指令来选取下一条需要执行的指令,程序中的 流程、 分支、循环、异常处理线程之间的切换和恢复都需要通过程序计数器来完成。
- 如果方法是native 则程序计数器中的值是未定义也就是空的。
程序计数器的生命周期
程序计数器的生命周期是随着线程的创建而创建随着线程的销毁而销毁,因此也可以知道程序计数器是线程私有的,这也说明了程序计数器是线程私有的。为什么程序计数器要线程私有呢
因为java虚拟机的多线程是通过轮流切换线程来分配处理器的执行时间来实现的 处理器同一时间只能执行一个线程的方法,为了保证每次线程切换都能回到到正确的执行位置。所以要为每个线程都分配一个程序计数器。程序计数器会出现内存不足的情况吗
程序计数器中只存储要执行的指令地址,内存大小属于确定的而且占用的内存特别小,执行效率也特别快,所以这个区域是六个区域中唯一不会出现OutOfMemoryError异常的地方。总结
这篇文章我利用了两天下班后的时间通过阅读书籍和查看网上的资料根据自己的理解和总结写出来的,在这个信息爆炸的时代真的是大大增加了我们学习的成本,需要我们甄别哪些可以为我们所用,还有自己总是想通过一个程序计数器就把整个jvm的概念全部搞清楚,这就犯了学习知识的大忌,知识需要我们一点一滴去积累,总结把碎片的知识系统化构建我们自己的知识体系,一定不要心急,要踏踏实实。学习知识的同时积累自己的学习方法和思考方式。