JVM模型学习笔记

JVM由三个主要的子系统构成

1. 运行时数据区(内存结构):

运行时数据区也是JVM的核心部分

内存数据区又分:堆、java栈、本地方法栈、程序计数器、方法区

1.1 本地方法栈(线程私有):

登记native方法,在Execution Engine执行时加载本地方法库


1.2 程序计数器(线程私有):

就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,也即将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不记。

1.3 方法区(线程共享):

类的所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。简单说,所有定义的方法的信息都保存在该区域,静态变量+常量+类信息(构造方法/接口定义)+运行时常量池都存在方法区中,虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。

1.4 Java栈(线程私有):

Java线程执行方法的内存模型,一个线程对应一个栈,每个方法在执行的同时都会创建一个栈帧(用于存储局部变量表,操作数栈,动态链接,方法出口等信息)不存在垃圾回收问题,只要线程一结束该栈就释放,生命周期和线程一致

JVM对该区域规范了两种异常:
1) 线程请求的栈深度大于虚拟机栈所允许的深度,将抛出StackOverFlowError异常
2) 若虚拟机栈可动态扩展,当无法申请到足够内存空间时将抛出OutOfMemoryError,通过jvm参数–Xss指定栈空间,空间大小决定函数调用的深度

1.5 栈针:

每一个线程会有很多个栈针,每一个栈针代表该线程要执行的一个方法,以下是栈针内部的结构:

1.6堆(线程共享):

虚拟机启动时创建,用于存放对象实例,几乎所有的对象(包含常量池)都在堆上分配内存,当对象无法再该空间申请到内存时将抛出OutOfMemoryError异常。同时也是垃圾收集器管理的主要区域。可通过 -Xmx –Xms 参数来分别指定最大堆和最小堆

 上图为堆的内存模型,堆可分为 新生代老年代元数据区(JDK1.8以后出现的)

新生代:
类诞生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集,结束生命。
新生区分为两部分: 伊甸区(Eden space)和幸存者区(Survivor pace) ,所有的类都是在伊甸区被new出来的。幸存区有两个: 0区(Survivor 0 space)和1区(Survivor 1 space)。当伊甸园的空间用完时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。然后将伊甸园中的剩余对象移动到幸存 0区。若幸存 0区也满了,再对该区进行垃圾回收,放到 1区,默认1和0两区交替回收15次后,还存活的对象就进入老年代。

老年代:

新生代经过多次GC仍然存活的对象移动到老年区。若老年区也满了,那么这个时候将产生MajorGC(FullGC),进行老年区的内存清理。若老年区执行了Full GC之后发现依然无法进行对象的保存,就会产生OOM异常“OutOfMemoryError”

元数据区:

元数据区取代了永久代(jdk1.8以前),本质和永久代类似,都是对JVM规范中方法区的实现,区别在于元数据区并不在虚拟机中,而是使用本地物理内存,永久代在虚拟机中,永久代逻辑结构上属于堆,但是物理上不属于堆,堆大小=新生代+老年代。元数据区也有可能发生OutOfMemory异常。
Jdk1.6及之前: 有永久代, 常量池在方法区
Jdk1.7:       有永久代,但已经逐步“去永久代”,常量池在堆
Jdk1.8及之后: 无永久代,常量池在元空间

元数据区的动态扩展,默认–XX:MetaspaceSize值为21MB的高水位线。一旦触及则Full GC将被触发并卸载没有用的类(类对应的类加载器不再存活),然后高水位线将会重置。新的高水位线的值取决于GC后释放的元空间。如果释放的空间少,这个高水位线则上升。如果释放空间过多,则高水位线下降。
为什么jdk1.8用元数据区取代了永久代?
官方解释:移除永久代是为融合HotSpot JVM与 JRockit VM而做出的努力,因为JRockit没有永久代,不需要配置永久代

2.类加载器子系统:

2.2 类加载:

