JVM学习笔记

JVM

JVM位置

在这里插入图片描述

JVM体系结构

在这里插入图片描述

JMM:Java内存模型

JMM作用:缓存一致性协议,用于定义数据读写的规则

类加载器

  • classLooader
  • 作用:加载Class文件

类装载器加载class文件之后,就会形成一个元数据模板(即Class)

JDK自带有三个类加载器

  • bootstrap ClassLoader(引导类加载器或启动类加载器)
    • 根类加载器,依赖于底层操作系统,由C编写而成
    • 默认负责加载jre\lib⽂件夹下的jar包和class⽂件。
    • 负责加载虚拟机的核心类库,如java.lang.*。Object类就是由根类加载器加载的
  • ExtClassLoader(标准扩展类加载器)
    • 它的父加载器为根类加载器,是AppClassLoader的⽗类加载器,由java编写而成
    • 负责加载jre\lib\ext⽂件夹下的jar包和class类。
    • 如果把我们的jar文件放在该目录下,也会自动由扩展类加载器加载。
      • ext目录:extend 翻译过来就是扩展, 也就是存放扩展的资料,就不属于Java自带的,也就是那些程序需要用到的jar包
  • AppClassLoader(应用程序类路径类加载器丶系统类加载器)
    • 它的父加载器为扩展类加载器。由java编写而成
    • 它从环境变量classpath或者系统属性java.class.path所指定的目录中加载类,是用户自定义的类加载器的默认父加载器。

原文:(14条消息) JVM基础 -> Java中有哪些类加载器? 类加载器工作原理?_rod0320的博客-CSDN博客

双亲委派机制:一个Java类加载进JVM的过程

  • 将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,子加载器才会尝试自己去加载
    • 每个类加载器对他加载过的类都有一个缓存
    • 向上委托查找,向下委托加载
  • 作用:
    • 核心API不会被随意替换
    • 避免重复加载

类加载过程

  • 静态加载:编译时加载相关的类,如果没有者报错,依赖性太强

  • 动态加载:运行时加载需要的类,运行时如果不用该类,则不报错,降低了依赖性(例:通过反射机制加载类)

  • 加载时机

    • 当创建对象时(new)//静态加载
    • 当子类被加载时,父类也被加载 //静态加载
    • 调用类中的静态成员时 //静态加载
    • 通过反射 //动态加载
  • 类加载的过程

    • 加载:将字节码从不同的数据源转化为二进制字节流加载到内存中,并生成一个代表该类的java.lang.Class对象
    • 链接
      • 验证verification
      • 准备Preparation:例:对静态变量,分配内存并默认初始化(方法区)
      • 解析Resolution:例:虚拟机将常量池内的符号引用替换为直接引用的过程
    • 初始化:例:clinit() 依次自动收集类中所有静态变量的赋值动作和静态代码块中的语句,并合并(虚拟机会保证一个类的clinit()方法在多线程的环境中被正确的加锁)

在这里插入图片描述

沙箱子安全机制

沙箱就是一个限制应用程序对系统资源的访问的运行环境

在这里插入图片描述

基本组件

  • 字节码校验器(bytecode verifier):确保Java类文件遵循Java语言规范。这样可以帮助Java程序实现内存保护。但并不是所有的类文件都会经过字节码校验,比如核心类。

  • 类装载器(class loader):其中类装载器在3个方面对Java沙箱起作用

    • 它防止恶意代码去干涉善意的代码;
    • 它守护了被信任的类库边界;
    • 它将代码归入保护域,确定了代码可以进行哪些操作。
  • 存取控制器(access controller):存取控制器可以控制核心API对操作系统的存取权限,而这个控制的策略设定,可以由用户指定。

  • 安全管理器(security manager):是核心API和操作系统之间的主要接口。实现权限控制,比存取控制器优先级高。

  • 安全软件包(security package):java.security下的类和扩展包下的类,允许用户为自己的应用增加新的安全特性,包括:

