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.mzph.cn/pingmian/45514.shtml

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

相关文章

C语言:指针详解(4)

作者本人由于大一下学期事情繁多,大部分时间都在备赛,没有时间进行博客撰写,如今已经到了暑假时间,作者将抓紧每一天的时间进行编程语言的学习,由于目前作者已经进行到了C的学习,C语言阶段的学习与初阶数据…

Tensorflow入门实战 T08-Vgg16网络进行猫狗识别

目录 1、前言 2、代码 3、运行结果 4、反思 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 1、前言 本周学习内容为,采用自己设置的vgg-16网络进行猫狗识别,并非官网提供的…

【公益案例展】亚运天穹——践行亚运理念,筑牢安全防线

‍ 安恒信息公益案例 本项目案例由安恒信息投递并参与数据猿与上海大数据联盟联合推出的 #榜样的力量# 《2024中国数据智能产业最具社会责任感企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 杭州第19届亚运会是中国第三次举办亚洲最高规格的国际综合…

217.贪心算法:加油站(力扣)

代码解决 class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int curtotol 0; // 当前累积油量int tatol 0; // 总的油量减去总的花费油量int start 0; // 起始加油站的索引// 遍历所有加油站for (int i 0; i &…

5款文案生成神器,自动一键生成原创文案

文案在我们的生活中随处可见&#xff0c;好的文案内容不仅可以为企业带来销售转化&#xff0c;而且还能提升品牌的影响力&#xff0c;因此文案的重要性可想而知&#xff0c;对于文案创作者来说&#xff0c;写作好的文案不是轻松容易的事&#xff0c;但如果把这个任务交给文案生…

Python中的null是什么?

在知乎上遇到一个问题&#xff0c;说&#xff1a;计算机中的「null」怎么读&#xff1f; null正确的发音是/n^l/&#xff0c;有点类似四声‘纳儿’&#xff0c;在计算机中null是一种类型&#xff0c;代表空字符&#xff0c;没有与任何一个值绑定并且存储空间也没有存储值。 P…

MySQL CONCAT函数的简单使用

CONCAT函数用于将mysql中查询多列的值拼成一列显示&#xff0c; 使用示例&#xff1a; SELECT CONCAT(attr_name,"&#xff1a;",attr_value) FROM pms_sku_sale_attr_value WHERE sku_id1; 上面SQL语句使用CONCAT函数将attr_name、attr_value两列的值拼成一列&am…

动态sql 单选变多选

实体类 添加数组存储值 private ArrayList tssjfjList; <!-- <if test"tssjfj ! null and tssjfj ! ">and tssjfj #{tssjfj}</if>--><if test"tssjfjList ! null and tssjfjList.size() > 0">AND tssjfj IN<fo…

JeecgBoot 前端 vue3 项目,配置项目多页面入口

前端 vue3配置项目多页面入口 1.项目根目录新建home.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><…

Rust Hello

首先还是安装&#xff1a; 一定要换源&#xff0c;否则真的太慢了。 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh 就是~/.cargo/config [source.crates-io] # 替换成你偏好的镜像源 replace-with tuna# 清华大学 5mb [source.tuna] registry "htt…

数字信号处理教程(4)—— 离散傅里叶变换DFT

今天继续数字信号处理的学习&#xff0c;本次我们将来聊聊离散傅里叶变换DFT(Discrete Fourier Transform)。DFT是数字信号处理领域中应 用最为广泛的离散变换。DFT将一个序列x(n)映射到频率域。DFT 的许多性质都与对模拟信号进行傅里叶变换的性质相同。里面包含着大量的算法值…

论文研读:ViT-V-Net—用于无监督3D医学图像配准的Vision Transformer

目录 摘要 介绍 方法 VIT-V-Net体系结构 损失函数 图像相似性度量 变形场正则化 结果与讨论 摘要 在过去的十年里&#xff0c;卷积神经网络(ConvNets)在各种医学成像应用中占据了主导地位并取得了最先进的性能。然而&#xff0c;由于缺乏对图像中远程空间关系的理解&a…

Gitlab CI/CD介绍

基本概念 GitLab CI/CD&#xff08;持续集成/持续部署&#xff09;流水线是GitLab平台提供的一项强大功能&#xff0c;旨在通过自动化构建、测试和部署过程&#xff0c;提高开发团队的效率和软件发布的质量。 CI&#xff08;Continuous Integration&#xff09;&#xff1a;持续…

QT5.12.9 通过MinGW64 / MinGW32 cmake编译Opencv4.5.1

一、安装前准备: 1.安装QT,QT5.12.9官方下载链接:https://download.qt.io/archive/qt/5.12/5.12.9/ QT安装教程:https://blog.csdn.net/Mark_md/article/details/108614209 如果电脑是64位就编译器选择MinGW64,32位就选择MinGW32,我的是MinGW64。 2.opencv源码下载:h…

linux登入提示信息

目录 1.Linux 登录提示信息在操作系统中扮演着重要的角色 安全性提醒 欢迎信息 系统状态通知 政策和使用条款 技术支持信息 更新和变更通知 2.配置文件介绍 3.编辑配置文件 4.效果展示 修改前 修改后 “如果您在解决类似问题时也遇到了困难&#xff0c;希望我的经…

14-50 剑和诗人24 - 开源 AI 的下一个重大飞跃:多个小模型与大模型相媲美

介绍 大型语言模型 (LLM) 领域最近取得了快速进展&#xff0c;GPT-4、PaLM-2、Llama-2 等模型正在突破 AI 对语言处理能力的界限。然而&#xff0c;只有少数几家大型科技公司拥有训练包含数千亿个参数的模型所需的大量计算资源&#xff0c;才能使用最大的模型。 作为回应&…

鼠标怎么挑选

我们平时工作中经常要用到鼠标&#xff0c;那么哪种鼠标比较好。我们今天就来研究下。 手感要好 鼠标最重要的就是手感。这个看参数看不出来。最好能到实体店里面去体验一下&#xff0c;自己上手试一下。 如果现在都是在网上买了&#xff0c;去实体店过于麻烦&#xff0c;并且…

[Yii] 实战开发微信服务号+Yii 2.0构建商城系统全栈应用

YII 实战开发微信服务号Yii 2.0构建商城系统全栈应用 课程地址&#xff1a;http://ityuanke.com/thread-14-1-1.html 微信服务号Yii2.0构建商城系统全栈应用 依托微信服务号高级特性及Yii 2.0技术为核心&#xff0c;手把手带你从零开发一个带完整PC后台的微信图书商城的全栈应用…

Git 详解(原理、使用)

git 快速上手请看这篇博客 Git 快速上手 1. 什么是 Git Git 是目前最主流的一个版本控制器&#xff0c;并且是分布式版本控制系统&#xff0c;可以控制电脑上所有格式的文档 版本控制器&#xff1a;记录每次修改以及版本迭代的管理系统 对于文本文件&#xff0c;可以记录每次…

安全防御-用户认证综合实验

一、拓扑图 二、实验要求 1、DMZ区的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9:00-18:00&#xff09;可以访问&#xff0c;生产区设备全天都是可以访问的 2、生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3、办公区设备10.0.2.20不允许访…