类加载器将class文件加载到虚拟机的内存
        加载:在硬盘上查找并通过IO读入字节码文件
        连接:执行校验、准备、解析(可选)步骤
        校验:校验字节码文件的正确性
        准备:给类的静态变量分配内存,并赋予默认值
        解析:类装载器装入类所引用的其他所有类
        初始化:对类的静态变量初始化为指定的值,执行静态代码块

2.3 类加载器种类:

启动类加载器:负责加载JRE的核心类库,如jre目标下的rt.jar,charsets.jar等
扩展类加载器:负责加载JRE扩展目录ext中JAR类包,如JRE\lib\ext 下的.jar
系统类加载器:负责加载ClassPath路径下的类包
用户自定义加载器:负责加载用户自定义路径下的类包,如tomcat会自己写类加载器

2.4 类加载机制

全盘负责委托机制:当一个ClassLoader加载一个类时,除非显示的使用另一个ClassLoader,该类所依赖和引用的类也由这个ClassLoader载入
双亲委派机制:指先委托父类加载器寻找目标类,在找不到的情况下在自己的路径中查找并载入目标类

双亲委派的意义:

沙箱安全机制:自己写的String.class类不会被加载,这样便可以防止核心API库被随意篡改
避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再   加载一次

 


3.执行引擎:

读取运行时数据区的Java字节码并逐个执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[css] css的负边距有哪些应用场景?

[css] css的负边距有哪些应用场景? 垂直水平居中 通过伪元素扩大元素覆盖范围个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

tomcat 设置虚拟路径的4种方法

通常使用方法1或者方法2 方法1 (添加配置文件):推荐使用,不需要重启服务器 在Tomcat根目录下的/conf/Catalina/localhost/ 路径下新建一个filename.xml,并在该xml中编写语句 即可创建虚拟站点,虚拟站点名为…

sharding-sphere按月动态分表

公司有个记录表,每天有几百万的数据,所以我决定按月把他分下表。 用spring整合的。 首先,sharding-sphere不支持自动创建表,所以我提前创建了两年的表,命名规则 logicTableName _2019_06 以下是官方文档上面的分片…

[css] 你了解CSS Houdini吗?说说它的运用场景有哪些?

[css] 你了解CSS Houdini吗?说说它的运用场景有哪些? Houdini是一组底层API,它们公开了CSS引擎的各个部分,从而使开发人员能够通过加入浏览器渲染引擎的样式和布局过程来扩展CSS。 Houdini是一组API,它们使开发人员可…

python 入门学习

把sublime编辑的.py文件保存在本地,在当前目录下输入 1 python hello.py 即可运行该程序,一定要在当前目录下运行。如果当前目录下没有该文件则不能成功运行。 其中cmd黑窗口下有这么几个快捷键, c: 进入另一个盘 dir 显示当前目录 tab 进…

[css] 列举一些你认为最“昂贵”的css属性并解释为什么

[css] 表列举一些你认为最“昂贵”的css属性并解释为什么 filter 吧,学过高斯模糊算法的表示头疼个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

大厂Java岗面试心得记录

最近裸辞,面了几家大厂,offer率高达100% 哈哈,然后发现选公司也是一件难事。 废话不多说,分享一下,我遇到的面试题,大概有以下这些: JVM: 1.JVM有哪些区域? 2.堆和栈分别说说内部东…

原生Js 两种方法实现页面关键字高亮显示

方法一 依靠正则表达式修改 1.获取obj的html 2.统一替换html标签 3.替换要修改的关键字 4.再把html标签修改回去 不足就是如果查找的关键字跟替换的标签一样就有冲突了 <!DOCTYPE HTML> <html lang"en"> <meta http-equiv"Content-Type" co…

[css] 为什么说css的选择器是从右向左匹配?

[css] 为什么说css的选择器是从右向左匹配&#xff1f; 从右往左匹配会首先排除很多错误的匹配&#xff0c;打个简单的比方&#xff0c;孩子只有一个父亲&#xff0c;但是父亲可以有很多个孩子&#xff0c;从孩子找父亲简单&#xff0c;从父亲找某个指定的孩子可能就会找到错误…