参考:(14条消息) java中的安全模型(沙箱机制)_改变ing-CSDN博客_沙箱安全机制

Native

一个native方法就是一个Java调用非Java代码的接口。一个native方法是指该方法的实现由非Java语言实现,比如用C或C++实现。在定义一个native方法时,并不提供实现体(比较像定义一个Java Interface),因为其实现体是由非Java语言在外面实现的。

参考:(14条消息) JAVA中的native是什么?_贾世鑫的博客-CSDN博客_native方法是什么意思

方法区

  • method:也叫静态区
  • 被所有线程共享
  • 存放:类(Class)、静态变量、静态方法、常量、成员方法(所有定义方法的信息)

复习:类实例化过程

假设有God父类以及其子类Person,在Person person = new Person();

在这里插入图片描述

Java虚拟机栈是线程私有的,它的生命周期与线程相同

栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。它是虚拟机运行时数据区中的java虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机里面从入栈到出栈的过程

Heap

三种JVM:HotSpot VM、JRockit、IBM的J9;JDK1.3时,HotSpot VM成为默认虚拟机

  • 一个JVM只有一个堆,堆内存大小可以条件

  • 分为三部分

    • 新生代:new出来的对象一般情况下都会在新生代里的Eden区里面分配空间
    • 老年代
    • 永久代(Java 8及之后叫元空间):存放JDK自身携带的Class对象、interface元数据,存储的是Java运行时的一些环境

在这里插入图片描述

GC

垃圾回收垃圾回收主要集中于 java 堆和方法区中

分代回收算法

复制算法:适用于新生代

优点 :不会产生内存碎片,效率高。
缺点 :耗费内存空间。

虚拟机把新生代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to),默认比例为8:1:1。

一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄 +1,当它的年龄增加到一定程度时(默认是 15 ,通过-XX:MaxTenuringThreshold来设定参数),就会被移动到年老代中。

首先Eden到To区,From中也会到To区,空的变为To区,继续活着的进入养老区

标记清除:适用于老年代

优点 :不需要额外的内存空间。
缺点 :需要暂停整个应用,会产生内存碎片;两次扫描,耗时严重。

要分成标记和清除两个阶段,先标记出要回收的对象,然后统一回收这些对象,标记清除算法就是当程序运行期间,若可以使用的内存被耗尽的时候,GC线程就会被触发并将程序暂停,随后将要回收的对象标记一遍,最终统一回收这些对象,完成标记清理工作接下来便让应用程序恢复运行。

标记压缩:适用于老年代

优点 :没有内存碎片。
缺点 :需要移动对象的成本,效率也不高(不仅要标记所有存活对象,还要整理所有存活对象的引用地址)。

标记->清除->压缩

分代收集算法

当前商业虚拟机都是采用分代收集算法,它根据对象存活周期的不同将内存划分为几块,一般是把Java堆分为新生代和老年代,然后根据各个年代的特点采用最适当的垃圾收集算法。
在新生代中,每次垃圾收集都发现有大批对象死去,只有少量存活,就选用复制算法,而老年代因为对象存活率高,没有额外空间对它进行分配担保,就必须使用标记清除或者标记压缩算法来进行回收。

内存效率: 复制算法 > 标记清除算法 > 标记整理算法(时间复杂度)
内存整齐度: 复制算法 = 标记整理算法 > 标记清除算法
内存利用率: 标记整理算法 = 标记清除算法 > 复制算法

原文:https://blog.csdn.net/q961250375/article/details/107859902

或者标记压缩算法来进行回收。

内存效率: 复制算法 > 标记清除算法 > 标记整理算法(时间复杂度)
内存整齐度: 复制算法 = 标记整理算法 > 标记清除算法
内存利用率: 标记整理算法 = 标记清除算法 > 复制算法

原文:https://blog.csdn.net/q961250375/article/details/107859902

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值