学习日记1--JVM(上)

4 篇文章 0 订阅

Jvm是什么

Jvm是Java Virtual Machine的缩写,它是一个虚拟出来的计算机,一种规范。通过在实际的计算机上仿真模拟各类计算机功能实现。

JVM是如何运行代码的

首先代码是我们程序员编写的,一般是以 .java的格式存在的。通过编译器把.java文件编译成.class文件,然后jvm把.class编译成机器码。

类加载器

如果jvm想要运行.class文件,我们需要将其装进一个类加载器中,类加载器会把.class文件加载到jvm

类加载器类别:
BootStrapClassLoader(启动类加载器)
ExtClassLoader(扩展类加载器)
AppClassLoader(系统类加载器)
CustomerClassLoader(用户自定义类加载器)

类加载器将.class文件加载到jvm内存中一共需要三步:
加载:加载是指java虚拟机查找.class文件,并根据这个文件创建java.lang.class对象的过程。这个所产生的对象就是我们常说的类,它存在jvm的方法区中。
链接:链接包括验证,准备和解析三个阶段
验证:确保加载的class文件符合JVM的规范,不会造成安全问题
准备:负责为静态成员分配内存,并设置初始化(例如:int a=1,此时初始值a=0后面才会赋值为1,但是如果用final修饰这个时候就直接为1了)
解析:将类的二进制数据中的符号引用替换为直接引用(例如:调用hello方法,方法地址是0000,hello就是符号引用,0000就是直接引用)
初始化: 初始化是为标记成常量的字段赋值。也就是说对static修饰的字段赋值。初始化一个类的时候,如果父类未初始化,先初始化其父类,没有继承关系,则从上往下初始化。

JVM内存区域

其中绿色部分为线程共享区,蓝色部分为非线程共享区

其中绿色部分为线程共享区,蓝色部分为非线程共享区

程序计数器:占较小的一块内存,它是当前线程执行的字节码行号指示器,类似于我们debug的时候,我们一步一步往下走那个行数。
为什么需要程序技术器?
例如一个线程失去了cpu资源,进入阻塞状态,当该线程被重新唤醒时,线程需要知道程序运行到哪一步了。

虚拟机栈:虚拟机栈是描述java方法执行的内存模型。每个线程都有自己的虚拟机栈。当线程运行方法时,会创造一个栈帧,进入到栈中,如果该方法中调用了其他方法,就会再创建一个栈帧进入栈中,后进来的方法执行完毕就会出栈,直到所有方法执行完成,栈帧全部出栈。这里有一个问题,比如我们写了一个递归方法,没有给递归方法写结束条件。那么就会出现StackOverflowError,栈帧一直被创建,却不出栈,就会超出栈的大小。
栈帧的结构:
局部变量表:存储编译器可知的各种基本类型(int,double….)和对象引用
操作数栈:用于保存计算过程中的中间结果
动态链接:每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用视为了支持方法调用过程中的动态链接
返回地址:方法开始执行后,只有2中方式可以退出:方法返回指令,异常退出
帧数据区:大小取决于JVM

本地方法栈:跟虚拟机栈一样,只不过运行的是本地方法(Native方法)。

方法区:存储了被加载的类信息,常量,静态变量,就是编译器编译后的代码信息。这里提一下,对于一个类在方法区中只可能有一个,例如:我们java写了一个User.java,编译器把代码编译成User.class,类加载器把User.class加载到方法区,生成一个java.lang.class对象,这个class对象只有一个,我们可以在堆上User u = new User()创建很多的对象,但是User u在方法区只存在一个。保证类只有一个的机制是:双亲委派机制。简单说下双亲委派机制:当类加载器加载一个.class文件时,会先看看自己是否加载过,没有的话,向上也就是父加载器询问是否加载过,一层一层向上,如果被加载过,则不加载,如果都没有加载过,在加载。当类过多,方法区无法满足内存分配需求时,会抛出OutOfMemoryError异常。

:堆是jvm内存中最大的一块区域,也是GC主要工作的地方。先看一下堆的结构

在这里插入图片描述

当对象刚被创建时,都是在Eden区,当对象被使用后会进入s1或者s2,注意是或者也就是说s1和s2不同时使用。当Eden内存不够是,会进行一次GC,把Eden和s1区域内存活的对象复制到s2。
当生成的对象太多,超过堆的内存会报OutOfMemoryError异常。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值