由于把内存控制大权交给了Java虚拟机,于是在虚拟机自动内存管理机制下,不用再为每一个new操作写配对的delete/free代码处理,所以比较不容易出现内存泄露和内存溢出问题,这里的不容易只是相对来说而已。
1·运行时数据区域
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自不同的用途、不同的生命周期长度(包含了创建和销毁时间),有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。
1·1程序计数器
首先需要了解知道这2个知识:
1·线程是CPU 最小的调度单元
2·Java 虚拟机的多线程是通过切换线程并分配处理器执行时间的方式来实现的,在任何一个确定的时间,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。
程序计数器(program counter register)是当前某一条线程上执行的字节码的信号指示器,是字节码解释器将已经装载在内存中的字节码指令读取出来并做上的记号,而CPU处理器就是根据读取出来的这个字节码指令去执行。
因为JVM的多线程是通过CPU时间片轮转(即线程轮流切换并分配处理器执行时间)算法来实现的。也就是说,某个线程在执行过程中可能会因为时间片耗尽而被挂起,而另一个线程获取到时间片开始执行。当被挂起的线程重新获取到时间片的时候,它要想从被挂起的地方继续执行,就必须知道它上次执行到哪个位置,在JVM中,通过程序计数器来记录某个线程的字节码执行位置。因此,程序计数器是具备线程隔离的特性,也就是说,每个线程工作时都有属于自己的独立计数器。
根据我理解的,以下是我的灵魂画作,不知道对不对:
计数器注意点:
1·程序计数器在Java虚拟机内存中占用比较小,有时候可以小到忽略不计。
2·如果执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令地址。
3·如果执行的是native方法(即:就是一个java调用非java代码的接口),计数器为空。
4·此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。