虚拟机JVM

虚拟机

1、定义

jvm 假想计算机 运行在操作系统之上 和硬件之间没有直接交互
包括 一套字节码指令、寄存器、栈、垃圾回收、堆 一个存储方法域
jvm:承担一个翻译工作,动态的将java代码编译成操作系统可以识别的机器码。
从软件层面屏蔽了不同操作系统在底层硬件与指令上的区别
jre:java 运行时环境 提供类库


类加载机制:7步


加载-验证-准备-解析-初始化-使用-卸载
加载:通过全限定类名来获取定义此类的二进制字节流/将字节流所代表的静态存储结构转化为方法区的运行时数据结构
验证:验证文件等格式
准备:变量字符开辟空间
解析:解析引用关系
初始化:赋值
启动类加载器 bootstrap ClassLoader c++ lib包 虚拟机能够识别的类库
扩展类加载器 exe lib/ext 能够被java使用
应用类加载器 appcation classpath 用户类路径 应用 的三方类库
不是继承关系 组合关系
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3d313949db56488da7a97e445022e019.png)运行时数据区
执行引擎
2、java代码执行:

javac编译为.class文件
classLoader装载class
解释执行 编译执行class文件

3、内存管理

3.1结构
共享:
堆:创建的对象和数组都保存在堆内存中 采用分代收集算法
方法区:永久代,用于存储被jvm加载的类信息、常量、静态变量、即时编译后的代码等数据。
私有:栈、本地方法栈、程序计数器
栈:每个方法在执行的同时都会创建一个栈帧(用来存储数据和部分过程结果的数据结构),用来存储局部变量表,操作数栈,动态链接,方法出口等信息,
每一个方法从调用直至执行完成的过程,就应对着一个栈帧在虚拟机栈中入栈到出栈的过程。
在这里插入图片描述
运行时数据区

栈:

filo:first in last out
和方法调用相关
反汇编 javap -c math.class
局部变量表 istore_1 赋值
操作数栈 :iconst_1,iload(加载值),bipush(操作结果压栈)
动态链接:符号引用 方法区和栈之间(方法名称、类名都是一些符号)
方法出口:栈帧和栈帧之间 方法执行完回到主方法的栈位置
在这里插入图片描述

在这里插入图片描述

`

程序计数器

`私有,记录程序运行行数位置,因为java是多线程运行,可能当前线程运行一半,过来一个比当前线优先执行的线程,这样当前线程挂起,执行另一个线程,执行完后继续从当前虔诚的位置执行当前线程。字节码执行器动态修改
在这里插入图片描述

在这里插入图片描述
调优工具
jmap jstack arthas(*阿里巴巴)
stw:为了防止对象变量从垃圾和非垃圾之间来回切换
动态年龄判断机制 :如果对象大小大于s区百分之50,直接挪到老年代
内存比值
3.2内存分配 new Object
首选TLAB:(Thread Local Allocation Buffer)线程本地分配缓冲区

https://zhuanlan.zhihu.com/p/393972460
堆上分配(可能存在多线程安全问题)
new Object() 在堆内存中开辟一块内存空间,多线程并发在堆中开辟空间存在安全问题,但
加锁又会影响性能
所以就引出了 TLAB
new 对象会在堆中的eden区进行分配,分配结束后会进行一次yong gc ,如果对象没有被回收,存活年龄加1,达到15次,才会晋升到老年代,TLAB在eden区分配出私有的TLAB,并发创建也就不需要加锁了,如果分配的TLAB被用完,就会在公用的Eden区分配内存空间,所以堆区严格上说并不是线程共享。

栈上分配
在这里插入图片描述

垃圾回收

1、如何区分垃圾
引用计数法
可达性分析法:将gc roots对象作为起点,向下搜索引用的对象,找到的都标记为非垃圾对象
gcRoots 根节点:线程的本地变量、静态变量、本地方法栈的变量等
2、回收算法
1、标记清除法 碎片化严重
2、复制算法 解决碎片化 但效率低
3、标记整理算法 标记好不清楚 将存活的对象移动到内存的一端 然后清除端边界外的对象
4、常用的分代收集算法
核心思想:根据对象存活的不同生命周期将内存划分为不同的域
一般情况下将 GC 堆划分为老生代(Tenured/Old Generation)和新生代(Young
Generation)。老生代的特点是每次垃圾回收时只有少量对象需要被回收,新生代的特点是每次垃圾回收时都有大量垃圾需要被回收,因此可以根据不同区域选择不同的算法
新生代:复制算法
老年代 :标记复制算法
方法区的永生区 存储class类、常量方法 主要回收废弃的常量无用的类
5、分区收集算法
分为连续的不同小区间 每个小区间独立使用 独立回收

