JVM的个人理解
JVM : JVM是Java Virtual Machine的缩写 , 意思是java虚拟机 . 对于每个程序员来说JVM都是避不开的一个概念 , 因为JVM是自动管理的 , 很少需要去手动调整 , 所以很多新手程序员对JVM都一知半解 , 比如我 . 于是就兴起了去网上大量的寻找资料 , 来详细的了解JVM是种什么样的存在 .
1. JVM的结构
JVM的内存可以当成一片空白的区域 , 这一片空白的区域里面 , 可以分为几个小的内存区域 : 程序计数器 , 虚拟机栈 , 本地方法栈 , 方法区 , 堆 .
一 . 程序计数器(Program Counter Register)
程序计数器是存放下一条指令所在单元地址的地方 . 当执行一条计算机指令的时候 , 需要根据PC中存放的指令地址 , 将指令由内存中取到指令寄存器中 , 这一过程叫做"取指令" , 取出的时候 PC中的地址自动加一或者由指针指出下一条指令的地址 , 再经过分析和执行完成第一条指令的执行 . 由此去循环重复执行指令 . 当计算机重启或关机的时候 地址归零 . 于是多线程就产生了 , 每个线程之间去根据处理器时间切换地址去进行处理 , 每个线程都有单独的程序计数器来保证能切换回原来的线程 .
总结 : 程序计数器就是存放计算机执行线程的指令所在的区域内存 , 是线程私有的的区域 .
二 . 虚拟机栈
当虚拟机栈创建的时候 , java线程也会同步创建 , 所以java栈也是线程私有的区域 . 虚拟机栈是一种后入先出的数据结构 , 当方法被调用并返回结果的时候 , 就是栈帧入栈出栈的过程 .
三 . 本地方法栈
本地方法栈是和虚拟机栈类似 , 一个是为了java方法服务 , 而本地方法栈是为了Native方法服务的 .
四 . 方法区
方法区里面包括 class文件常量池和运行时常量池 , 而class文件里面的类型信息是由类加载器在类加载时从类文件中提取出来的 .
五 . 堆
堆是存储java实例或对象的地方 .
存储的全部是对象 , 没一个对象包含一个与之对应的class文件信息 , 堆中不存放基本类型和对象引用 , 只存放对象本身 . 堆也是被所有线程所共享 .