SpringBoot启动报错java.nio.charset.MalformedInputException: Input length = 2解决方案

最近新搭的一个项目&#xff0c;启动时&#xff0c;会报MalformedInputException这个异常&#xff0c; 百度了很久&#xff0c;网上说的千篇一律&#xff0c; 有的说&#xff0c;把yml复制到txt再复制回来 有的说&#xff0c;设置eclipse的utf-8环境 这些根本没有根治这个问…

IDEA主题设置与eclipse代码风格一致

习惯了用eclipse的你&#xff0c;是不是转到用idea特别不习惯&#xff0c;没有关系&#xff0c; 我们可以把idea的代码风格改成eclipse的&#xff0c;快捷键也换成eclipse的。 下载这个jar包&#xff0c;导入settings文件即可 下载地址 : https://download.csdn.net/download…

bash shell 中时间操作常用方法总结

在日常的工作中&#xff0c;bash shell 的时间操作非常频繁。比如shell脚本定时发送数据统计的时候&#xff0c;会查看当前是否为预定的发送时间。或者使用文件保存一些数据时&#xff0c;一般会生成时间字符串当做文件名的一部分。总结一下&#xff0c;以后再用到就不用上网到…

[css] 使用css实现一个loading的效果

[css] 使用css实现一个loading的效果 <div class"donut"></div> Keyframes donut-spin {0% {transform: rotate(0deg);}100% {transform: rotate(360deg);} }.donut {display: inline-block;border: 4px solid rgba(0, 0, 0, 0.1);border-left-color: #…

浅谈分布式锁

概述 为了防止分布式系统中的多个进程之间相互干扰&#xff0c;我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁。 为什么要使用分布式锁 成员变量 A 存在 JVM1、JVM2、JVM3 三个 JVM 内存中 成员变量 A 同时都会在 JVM …

机器学习模型评估指标总结

常用机器学习算法包括分类、回归、聚类等几大类型&#xff0c;以下针对不同模型总结其评估指标 一、分类模型 常见的分类模型包括&#xff1a;逻辑回归、决策树、朴素贝叶斯、SVM、神经网络等&#xff0c;模型评估指标包括以下几种&#xff1a; &#xff08;1&#xff09;二分类…

[css] 说说sroll-snap-type属性的运用场景有哪些?相关联的属性还有哪些?

[css] 说说sroll-snap-type属性的运用场景有哪些&#xff1f;相关联的属性还有哪些&#xff1f; 使用 sroll-snap-type 优化滚动 根据 CSS Scroll Snap Module Level 1 规范&#xff0c;CSS 新增了一批能够控制滚动的属性&#xff0c;让滚动能够在仅仅通过 CSS 的控制下&#…

shell脚本一键同时推送代码至github和gitee

自己写的东西&#xff0c;要同时推送多个git地址&#xff0c;解决办法如下: 1.先要初始化你的git 进入自己的项目目录&#xff0c;然后执行 git init cd /app/code/go-study git init 2.执行以下脚本: #!/bin/bash #author Oliver #since 2020-09-03 15:24:31git remote rm …

简单的一个月之设计实现内容1

需求:简单的新闻管理系统,实现简单的增删改查功能 1.数据库表的建立 ID非空,数据类型看着给 2.写实体(entity)News.java 要与数据库中的字段相对应,(id,optimistic我没写,问题不大)1 package com.pay.boss.entity; //封装好的entity包,直接引用2 3 import java.util.Date; …

[css] 你会经常用到伪元素吗?一般都用在哪方面?

[css] 你会经常用到伪元素吗&#xff1f;一般都用在哪方面&#xff1f; 清浮动个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

分享一个有趣的网站“让我帮你百度一下“

如何解决同事的弱智问题&#xff0c;分享一个有趣的网站 日常工作中&#xff0c;总有些人会问你一些弱智的问题 你只需要三步就可以完美解决: 1.打开这个链接: 让我帮你百度一下 2.输入他的问题、点回车 3.复制结果链接甩到他的脸上_ hahahhahahaha 这样就解决了一切烦恼&a…