垃圾回收器

1、Serial 连续垃圾回收器(单线程、复制算法)
他工作其余的工作线程暂停 效率高,所以仍然是java虚拟机运行在client模式下默认的新生代垃圾回收器
2、ParNew 垃圾回收器(Serial+多线程 复制算法)
也需要暂停所有工作线程
ParNew垃圾收集器是很多 java虚拟机运行在 Server 模式下新生代的默认垃圾收集器
3、Parallel Scavenge 收集器(多线程复制算法、高效)
平行清除
它重点关注的是程序达到一个可控制的吞吐量(Thoughput,CPU 用于运行用户代码
的时间/CPU 总消耗时间,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)),高吞吐量可以最高效率地利用 CPU 时间,尽快地完成程序的运算任务,主要适用于在后台运算而不需要太多交互的任务。自适应调节策略也是 ParallelScavenge 收集器与 ParNew 收集器的一个重要区别
4、Serial Old 单线程标记整理算法
是serial 老年代版本 使用标记整理算法 默认老年代client的收集器
在 Server 模式下,主要有两个用途:

  1. 在 JDK1.5 之前版本中与新生代的 Parallel Scavenge 收集器搭配使用。
  2. 作为年老代中使用 CMS 收集器的后备垃圾收集方案。
    5、parallel Old收集器 多线程标记标记整理算法
    是parallel Scavenge 的老年代版本 1.6之后提供的
    两者搭配保障吞吐量
    6、CMS 收集器 多线程标记清除算法
    Concurrent mark sweep 老年代垃圾收集器
    7、G1收集器 多线程标记整理算法

java引用
强引用 把一个对象赋给一个引用变量,这个引用变量就是强引用,它处于可达状态不可能被回的 所以强引用是造成java内存泄漏的主要原因之一

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

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

相关文章

查看cuda和cudnn版本

查看cuda 打开命令提示符(Windows键 R,然后输入cmd并回车)。输入nvcc --version或者nvcc -V来获取Cuda的版本信息。 查看cudnn版本 查看Cudnn版本: 进入Cuda安装目录,通常位于C:\Program Files\NVIDIA GPU Computi…

Doris——荔枝微课统一实时数仓建设实践

目录 一、业务介绍 二、早期架构及痛点 2.1 早期架构 2.2 架构痛点 三、技术选型 四、新的架构及方案 五、搭建经验 5.1 数据建模 5.2 数据开发 5.3 库表设计 5.4 数据管理 5.4.1 监控告警 5.4.2 数据备份与恢复 六、收益总结 七、未来规划 原文大佬这篇Doris腾…

STM32 Cubemx配置SPI编程(使用Flash模块)

文章目录 前言一、W25Q64模块介绍二、STM32Cubemx配置SPI三、SPI HAL库操作函数分析3.1查询方式3.2中断方式 四、Flash时序分析1.读器件ID指令2.写使能3.擦除扇区4.页编程5.读数据6.读状态寄存器 五、Flash驱动程序编写1.代码编写测试 总结 前言 本篇文章来为大家讲解一下Flas…

安装极狐GitLab Runner并测试使用

本文继【新版极狐安装配置详细版】之后继续 1. 添加官方极狐GitLab 仓库: 对于 RHEL/CentOS/Fedora: curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash2. 安装最新版本的极狐G…

STM32 4位数码管和74HC595

4位数码管 在使用一位数码管的时候,会用到8个IO口,那如果使用4位数码管,难道要使用32个IO口吗?肯定是不行的,太浪费了IO口了。把四个数码管全部接一起共用8个IO口,然后分别给他们一个片选。所以4位数码管共…

GO语言基础总结

多态: 定义一个父类的指针(接口),然后把指针指向子类的实例,再调用这个父类的指针,然后子类的方法被调用了,这就是多态现象。 Golang 高阶 goroutine 。。。。。 channel channel的定义 …

LeetCode59. 螺旋矩阵 II(C++)

LeetCode59. 螺旋矩阵 II 题目链接代码 题目链接 https://leetcode.cn/problems/spiral-matrix-ii/ 代码 class Solution { public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> res(n, vector<int>(n, 0));int startx …

用 Python 自动化处理无聊的事情

“编程最棒的部分就是看到机器做一些有用的事情而获得的胜利。用 Python 将无聊的事情自动化将所有编程视为这些小小的胜利&#xff1b;它让无聊变得有趣。” Hilary Mason&#xff0c;数据科学家兼 Fast Forward Labs 创始人 “我很享受打破东西然后把它们重新组合起来的乐趣…

