简单复盘一下这几天学到的,可能有点乱,但是希望下次再回来看这篇文章的时候,理解得更深透一点吧。
jdk1.8 的版本:
线程私有:线程内的虚拟机栈(栈)、程序计数器、本地方法栈。
线程间共享:堆、方法区。
线程栈是用来存放各种数据类型(Boolean、byte、short、int、long、float、double、char)、对象引用(使用句柄或者直接指针)等。由上面的模型图可知,栈内引用对象后,执行对象内的多个方法(栈帧)。每个栈帧都有:局部变量表、操作数栈、动态链接、方法出口,其中操作数栈就是将方法中的代码分解成一条条指令来执行,由字节码解释器修改程序计数器进行计数。名字叫栈,就有着栈的特性:先进后出,主方法(栈帧)main先进栈,根据方法内的调用,再往栈中压入后面的方法(栈帧),执行完后进的方法弹出,逐渐将结果返回到main最后弹出。java的返回方式有两种:return语句,抛出异常。不管哪一种,栈帧都会被弹出栈。
Java虚拟机栈会出现两种错误:‘stackOverFlowError‘(堆栈溢出)和 ‘OutOfMemoryError‘(内存不足)
也叫PC寄存器。由字节码解释器控制,对java方法所进行的每一条指令计数,如果是native本地方法,计数值为空。java方法中的循环、分支、跳转、异常、线程恢复都依赖计数器来完成。在多线程环境中主要用来记录执行到哪了,保存当前执行指令的地址,线程切换时进行恢复,由于是线程私有的,所以具有线程安全。它是唯一不会出现OutOfMemoryError内存不足的错误,线程会保证它的内存,生命周期随着线程的创建而创建,随着线程的死亡而死亡。
Native关键字,对本地中存在的其他语言方法进行调用。也会出现stackOverFlowError和OutOfMemoryError错误。
几乎所有的new处理的对象实例、数组都在这。在栈中使用(句柄或者直接指针)来访问堆中的对象实例。同时Java堆也是垃圾收集器管理的主要区域,也被叫做GC堆,JVM调优主要是针对这里。
目前的Java堆垃圾收集器主要是采用分代垃圾收集算法,Java堆可以进行划分:Eden区、From Survivor(幸存者)、To Survivor、老年代。垃圾回收算法有:标记-清除算法(最基础回收算法,后面的算法都是对此进行优化)、标记-复制算法、标记-整理算法、分代收集算法。
原文:https://www.cnblogs.com/bigsheng15/p/14677204.html