讲诉JVM

        jvm是Java代码运行的环境,他将java程序翻译成为机器可以可以识别的机器码,可以跨平台运行如linuc或者windos

简单说一下我对jvm运行的理解,
        首先我们运行程序的时候,类加载器会将类按需加载到元空间/方法区里面
        然后启动线程的时候,jvm就会给每个线程分配一个独立的,如果有native方法就会有一个本地方法栈,对应的每个线程会有一个 程序计数器 用于记录线程运行状态的,线程运行到每一个方法就会有一个栈帧,方法执行完, 栈帧就会被释放,后进先出,当线程运行完成,栈也就释放了
        在线程运行过程中,所新建和操作的一下临时对象就就会在中创建然后被引用,当线程执行完成,没有引用的对象,在下一次垃圾回收执行的时候被清理。大体流程就是这样

        类的加载触发:是按需要加载的,当被new到,静态方法或静态成员被访问到,反射操作等就会触发类的加载,       
        类的加载过程:加载,连接,初始化,使用,销毁
       加载阶段:工具类名将类的字节码通过文件、网络等方式读取到内存中,然后解析加载到方法区/元空间中。
        加载阶段完成之后就到连接
        连接分为3个步骤,首先是验证,验证字节码结构,语义是否复java约束规范 例如开头是否 cafe babe,验证通过就到准备阶段,给静态变量分配内存,给初始值,常量赋值等
最后是解析阶段,将符合引用替换为直接引用,解析为直接内存地址,链接阶段就算完成了
        最后就是初始化了 ,静态变量初始值,执行静态快
        初始化完成就是可以使用了,还有就是就是销毁,虽然这个销毁很少发生 在内存不足full GC的时候 还是有可能被销毁的
        类加载过程是按双亲委派模型
        因为类的加载器有 启动类加载器,扩展类加载器,应用类加载器,每个加载器各自负责加载不通的类,启动类加载java运行时环境所需的类   如string所在的lang包,list,map所在的util包,IO包等,扩展类加载器就是加载bin/ext目录下的第三方库。应用类加载器就是加载我们写的类的,所谓的双亲委派就是 一个类的加载器收到请求,会先去尝试让父类加载,向上委派,如果父类加载过就不需要再加载,例如应用类加载器收到请求 会委派给扩展类加载器,扩展类加载器又委派给启动类加载器,这样做的好处就是确保安全,避免核心类被加载,避免重复加载保证唯一。

        类加载好了,在程序启动线程的适合,jvm就会给线程创建一个
        这个栈是线程独有的,线程执行完,栈就会自动释放
        在线程的运行过程中每执行到一个方法就会创建一个栈帧,这个栈帧记录着方法执行的操作和数据。
        栈帧保存的数据有,局部变量表操作数栈(如果加减乘除的结果,操作完成就字符,先先进后出),还有动态链接(方法内存地址,和引用),方法出口(方法执行完成只有要干什么)
        方法执行完栈帧也就出来了,他们后进先出的
        线程运行过程程序计数器记录着 线程的运行位置,在多线程情况下,上下文切换的适合让程序继续执行。
        栈也会内存溢出 只是发生的比较少,还有一个深度不够的异常,就是线程执行的方法太深,如递归,不过这些发生的情况还是很少的。栈就大概这么了

        线程的运行过程中 会产生很多的引用对象,这些读写被jvm分配到 中,
        堆是jvm最大的一个区域,也是我们最关注的,问题也是最频繁的,处理不当就会产生内存溢出或内存泄漏,
        首先是内存分配,对象被创建出jvm有几种内存分配方式
        1指针碰撞,如果堆的内存充足而且规则连续,就会先数组移动指针一样分配,这个成为指针碰撞,这是简单,快速的
        2空闲列表:就是在内存不规则的情况下,jvm会维护一个空闲内存的列表,然后把对象分散的分配
        空间的是否规则要看选用的什么类型的垃圾回收机制,有压缩整理功能的就会有规则的空间
 serial,parNew(没有压缩整理),CMS,G1(sweep)(没有)
        3 本地线程分配缓存 简称TLAB,就是给每个线程分配一个独立的堆空间用于,使用完自己的才去使用公共的。
        对象的组成包含3部分,对象头,实例数据,补齐填充
        对象头主要包含:自身运行的数据,hash码,GC分代年龄,锁状态标志,偏凉锁线程id等
        实例数据:就是代码中各种成员变量
        补齐填充:占位用的,就是为了补齐数 达到某个整数被,提高CPU的访问效率

        堆被分新生代和老年,他们的占比默认是占1/3和2/3,
