JVM的基本理解

JVM运行时数据区

1.1 程序计数机(PCR)的定义 特点和作用

定义:是一块较小的内存空间,可以看成当前线程正在执行的字节码的行号指示器

如果是java方法,计数器记录的就是当前线程正在执行的字节码指令地址

如果是本地方法,那么程序计数器值为undefined

作用:字节码解释器通过改变PCR依次读取指令,实现代码的流程控制。如顺序执行,异常处理

多线程情况下,PCR用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程执行到哪了。

特点:较小的内存空间,每个线程都有一个独立的程序计数器。

1.2 Java虚拟机栈(JVM Stack)

定义:是描述java方法执行的内存区域,属于线程私有,用于支持虚拟机进行方法调用,每个方法调用到执行完成的过程就是从入栈到出栈的过程。

作用:存放方法参数和局部变量

特点:局部变量表的创建是在方法被执行的时候,随着栈帧创建而创建。表的大小在编译时就确定。栈内存默认最大是1M.

java虚拟机栈也是线程私有的,每个线程都有各自的java虚拟机栈,而且随着线程的创建而创建,随着线程的死亡而死亡

1.3 本地方法栈(Native Method Stack)

定义:是用于管理Native Method(本地方法)的调用,主要是用C和C++实现

特性:线程私有   后进先出   作用是支撑Native方法调用,执行和退出

在这里插入图片描述

 1.4 Java堆(Java Heap)

定义:是一块内存区域,jvm启动时创建,存放所有的类实例以及数组对象,除此之外,还可以保存对象其他信息,如(哈希码,GC标志,同步锁信息)。

特点:java虚拟机所需管理的内存中最大的一块,是所有线程共享的一块内存区域,在虚拟机启动时创建,大小可以固定也可以扩展。

1.5 方法区(用来存放方法和static变量。)

定义:是堆的一个逻辑区划部分,护体实现根据不同虚拟机来实现。主要存放已经被虚拟机加载类型的相关信息,类信息:类名,访问修饰符,方法描述,运行时常量池,静态变量。

特点是:线程共享,内存的回收效率低,信息一般长期存在。

1.6 JVM调优的三大参数

  • -Xss:规定了每个线程虚拟机栈的大小(影响并发线程数大小)
  • -Xms:堆大小的初始值(超过初始值会扩容到最大值)
  • -Xmx:堆大小的最大值(通常初始值和最大值一样,因为扩容会导致内存抖动,影响程序运行稳定性)

1.7 Jvm中堆和栈的区别

管理方式:栈时自动释放,堆需要GC

效率:栈的效率比堆高

空间大小:栈比堆小

1.8 类记载的过程

在这里插入图片描述

 通过ClassLoader加载Class文件字节码,生成Class对象,然后进行链接

校验:检查加载到Class的正确性和安全性

准备:为类变量分配存储空间并设置类变量初始值

解析:JVM将常量池内的符号引用转换为直接引用

之后进行初始化:执行变量赋值和静态代码块。

双亲委派机制

在这里插入图片描述

 

什么是双亲委派机制
当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。
为什么要使用双亲委派机制
防止重复加载同一个.class文件,通过委托去向上级问,加载过了就不用加载了。
保证核心.class文件不会被串改,即使篡改也不会加载,即使加载也不会是同一个对象,因为不同加载器加载同一个.class文件也不是同一个class对象,从而保证了class执行安全

1.9反射机制

定义:反射是java运行时自我观察的能力,通过class,fileld,constructor,method获取类的各个组成部分。

在这里插入图片描述

 场景:第三方应用开发过程中,会需要某个类的某个成员变量,方法或者是属性私有的或者只对系统应用开发,就可以通过反射机制来获取所需的私有成员或者方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值