JVM(Java virtual machine)Java虚拟机
对于学习Java,一定要了解到JVM的基础知识,知道JVM的内存分配以及JVM的基本常识
对于要深入理解JVM的推荐这篇,对于开发和程序运行架构有帮助 https://mp.weixin.qq.com/s/6AohfmVfbtn1-RJjG43UFw
常用总结(较为shallow):
(1)Java编译执行过程
(2)JVM内存分配 (推荐博文https://www.cnblogs.com/dingyingsi/p/3760447.html)
首先JVM的逻辑内存模型图如下
1、程序计数器:
内存较小、各条线程间的计数器互不影响,独立存储即“线程私有”;作为当前线程的行号指示器,用于记录当前虚拟机正在执行的线程指令地址
2、Java虚拟机栈(栈内存):
线程私有、存储局部变量表(Java编译期可知的各种基本数据类型、对象引用、returnAddress类型)、操作栈、动态链接、方法出口等信息,当线程请求的栈深度超过了虚拟机允许的最大深度时,就会抛出StackOverFlowError即栈内存溢出;
3、本地方法栈:
线程私有的,保存的是native方法的信息
4、Java堆区
java堆是所有线程共享的一块内存,几乎所有对象的实例和数组都要在堆上分配内存(但不是所有的对象和数组都会在堆内存分配空间),因此该区域经常发生垃圾回收的操作;
5、方法区:
存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据。主要存放java类定义信息,与垃圾回收关系不大,但不是没有垃圾回收。
GC垃圾回收:
1、确定哪些是垃圾
2、进行垃圾的回收
类加载机制:
Java虚拟机不和任何语言绑定,它只与class文件的二进制文件格式相关联,即任意门功能性语言都可以表示为一个能被Java虚拟机所接受的有效的class文件。
常量池:class文件的资源仓库;
类加载过程:
加载---验证---准备---解析---初始化
参考https://www.jianshu.com/p/355ae3bcec41,这篇笔记也比较精炼