2. JVM栈(java虚拟机栈):
(1)每个线程创建的同时会创建一个JVM栈帧,JVM栈中每个栈帧存放的为当前线程中局部基本类型的变量.
3. 本地方法栈(Native Method Stack):
(1)jvm中的本地方法是指方法的修饰符是带有native的,但是方法体不是用java代码写的另一类方法。
(2)作用同java虚拟机栈类似,区别是:虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则是为虚拟机使用到的Native方法服务。
(3)是线程私有的,它的生命周期与线程相同,每个线程都有一个。
4. 方法区(Method Area):
(1)在虚拟机启动的时候创建。所有jvm线程共享。
(2)用于存放所有已被虚拟机加载的类信息、常量、静态变量、以及编译后的方法实现的二进制形式的机器指令集等数据。
5. 程序计数器(Program Counter Register):
也叫PC寄存器,是一块较小的内存空间,它可以看做是当前线程所执行的字节码的第几行号指示器。
在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令、分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
总结: 虚拟机栈、本地方法栈、程序计数器这三个模块是线程私有的,有多少线程就有多少个这三个模块,声明周期跟所属线程的声明周期一致。以程序计数器为例,因为多线程是通过线程轮流切换和分配执行时间来实现,
所以当线程切回到正确执行位置,每个线程都有独立的程序技术器,各个线程之间的计数器互不影响,独立存储。其余是跟JVM虚拟机的生命周期一致共享的。
————————————————
6.类加载器子系统(class loader subsystem):
(1)根据给定的类名(如java.lang.Object)来装载class文件的内容到Runtimedataarea中的methodarea(方法区域)。
(2)对(1)中的加载过程是:当一个classloader启动时,classloader的生存地点在jvm中的堆,然后它去主机硬盘上去装载A.class到jvm的methodarea(方法区)
7.执行引擎 :
(1)负责执行来自类加载器子系统(class loader subsystem)中被加载类中在方法区包含的指令集,通俗讲就是类加载器子系统把代码逻辑
(什么时候该if,相加,相减)都以指令的形式加载到了方法区,执行引擎就负责执行这些指令就行了。
8.解释器:
一条一条地读取,解释并且执行字节码指令。因为它一条一条地解释和执行指令,所以它可以很快地解释字节码,但是执行起来会比较慢。这是解释执行的语言的一个缺点。字节码这种“语言”基本来说是解释执行的。
9.编译器:
(1. 即时编译器被引入用来弥补解释器的缺点。执行引擎首先按照解释执行的方式来执行,然后在合适的时候,即时编译器把整段字节码编译成本地代码。
(2. 然后,执行引擎就没有必要再去解释执行方法了,它可以直接通过本地代码去执行它。执行本地代码比一条一条进行解释执行的速度快很多。编译后的代码可以执行的很快,因为本地代码是保存在缓存里的。
9.1. jdk,jre,JVM的关系:
JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,
在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib合起来就称为jre。
10. 上图,堆内存分为三部分:
(1.新生区:是类的诞生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集,结束生命。
(2.养老区:用于保存从新生区筛选出来的 JAVA 对象,一般池对象都在这个区域活跃。
(3.永久存储区是一个常驻内存区域,用于存放JDK自身所携带的 Class,Interface 的元数据,
也就是说它存储的是运行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭 JVM 才会释放此区域所占用的内存。
11. 出现java.lang.OutOfMemoryError: Java heap space异常,说明Java虚拟机的堆内存不够。
原因有二:
(a.Java虚拟机的堆内存设置不够,可以通过参数-Xms、-Xmx来调整。
(b.代码中创建了大量大对象,并且长时间不能被垃圾收集器收集(存在被引用)。
12.双亲委派机制:
JVM在加载类时默认采用的是双亲委派机制。通俗的讲:
就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,(bootStrap、extclassLoader、appclassloader三个是父子类加载器)
如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
13. 什么时候会发生Full GC?
(1)调用System.gc()方法的
(2)老年代空间不足。【老年代空间只有在新生代对象转入及创建大对象、大数组时才会出现不足的现象】
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618164986)
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!