Vue+SpringBoot打造音乐偏好度推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 音乐档案模块2.1.2 我的喜好模块2.1.3 每日推荐模块2.1.4 通知公告模块 2.2 用例图设计2.3 实体类设计2.4 数据库设计 三、系统展示3.1 登录注册3.2 音乐档案模块3.3 音乐每日推荐模块3.4 通知公告模…

【python】网络爬虫与信息提取--scrapy爬虫框架介绍

一、scrapy爬虫框架介绍 scrapy是一个功能强大的网络爬虫框架&#xff0c;是python非常优秀的第三方库&#xff0c;也是基于python实现网络爬虫的重要技术路线。scrapy不是哟个函数功能库&#xff0c;而是一个爬虫框架。 爬虫框架&#xff1a;是实现爬虫功能的一个软件结构和功…

数据价值在线化丨TiDB 在企查查数据中台的应用及 v7.1 版本升级体验

本文介绍了企查查在数据中台建设中使用 TiDB 的经验和应用。通过从 MySQL 到 TiDB 的迁移&#xff0c;企查查构建了基于 TiDB Flink 的实时数仓框架 &#xff0c;充分利用了 TiDB 的分布式架构、MySQL 兼容性和完善的周边工具等特性&#xff0c;实现了数据的在线化处理。2023 年…

搭建 LNMP 架构

一 理论知识 &#xff08;一&#xff09;架构图 &#xff08;二&#xff09;CGI 由来 最早的Web服务器只能简单她响应浏览器发来的HTTP请求&#xff0c;并将存储在服务器上的HTML文件返回给浏览器&#xff0c;也就是静态html文件&#xff0c;但是后期随着网站功能增多网站开…

k8s service的概念以及创建方法

Service 的功能&#xff1a; Service主要用于提供网络服务&#xff0c;通过Service的定义&#xff0c;能够为客户端应用提供稳定的访问地址&#xff08;域名或IP地址&#xff09;和负载均衡功能&#xff0c;以及屏蔽后端Endpoint的变化&#xff0c;是K8s实现微服务的核心资源。…

java面试说自己的优势,2022必看

纯手打“RocketMQ笔记” 第一节&#xff1a;RocketMQ介绍 1.1 核心概念&#xff08;主题、生产者、消费者、消息&#xff09; 1.2 RocketMQ的设计理念和目标&#xff08;设计理念、设计目标&#xff09; 第二节&#xff1a;RocketMQ中消息的发送 2.1 单向[OneWay]发送&#…

深度学习 精选笔记(5)多层感知机

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

加密与安全_探索常用编码算法

文章目录 概述什么是编码编码分类ASCII码 &#xff08;最多只能有128个字符&#xff09;Unicode &#xff08;用于表示世界上几乎所有的文字和符号&#xff09;URL编码 &#xff08;解决服务器只能识别ASCII字符的问题&#xff09;实现&#xff1a;编码_URLEncoder实现&#xf…

【大数据架构(1)】Lambda Architecture – Realtime Data Processing 论文重点翻译

文章目录 1. INTRODUCTION2. LAMBDA ARCHITECTUREA) BATCH LAYERB) SPEED LAYERC) SERVICE LAYER 3. LIMITATIONS OF THE TRADITIONAL LAMBDAARCHITECTURE4. A PROPOSED SOLUTION1. 架构说明2. 前后架构改进对比 1. INTRODUCTION Lambda架构背后的需求是由于虽然MR能够处理大数…

Gitflow:一种依据 Git 构建的分支管理工作流程模式

文章目录 前言Gitflow 背景Gitflow 中的分支模型Gitflow 的版本号管理简单模拟 Gitflow 工作流 前言 Gitflow 工作流是一种版本控制流程&#xff0c;主要适用于较大规模的团队。这个流程在团队中进行合作时可以避免冲突&#xff0c;并能快速地完成项目&#xff0c;因此在很多软…

Android res/values/locale_config.xml文件

Android res/values/locale_config.xml文件 各个国家/地区在android系统里面的缩写代码。最典型的用途是本地化。 <?xml version"1.0" encoding"utf-8"?> <!-- Copyright (C) 2015 The Android Open Source ProjectLicensed under the Apache L…

How to implement multiple file uploads based on Swagger 3.x in Spring boot 3.x

How to implement multiple file uploads based on Swagger 3.x in Spring boot 3.x Projectpom.xmlOpenAPIConfigFileUploadControllerapplication.yaml Project pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://…