JVM学习(day1)

JVM

运行时数据区

线程共享:方法区、堆

线程独享(与个体“同生共死”):虚拟机栈、本地方法栈、程序计数器

程序计数器

作用:记录下次要执行的代码行的行号

特点:为一个没有OOM(内存溢出)的地方

虚拟机栈

每要执行一个方法就往栈中放一个栈帧,包含把变量放到局部变量表中(局部变量槽),方法的出入口;

基本类型直接存值,应用类型存指针;

本地方法栈

本地方法:非java写的方法

作用与虚拟机栈相似,只不过是对于本地方法而言

有的会将虚拟机栈和本地方法栈合二为一

Java堆

存放对象实例

内存分配Thread Local Allocation Buffer(TLAB)先给一部分内存,用完再取,再取的过程中出现冲突采用CAS和失败重试

物理上不连续的,逻辑连续

方法区

存放:类信息

也是会出现OOM的地方

运行时常量池

方法区的一部分,

用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。除了保存Class文件中描述的符号引用外,还会把由符号引用翻译出来的直接引用也存储在运行时常量池中。

也会抛出OOM

直接内存

不属于运行时数据区的一部分

受物理内存限制,不受JVM限制

对象的内存布局

对象的创建

分配内存:

1.指针碰撞(内存规整,冲突解决方式是加锁)(index+n)

2.空闲列表(内存不规整)列表将可用的内存记录,然后根据列表分配

在分配内存时,为保证线程安全可以使用

1.本地线程分配缓存(TLAB)

2.CAS+失败重试

初始化0值(不包括对象头)
进行必要设置

对对象头进行设置

执行init方法

对象的结构

对象头

两类信息:

  • 于存储对象自身的运行时数据,如哈 希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等

  • 对象头的另外一部分是类型指针,即对象是属于哪一个类的

实例数据

  • 对象真正有效的信息

对齐填充

  • 无特别含义,仅仅起着占位符的作用

对象的访问定位

(就是 A a = new A()中a存了个什么东西)

句柄指针和直接指针

HotSpot采用直接指针

句柄指针两次定位,在对象移动时只需要修改句柄池中,也就是只需修改一次,

直接指针减少了一次定位,在对象移动时需要修改所有指向他的指针

垃圾收集器与内存分配策略

先谈生死

引用计数法

有一个指针指向该对象则+1,当有一个指针不指向他了则-1

缺点:无法解决成环问题

可达性分析法(java采用)

与GC Roots不可达则回收

可作为GC Roots对象的有

·在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的

参数、局部变量、临时变量等。

·在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量。

·在方法区中常量引用的对象,譬如字符串常量池(String Table)里的引用。·在本地方法栈中JNI(即通常所说的Native方法)引用的对象。

·Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如

NullPointExcepiton、OutOfMemoryError)等,还有系统类加载器。

·所有被同步锁(synchronized关键字)持有的对象。

·反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。

再谈引用

强、软、弱、虚引用

回收方法区(不太重要,了解即可)

垃圾收集算法

分代收集理论

  • 弱分代

  • 强分代

  • 跨代引用

标记清除算法

缺点:

  • 一个是执行效率不稳定

  • 第二个是内存空间的碎片化问题

 

标记复制算法

只用一半,每次清除的时候将“活下来”的直接复制到另一边

缺点:可用内存缩小为了原来的一半

优点:实现简单,运行高效

Appel式回收(改进后的算法):将空间分为一个大的Eden空间和两个小的Survivor空间。对象首先被分配到Eden空间和一个小的Survivor空间。当Eden空间满时,触发Minor GC,存活的对象被复制到另一个Survivor空间。如果Survivor空间不足以容纳存活对象,就会依赖老年代进行内存担保,这些对象便将通过分配担保机制直 接进入老年代。

 

标记整理算法

 

分代算法

分为年轻代和老年代,年轻代用适合年轻代的,老年代用适合老年代的。

总结

