jvm
Posted wang2386033566
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jvm相关的知识,希望对你有一定的参考价值。
一.运行时数据区
1.线程共享和线程私有:
01.线程共享:
堆,方法区
02.线程私有:
虚拟机栈,本地方法栈,程序计数器
2.程序计数器
当前线程执行字节码文件的行号指示器
能够在线程切换之后,找到自己正确的位置
是唯一一个不会导致内存泄漏(OutOfMemory,OOM)的区域
3.虚拟机栈:
基本数据类型的变量和对象的引用变量都存在此区域;
遵循“先进后出,后进先出”
StackOverFlowError:
线程请求的栈深度大于了虚拟机规定的最大深度
OutOfMemoryError:
虚拟机在扩展栈时,无法申请到足够的内存空间!
4.本地方法栈
主要服务于Native修饰的方法
在HotSport中虚拟机栈和本地方法栈合为一体
堆:
所有对象的实例和数组开辟空间都在此区域保存!
所有线程共享
GC主要回收对象的区域
1.堆分区:新生代,老年代,永久代
2.方法区(静态去)
所有线程共享;
方法(包含构造函数),接口 定义在此区域;
所有方法的信息
静态变量+常量+类信息+方法信息+常量池
二.类的生命周期:
类的生命周期从类被加载,连接和初始化开始到类的卸载结束
01.类的生命周期中,类的二进制位于方法区;
02.在堆中会有一个描述这个类的Class对象;
2.1加载将class字节码文件内容加载到内存中,并将这些静态数据转换成方法区中运行时数据结构,在堆中生成一格Class对象;这个Class对象就是方法区类数据的访问入口
2.2链接
0.1类的验证
001.类文件的结构检查
002.语义检查 比如说final修饰的变量在编译期间发现再次赋值
003.字节码验证,确保字节码能被jvm识别
0.2类的准备
为类中所有static修饰的内容开辟空间,并赋予初始值!!
static int num=100;
这时候 num=0;
0.3类的解析
符号引用:就是用字符串的形式来表示某个变量或是类,我们能看懂String a="a"; Student stu=new Student();
直接引用:是根据符号引用翻译出来的地址!
2.3 初始化
加载不是初始化
初始化指的是实例化!创建出类的实例!
初始化的时机
01.类的主动引用
001.new一个类的对象
002.通过反射的newInstance();
003.再初始化子类时候必须先初始化父类
02.类的被动引用
001.通过类名访问静态内容
002.调用类的静态常量也会不会初始化类
003.用类作为对象数组存在时,也不会初始化类
004.子类调用父类的静态变量不会加载子类的静态代码块(不会执行类的准备阶段)
以上是关于jvm的主要内容,如果未能解决你的问题,请参考以下文章