其中新生代又分为eden区和Survivor区,Survivor又分为s1和s2区,他们的默认比例8:1:1,
在垃圾回收的时候 会先把eden区的回收,然后把存活的对象放到s区,经过多次垃圾回收还存活的对象就会升等到老年区,只有在full gc的时候 老年区才会被回收

进入老年区的情况有以下几种,1就是到达阈值指定的,2到达阈值的大对象,3动态年龄判断,就是s区超过50%之后年龄大但却没有到阈值的,4老年代空间担保机制(每次mionr gc的时候都会先判断老年代剩余空间是否大于新生代的,如果大于就直接gc ,如果小于就会在判断 是否大于每次平均晋升值,如果小于就直接full gc,如果大于就minor gc ,如果值多就会直接放到老年代)


 

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

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

相关文章

java 项目日记实现两种方式:拦截器方式实现日记与定义日记注解方式实现日记

通常只要是java web项目基本都离不开项目日记,项目日记存在的意义很多,例如:安全审计,问题追踪都离不开项目日记。下面我们说一下项目日记实现最常用的两种方式 。 一 拉截器实现项目日记 1 实现一个拦截器基类,用于事…

逻辑斯蒂回归-建模概率计算(鸢尾花)

导入的数据说明 因为气候不同,造就性不同,统计鸢尾花的关键特征数据:花萼长度、花萼宽度、花瓣长度,花瓣宽度 植物学家划分: setosa(中文名:山鸢尾) versicolor(中文名:杂色鸢尾) virginica(中…

小鹅通基于 TSE 云原生 API 网关的落地实践

导语 2023腾讯全球数字生态大会已于9月7-8日完美落幕,40专场活动展示了腾讯最新的前沿技术、核心产品、解决方案。 微服务与消息队列专场,我们邀请到了小鹅通的基础架构组负责人黄徐震为我们带来了《小鹅通基于 TSE 云原生网关的落地实践》的精彩演讲。…

鹦鹉目标检测数据集VOC+YOLO格式2000张

鹦鹉是一种非常受欢迎的鸟类,它们通常生活在热带和亚热带地区的森林和草原中。鹦鹉是一种非常聪明、有趣和亲密的动物,也是一种受到广泛关注和保护的物种。 鹦鹉的身体结构非常适应于它们的生活方式。它们的身体非常修长,有着漂亮的羽毛和强…

flutter开发windows应用的库

一、window_manager 这个插件允许 Flutter 桌面应用调整窗口的大小和位置 地址:https://github.com/leanflutter/window_manager二、win32 一个包,它使用FFI包装了一些最常见的Win32 API调用,使Dart代码可以访问这些调用,而不需…

腾讯云服务器上传文件 :Permission denied (os error 13) ,由于权限无法上传

根据网上的修改云服务器上传文件目录的权限,或是用root权限上传本地文件,均失败。 正解办法: ubuntu:/home/wwwroot# sudo passwd root Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully首先修…

【论文笔记】NeuRAD: Neural Rendering for Autonomous Driving

原文链接:https://arxiv.org/abs/2311.15260 1. 引言 神经辐射场(NeRF)应用在自动驾驶中,可以创建可编辑的场景数字克隆(可自由编辑视角和场景物体),以进行仿真。但目前的方法或者需要大量的训…

vue介绍以及基本指令

目录 一、vue是什么 二、使用vue的准备工作 三、创建vue项目 四、vue插值表达式 五、vue基本指令 六、key的作用 七、v-model 九、指令修饰符 一、vue是什么 Vue是一种用于构建用户界面的JavaScript框架。它可以帮助开发人员构建单页应用程序和复杂的前端应用程序。Vue…

图像处理—小波变换

小波变换 一维小波变换 因为存在 L 2 ( R ) V j 0 ⊕ W j 0 ⊕ W j 0 1 ⊕ ⋯ L^{2}(\boldsymbol{R})V_{j_{0}}\oplus W_{j_{0}}\oplus W_{j_{0}1}\oplus\cdots L2(R)Vj0​​⊕Wj0​​⊕Wj0​1​⊕⋯,所以存在 f ( x ) f(x) f(x)可以在子空间 V j 0 V_{j_0} Vj0…

ffmpeg 打印视频帧的数量

命令: 可以使用 ffprobe 工具: ffprobe -v error -count_frames -select_streams v:0 -show_entries streamnb_read_frames -of defaultnokey1:noprint_wrappers1 input.ts上面命令含义为: -v error:设置输出日志级别为 error&…

springboot使用Validated实现参数校验

做为后端开发人员,一定有前端传的数据是可能会出错的警惕性,否则程序就可能会出错,比如常遇到的空指针异常,所以为了程序运行的健壮性,我们必须对每一个参数进行合法校验,就能避免很多不必要的错误&#xf…

【高效开发工具系列】eclipse部署web项目

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

el-select绑定值的坑

碰到一个问题,选择框的数据是后端传过来的,下拉框的数据也是后端传过来的,但是打开下拉框时,发现数据没有高亮。 最后发现,只要选择框v-model给的值和option的value绑定的值一致,就可以高亮。 大多数情况下…

机器学习——分类评价指标

【说明】文章内容来自《机器学习——基于sklearn》,用于学习记录。若有争议联系删除。 1、评价指标 对于模型的评价往往会使用损失函数和评价指标,两者的本质是一致的。一般情况下,损失函数应用于训练过程,而评价指标应用于测试过…

【Xcode】解决Unable to process request - PLA Update available

出现场景 IOS更新app时,使用Xcode上传新版本的包时,提示无法上传。 Unable to process request -PLA update available you currently dont have access to this membership resource. To resolve this issue ,agree to the latest program license a…

Flutter ExpansionPanelList 去除展开后的间隔距离,及属性

可展开列表中,展开后条目有一个间距,可以 使用materialGapSize: 0,来去掉 // child: ExpansionPanelList(//expandedHeaderPadding: EdgeInsets.zero,//头部顶部间隔// materialGapSize: 15,//展开后的间距// animationDuration: const …

实在智能成功完成近2亿元C轮融资,全面迎接2024年Agent智能体应用元年

在这个最冷的季节,杭州实在智能科技有限公司(以下简称“实在智能”)依然表现火爆,近日,实在智能成功完成C轮融资近2亿元人民币,由金泰富资本和安吉智慧谷共同领投、安吉两山国创跟投。 在此轮融资以前&…

61权限提升-RedisPostgre令牌窃取进程注入

主要讲解redis数据库和postgresql数据库,然后还要两个windows的提权方式令牌窃取和进程注入。 postgresql是基于两个cve的漏洞,redis的提权方式第一种是利用任务执行的反弹shell,第二个是写一个ssh-keygen的公钥使用私钥登录,这是…

测试:DFX DFS

DFX DFX(Design for X)指的是一种设计方法,它关注于产品的非功能性属性,旨在提高产品的整体竞争力和生命周期价值。这里的“X”代表产品生命周期中的某个环节或特性,例如供应、安装、维护等,也可以是影响产…

[SWPUCTF 2021 新生赛]Do_you_know_http已

打开环境 它说用WLLM浏览器打开,使用BP抓包,发送到重发器 修改User-Agent 下一步,访问a.php 这儿他说添加一个本地地址,它给了一个183.224.40.160,我用了发现没用,然后重新添加一个地址:X-Forwa…