即使不移动对象会使得收集器的效率提升一些,但因内存分配和访问相比垃圾收集频率要高得多,这部分的耗时增加,总吞吐量仍然是下降的。HotSpot虚拟机里面关注吞吐量的Parallel Scavenge收集器是基于标记-整理算法的,而关注延迟的CMS收集器则是基于标记-清除算法的,

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

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

相关文章

电压反馈型运算放大器的增益和带宽

简介 本教程旨在考察标定运算放大器的增益和带宽的常用方法。需要指出的是,本讨论适用于电压反馈(VFB)型运算放大器。 开环增益 与理想的运算放大器不同,实际的运算放大器增益是有限的。开环直流增益(通常表示为AVOL)指放大器在反馈环路未闭合时的增益…

Python爬虫技术从去哪儿网获取旅游数据,对攻略进行可视化分析,提供全面的旅游攻略和个性化的出行建议

背景 随着信息技术的快速发展和互联网的普及,旅游行业也迎来了数字化和智能化的变革。去哪儿网作为中国领先的在线旅游平台之一,提供了丰富的旅游产品和服务,涵盖了机票、酒店、旅游度假等各个方面。用户通过去哪儿网可以方便地查询、预订和…

Mac下flutter运行iOS模拟器

上篇flutter环境安装(Macvscode)已经将vscode和xcode等开发环境都搭建起来了,vscode新建工程还是比较方便的,那么,建立好了之后,我们怎么看效果呢? 1. vscode新建项目 通过 vscode的命令命板(…

经典电影的高清修复是怎么实现的?

老片修复,主要分两种。精修版和流水线版。精修版比如像《星球大战》那种。基本就是一个专业团队花几年时间,不干别的就盯着这一个项目死磕。细致程度差不多就是一帧一帧进行修复。那对于我们普通人来说,想要修复视频高清,这种精修…

七天.NET 8操作SQLite入门到实战 - 第二天 在 Windows 上配置 SQLite环境

前言 SQLite的一个重要的特性是零配置的、无需服务器,这意味着不需要复杂的安装或管理。它跟微软的Access差不多,只是一个.db格式的文件。但是与Access不同的是,它不需要安装任何软件,非常轻巧。 七天.NET 8操作SQLite入门到实战…

Java常用的API_02(正则表达式、爬虫)

Java正则表达式 七、正则表达式7.1 格式7.1.1 字符类注意字符类示例代码1例2 7.1.2 预定义字符预定义字符示例代码例2 7.1.3 区别总结 7.2 使用Pattern和Matcher类与直接使用String类的matches方法的区别。(1) 使用Pattern和Matcher类示例代码 &#xff…

传输层协议之UDP

1、端口号 我们在应用层创建的套接字,是需要通过bind()接口绑定我们的IP地址与端口号的,这是因为数据从传输层向上交付到应用层时,需要用端口号来查找特定的服务进程。一般在网络通信时,用IP地址标识一台主机,用端口号…

el-table 动态添加删除 -- 鼠标移入移出显隐删除图标

<el-table class"list-box" :data"replaceDataList" border><el-table-column label"原始值" prop"original" align"center" ><template slot-scope"scope"><div mouseenter"showClick…

Kubelet 认证

当我们执行kubectl exec -it pod [podName] sh命令时&#xff0c;apiserver会向kubelet发起API请求。也就是说&#xff0c;kubelet会提供HTTP服务&#xff0c;而为了安全&#xff0c;kubelet必须提供HTTPS服务&#xff0c;且还要提供一定的认证与授权机制&#xff0c;防止任何知…

Bertopic环境安装与文本主题聚类

文章目录 1.环境配置(一)安装:anaconda1. 理解:为什么需要anaconda2. 下载anaconda3. 启动anaconda(二)安装:python环境(三)安装:依赖包hdbscan的安装问题解决方案1. 安装build-tools-for-visual-studio2. 安装hdbscan(四)安装transformers、BERTopic等重要依赖包2…

FlinkModule加载HiveModule异常

HiveModule这个模块加载不出来 加在不出来这个模块&#xff0c;网上查说是要加下面这个依赖 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-hive_${scala.binary.version}</artifactId><version>${flink.…

GPIO通用输入输出口

可配置八种输入输出模式&#xff1b; 引脚电平&#xff1a;0~3.3V&#xff0c;部分引脚可容忍5V&#xff1b;&#xff08;可以输入5V&#xff0c;输出最大只能是3.3V&#xff09; 带FT的是可以容忍5V的不带FT的就只能接入3.3V的电压。 输出模式下可以控制端口输出高低电平&am…

【算法】代码随想录之链表(更新中)

文章目录 前言 一、移除链表元素&#xff08;LeetCode--203&#xff09; 前言 跟随代码随想录&#xff0c;学习链表相关的算法题目&#xff0c;记录学习过程中的tips。 一、移除链表元素&#xff08;LeetCode--203&#xff09; 【1】题目描述&#xff1a; 【2】解决思想&am…

自动驾驶中,实现三维点旋转原理

文章目录 1. 三维点旋转的方案2. 使用复数表示二维点的旋转2.1. 复数的概念2.2. 复数的三种形式及相互转换2.3. 复数概念扩展&#xff1a;实数、虚数、复数 3. 四元数旋转三维点原理4. 使用四元数进行旋转的公式5. 旋转叠加6. 四元数转换为三维点7. 代码实现 1. 三维点旋转的方…

13 协程设计原理与汇编实现

协程的问题 为什么要有协程?协程的原语操作?协程的切换?协程的struct如何定义?协程的scheduler(调度)如何定义?调度策略如何实现?协程如何与posix,api兼容?协程多核模式?协程的性能如何测试?为什么要有协程 同步的编程方式,异步的性能。同步编程时,我们需要等待io就…

14-47 剑和诗人21 - 2024年如何打造AI创业公司

​​​​​ 2024 年&#xff0c;随着人工智能继续快速发展并融入几乎所有行业&#xff0c;创建一家人工智能初创公司将带来巨大的机遇。然而&#xff0c;在吸引资金、招聘人才、开发专有技术以及将产品推向市场方面&#xff0c;人工智能初创公司也面临着相当大的挑战。 让我来…

ant design form动态增减表单项Form.List如何进行动态校验规则

项目需求&#xff1a; 在使用ant design form动态增减表单项Form.List时&#xff0c;Form.List中有多组表单项&#xff0c;一组中的最后一个表单项的校验规则是动态的&#xff0c;该组为最后一组时&#xff0c;最后一个表单项是非必填项&#xff0c;其他时候为必填项。假设动态…

SQL,python,knime将数据混合的文字数字拆出来,合并计算实战

将下面将数据混合的文字数字拆出来&#xff0c;合并计算 一、SQL解决&#xff1a; ---创建表插入数据 CREATE TABLE original_data (id INT AUTO_INCREMENT PRIMARY KEY,city VARCHAR(255),value DECIMAL(10, 2) );INSERT INTO original_data (city, value) VALUES (上海0.5…

对照ui图进行大屏幕适配,echerts适配

1.先找到ui图&#xff0c;我这边是1920*1080的屏幕进行的设计 2.在界面找到跟样式的字体大小&#xff0c;进行设置&#xff0c;一般ui设置字体大小便可 3.在js中写入原生js代码 function adapter() {//获取布局视口宽度&#xff0c;布局视口设备横向独立像素值const dpWidth…

Stable Diffusion 深度探索:从入门到精通的全方位教程

在人工智能艺术创作的浪潮中&#xff0c;Stable Diffusion 作为一股不可忽视的力量&#xff0c;正以其独特的魅力吸引着无数创作者和科技爱好者的目光。本文旨在为大家提供一份详尽的 Stable Diffusion 教程&#xff0c;从基础概念到高级应用&#xff0c;带领你一步步走进这个充…