虚拟机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.mzph.cn/news/705547.shtml

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

相关文章

petalinux-config : command not found 和petalinux-build: command not found

发现这两个问题都是因为:没有先设置 petalinux 的作环境 先输入命令 先执行 source /opt/pkg/petalinux/2020.2/settings.sh 或者 sptl 然后切换目录,到相应的目录,就可以了

【设计模式】使用门面模式简化接口的复杂度

文章目录 1.概述2.门面模式的定义3.门面模式的应用场景4.总结 1.概述 门面模式(Facade Pattern)又叫做外观模式,它通过为子系统提供一个统一的高层入口的方式,达到简化复杂系统的使用以及降低客户端与子系统之间的耦合度的效果&a…

LeetCode53题:最大子数组和(python3)

代码思路: 动态规划,使用动态规划如果上一个数是大于0,则加上;如果小于0直接用0。这样做的好处就是最终直接是最大子数组和。 class Solution:def maxSubArray(self, nums: List[int]) -> int:for i in range(1,len(nums)):nu…

Docker Volume

"Ice in my vein" Docker Volume(存储卷) 什么是存储卷? 存储卷就是: “将宿主机的本地文件系统中存在的某个目录,与容器内部的文件系统上的某一目录建立绑定关系”。 存储卷与容器本身的联合文件系统? 在宿主机上的这个与容器形成绑定关系…

【kubernetes】关于k8s集群中kubectl的陈述式资源管理

目录 一、k8s集群资源管理方式分类: (1)陈述式资源管理方式:增删查比较方便,但是改非常不方便 (2)声明式资源管理方式:yaml文件管理 二、陈述式资源管理方法: 三、ku…

leetcode移动零

leetcode移动零 Given an integer array nums, move all 0’s to the end of it while maintaining the relative order of the non-zero elements. Note that you must do this in-place without making a copy of the array. Example 1: Input: nums [0,1,0,3,12] Output…

linux下gcc编译时默认是32位还是64位,怎么指定为32or64?

本来是想研究一下long的字节大小sizeof(long)&#xff0c;于是写了代码&#xff1a; #include <stdio.h> int main() {long a 10;printf("%d\n", sizeof(a));return 0; } 我当时使用的是win10系统&#xff0c;使用的是vs 2022&#xff0c;然后对以上代码进行…

[面试]我们常说的负载均衡是什么东西?

什么是负载均衡 如果用户量很多, 服务器的流量也随之增大, 此时出现两个问题, 软件性能下降 容易出现单点故障 为了解决这些问题, 引入了集群化架构, 也就是把一个软件同时部署在多个服务器上 集群化架构出现的问题 架构改变后又出现了两个问题 如何将请求均匀的发送到多…

3D WEB轻量化引擎HOOPS:促进3D软件的创新与协作

CAD软件一直以来都在现代工程、建筑、制造和设计领域发挥着至关重要的作用。在数字时代&#xff0c;CAD软件的开发者不断追求提高软件性能、增加功能和改善用户体验&#xff0c;在这一努力中&#xff0c;HOOPS技术&#xff08;高度优化的面向对象并行软件&#xff09;滑块露头角…

地图匹配+目标定位

1. 思路 掌握飞机位姿和吊舱位姿解算目标粗略GPS根据该GPS调用在线或离线卫星图将吊舱图像和卫星图进行匹配通过解算对目标进行精确定位&#xff0c;就很简单了 调用卫星图匹配 2. 高权值区 2.1 Cross-View Object Geo-Localization in a Local Region With Satellite Imag…

SpringBoot快速入门(黑马学习笔记)

需求 需求&#xff1a;基于SpringBoot的方式开发一个Web应用&#xff0c;浏览器发起请求/hello后&#xff0c;给浏览器返回字符串"Hello World~"。 开发步骤 第一步&#xff1a;创建SpringBoot工程项目 第二步&#xff1a;定义HelloController类&#xff0c;添加方…

python Matplotlib Tkinter-->tab切换1

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox import …

股票三种行情的最佳买卖点,分时图与K线图分析案例教学

一、教程描述 本套股票行情教程&#xff0c;大小5.40G&#xff0c;共有50个文件。 二、教程目录 股票教程01&#xff1a;上升行情之股票运行轨迹.mp4 股票教程02&#xff1a;上升行情之千金难买牛回头.mp4 股票教程03&#xff1a;上升行情之一线一量走天下.mp4 股票教程0…

Qt程序设计-钟表自定义控件实例

本文讲解Qt钟表自定义控件实例。 效果如下: 创建钟表类 #ifndef TIMEPIECE_H #define TIMEPIECE_H#include <QWidget> #include <QPropertyAnimation> #include <QDebug> #include <QPainter> #include <QtMath>#include <QTimer>#incl…

苹果上架App被拒绝的原因

苹果上架App被拒绝的原因有很多种&#xff0c;主要包括以下几个方面&#xff1a; 1.功能问题&#xff1a;苹果认为你的App存在功能问题&#xff0c;不符合App Store的要求。比如&#xff0c;你的App可能存在漏洞&#xff0c;会影响用户体验或者安全性&#xff0c;或者涉及到隐…

php伪协议 [SWPUCTF 2022 新生赛]ez_ez_php(revenge)

打开题目 题目源代码如下 <?php error_reporting(0); if (isset($_GET[file])) {if ( substr($_GET["file"], 0, 3) "php" ) {echo "Nice!!!";include($_GET["file"]);} else {echo "Hacker!!";} }else {highlight_fi…

【非比较排序】计算排序算法

目录 CountSort计数排序 整体思想 图解分析 代码实现 时间复杂度&优缺分析 CountSort计数排序 计数排序是一种非比较排序&#xff0c;不需要像前面的排序一样去比较。 计数排序的特性总结&#xff1a; 1. 计数排序在数据范围集中时&#xff0c;效率很高&#xff0c;但…

[C++]使用C++实现监控文件是否被修改

软件开发过程中经常会用到配置文件,某些应用场景要求在软件运行时动态修改配置文件,此时就需要监控配置文件是否被修改,下面我们就来看看如何使用C实现这一功能吧 软件开发过程中经常会用到配置文件&#xff0c;某些应用场景要求在软件运行时动态修改配置文件&#xff0c;此时…

微信公众号关键词自动回复

今天主要给大家讲一下如何实现微信公众号关键词的自动回复功能&#xff0c;就如网站的文章而言&#xff0c;进行人机识别&#xff0c;需要关注公众号回复验证码获取到验证码从而展示文章内容&#xff0c;&#xff0c;具体效果如下图。 springboot 2.3.2RELEASE 1、微信公众平台…

什么是高可用架构

一、什么是高可用 在运维中&#xff0c;经常听到高可用&#xff0c;那么什么是高可用架构呢&#xff1f;通俗点讲&#xff0c;高可用就是在服务故障&#xff0c;节点宕机的情况下&#xff0c;业务能够保证不中断&#xff0c;服务正常运行。 举个例子&#xff0c;支付宝&#…