当前位置: 首页 > news >正文

成都网站设计/引流最好的推广方法

成都网站设计,引流最好的推广方法,广告设计找工作,广州专业的网站建设公司排名一、概述 对于 C C 来说,在内存管理领域,JVM既拥有最高的权利,但是同时他们又是从事最基础工作的劳动人员,因为他们担负着每一个对象从开始到结束的维护责任。而对于Java来说,再虚拟机自动内存管理的帮助下&#xff0…

一、概述

对于 C C++ 来说,在内存管理领域,JVM既拥有最高的权利,但是同时他们又是从事最基础工作的劳动人员,因为他们担负着每一个对象从开始到结束的维护责任。而对于Java来说,再虚拟机自动内存管理的帮助下,不再需要为每一个new操作去分配内存,不容易出现内存泄漏和内存溢出的情况,但是因为我们Java程序员 不用管理内存,所以一旦出现内存问题,很容易让我们手忙脚乱,所以呢我们必须要了解Java虚拟器的内存管理机制,以便我们能更好的处理各种各样的问题。

二、运行时数据区

Java虚拟机在执行程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,以及创建和销毁时间。再Java 1.8中 从宏观上来说分为线程共享,和线程私有 主要是分为以下几个区域
在这里插入图片描述

三、程序计数器

特点:线程内存独享,占用内存小,生命周期与线程相同(随线程诞生而诞生,随线程消亡而消亡)
功能:当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复(cpu在不断轮询执行任务)等基础功能都需要依赖这个计数器来完成
异常:该区域没有定义异常

四、Java虚拟机栈

特点:先进后出,线程内存独享,生命周期与线程相同
单位:栈帧
功能:已先进后出执行方法体的方法,执行完成的栈帧出栈

4.1 运行原理

a. JVM直接对Java栈的操作只有两个,就是对栈帧的压栈和出栈,遵循“先进后出” / "后进先出”原则。
b. 在一条活动线程中,一个时间点上,只会有一个活动的栈帧。即只有当前正在执行的方法的栈帧(栈顶栈帧)是有效的,这个栈帧被称为当前栈帧(current Frame) ,与当前栈帧相对应的方法就是当前方法(currentMethod) ,定义这个方法的类就是当前类(current Class)。不同线程中所包含的栈帧是不允许存在相互引用的,即不可能在一个栈帧之中引用另外一个线程的栈。
c. 执行引擎运行的所有字节码指令只针对当前栈帧进行操作。
d. 如果在该方法中调用了其他方法,对应的新的栈帧会被创建出来,放在栈的顶端,成为新的当前帧.方法返回之际,当前栈帧会传回此方法的执行结果给前一个栈帧,接着,虚拟机会丢弃当前栈帧,使得前一个栈帧重新成为当前栈帧。
e. Java方法有两种返回函数的方式,一种是正常的函数返回,使用return指令;另外一种是方法执行中出现未捕获处理的异常,以抛出异常的方式结束。不管使用哪种方式,都会导致栈帧被弹出。
在这里插入图片描述
结论
● 一个线程 表示的是一个Java虚拟机栈
● 一个方法的执行,可以通过压栈的方式,也就是 方法对应的是栈帧

4.2 栈的基本单位栈帧

栈帧(每一个方法对应一个栈帧)
只有虚拟机栈顶的栈帧才是有效的,称为当前栈帧 (Current Stack Frame),这个栈帧所关联的方法称为当前方法(Current Method) 组成:

  • 局部变量表
  • 操作数栈
  • 动态链接
  • 方法出口信息

局部变量表:由基本数据类型和对象引用组成的

作用:用来存储方法中的局部变量
基本单位:slot

  • 局部变量表的大小在编译器就可以确定其大小了,因此在程序执行期间局部变量表的大小是不会改变的。
  • 如果存储的是基本数据类型那么直接存储值
  • 如果存储的是对象引用那么存储对象的引用地址( reference)(堆中)
reference的两种实现方式

直接引用
reference直接指向对象,对象中指向对象类型数据
优点:速度快,节约指针开销。HotSpot采用的主要方式
在这里插入图片描述

使用句柄池
java堆中会维护一个句柄池,句柄池分别指向对象实例(堆)的和对象类型数据(方法区)
优点:对象移动后只需改变句柄池的指向地址,而不需要改变引用的指向地址。稳定
在这里插入图片描述

其实用白话来说 就是2个人是直接自己单线联系,还是通过一个第三方联系,自己并不知道自己要联系的是谁。

4.3 操作数栈

操作数栈的深度在编译器就可以确定其大小了,因此在程序执行期间局部变量表的大小是不会改变的。
功能:实现程序功能

4.4 动态连接

补充下直接引用与符号引用
● 直接引用:当类已经加载到虚拟机时,通过地址直接调用该类
● 符号引用(常量池中):在编译的时候还不知道类是否被加载,先用符号代替该类,等实际运行时再用直接引用替换间接引用。
静态解析:符号引用一部分会在类加载阶段或第一次使用的时候转化为直接引用
动态连接: 将在每一次的运行期期间转化为直接引用

4.5 方法出口信息

当一个方法执行完毕之后,要返回之前调用它的地方,因此在栈帧中必须保存一个方法返回地址。
本地方法栈
● 大体上都类似于虚拟机栈
● 不同点:栈执行的java方法服务
● 本地方法栈执行的是Native方法(不一定是用java开发的)服务

五、Java堆

特点:存储对象,线程间内存共享,占用大量内存,垃圾回收关注的重点区域
异常:OutOfMemoryError
每次都向堆中存放对象,方法结束后,销毁栈帧的局部变量表时同时销毁引用,该对象就成了可回收的垃圾。咋看起来没什么不对呀,可是仔细思考下还是存在两个问题 1.不断的来回增加删除对象,对于GC的工作量太大。 2.java使指针碰撞(堆中存入新对象的时候,指针根据对象大小移动到相应位置)来为对象分配内存。如果在多线程的环境下,就会出现两个对象同时移动当前前指针的情况,造成线程不安全的情况。

这里就要引入TLAB的概念了
TLAB的全称是Thread Local Allocation Buffer,这是一个线程专用的内存分配区域。每个线程都会从Eden分配一块空间,当线程销毁时,我们自然可以回收掉TLAB的内存。
使用TLAB指令 -XX:UseTLAB
优点:线程安全,减少垃圾回收的压力。
缺点:TLAB空间大小是固定的,面对大对象的时候不够灵活

六、方法区

特点:存储类,线程间内存共享
存放已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
异常:OutOfMemoryError
提到方法区不得不说的就是运行时常量池
补充:方法区不是永久代,只是Hotspot的实现方式而已。
远行时常量池
运行时常量池是方法区的一部分,Class文件除了有类的版本,字段,方法,还有常量池
Java虚拟机对class文件每一部分的格式都有严格规定,每一个字节用于存储哪种数据都必须符合规范才会被jvm认可。但对于运行时常量池,Java虚拟机规范没做任何细节要求。
运行时常量池有个重要特性是动态性,Java语言不要求常量一定只在编译期才能产生,也就是并非预置入class文件中常量池的内容才能进入方法区的运行时常量池,运行期间也有可能将新的常量放入池中,这种特性使用最多的是String类的intern()方法。
既然运行时常量池是方法区的一部分,自然受到方法区内存的限制。当常量池无法再申请到内存时会抛出outOfMemeryError异常。

七、对象的创建

当虚拟机遇到一条New指令时:会进行如下步骤
● 检查指令的参数(即工作中我们New的对象),能否在常量池中找到它的符号引用。
● 如果存在,检查符号引用代表的类是否被加载、解析、初始化过。(如果没有则执行类的加载-----相关加载过程参考我前面的文章类加载机制)。
● 加载通过后,虚拟机将为新生对象分配内存。(所需内存大小在类加载完成后便可确定)

7.1 两种内存分配的方式

● 指针碰撞:假设Java堆中的内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边。中间放着一个指针作为分界点的指示器,分配内存就仅仅是把指针往空闲空间那边挪动一段与对象大小相等的距离。这种方式则属于指针碰撞。
● 空闲列表:如果堆中的内存并不是规整的,已使用的内存和空闲内存相互交错,显然无法使用指针碰撞。虚拟机就必须维护一个列表,记录哪些内存是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新记录表上的数据。这种方式属于空闲列表。

具体选择哪种分配方式由Java堆决定,而Java堆是否规整,则有GC收集器决定。因此使用Serial、ParNew等带Compact过程的收集器时,系统采用的分配算法是指针碰撞。而使用CMS这种基于Mark-Sweep算法的收集器时,通常采用的空闲列表。

7.2 如何保证分配内存时线程的安全性

● 对分配内存的动作进行同步处理(实际上虚拟机采用CAS配上失败重试的机制保证了更新操作的原子性)
● 把分配内存的动作按照线程划分在不同的空间之中进行(即每个线程在Java堆中预先分配一小块内存(称为本地线程分配缓冲))。

7.3 对象的内存布局

在HotSpot虚拟机中,对象在内存中的布局可以分为3块区域:对象头,实例数据和对齐填充
对象头包括两部分信息:
● 存储对象自身的运行时数据(如:哈希码、GC分代年龄、锁 等)
● 类型指针(即对象指向他的类元数据的指针,虚拟机根据此指针来确认对象属于哪个类的实例)
● 如果是数据 记录数组的大小 实例数据:
● 实例数据才是对象真正存贮的有效信息(即程序中所定义的各种类型的字段内容)。
对齐填充:
● 不是必然存在的,仅仅起到占位符的作用,因为HotSpot虚拟机要求对象的起始地址必须是8个字节的整数倍。

来个例子把JVM的运行时的区域全部串起来

public class Kafka {public static void main() {ReplicaManager replicaManager = new ReplicaManager() ;replicaManager.loadReplicasFromDisk();}
}
public class ReplicaManager{private long replicacount;public void loadReplicasFromDisk(){Boolean hasFinishedLoad = false;if (isLocalDatacorrupt()) {}}public Boolean isLocalDatacorrupt(){Boolean isCorrupt = false;return iscorrupt;}
}

其实我们把上面的那个图和下面的这个总的大图一起串起来看看,还有配合整体的代码,我们来捋一下整体的流程,就会觉得很清晰。
在这里插入图片描述
首先,你的JVM进程会启动,就会先加载你的Kafka类到内存里。然后有一个main线程,开始执行你的Kafka中的main0方法。
main线程是关联了一个程序计数器的,那么他执行到哪一行指令,就会记录在这里,如上图
其次,就是main线程在执行main方法的时候,会在main线程关联的Java虛拟机栈里,压入一个main方法的栈帧。接着会发现需要创建一个ReplicaManager类的实例对象,此时会加载ReplicaManager类到内存里来。然后会创建一个ReplicaManager的对象实例分配在Java堆内存里,并且在main方法的栈帧里的局部变量表引入-"replicaManager”变量,让他引用ReplicaManager对象在Java堆内存中的地址。接着,main线程开始执行ReplicaManager对象中的方法,会依次把自己执行到的方法对应的栈帧压入自己的Java虚拟机栈执行完方法之后再把方法对应的栈帧从Java虛拟机栈里出栈。

相关文章:

JVM调优(10)JVM的运行时数据区

一、概述 对于 C C 来说,在内存管理领域,JVM既拥有最高的权利,但是同时他们又是从事最基础工作的劳动人员,因为他们担负着每一个对象从开始到结束的维护责任。而对于Java来说,再虚拟机自动内存管理的帮助下&#xff0…...

Python网络爬虫介绍

视频版教程:一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium 什么是网络爬虫? 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者)&#xff…...

iOS QR界面亮度调整

亮度调事,不久在QR界面切换的时候还要考虑进入前台后台时的操作 1.QR界面功能实现代码。 QR界面- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];[[NSUserDefaults standardUserDefaults] setValue:([UIScreen mainScreen].brightness) …...

Linux shell编程学习笔记17:for循环语句

Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、字符串、文件测试等多种运算,同样也需要进行根据条件进行流程控制,提供了if、for、while、until等语句。 之前我们探讨了if语句,现在我们来探讨for循环语句。 Li…...

Go语言用Resty库编写的音频爬虫代码

目录 一、Go语言与Resty库简介 二、音频爬虫的实现 1、确定抓取目标 2、使用Resty发送HTTP请求 3、解析响应数据 4、下载音频文件 5、并发下载音频文件 三、注意事项 总结 随着互联网的飞速发展,网络爬虫逐渐成为数据获取和分析的重要工具。在音频领域&…...

AWTK 液体流动效果控件发布

液体流动效果控件。 主要特色: 支持水平和垂直方向。支持正向和反向流动。支持设置头尾的图片。支持设置流动的图片。支持设置速度的快慢。支持启停操作。 准备 获取 awtk 并编译 git clone https://github.com/zlgopen/awtk.git cd awtk; scons; cd -运行 生成…...

对mysql的联合索引的深刻理解

背景 对mysql的联合索引的考察是Java程序员面试高频考点!必须深刻理解掌握否则容易丢分非常可惜。 技术难点 考察对最左侧匹配原理理解。 原理 暂且不表。网上讲这非常多。我理解就是,B树每个非叶子节点的值都是有序存放索引的值。 比如对A、B、C …...

C的自定义类型

目录 1. 结构体 1.1. 结构体类型的声明 1.1.1. 特殊声明 2. 结构的自引用 3. 结构体变量的定义和初始化 4. 结构体内存对齐 4.1. 结构体内存对齐 4.2. 修改默认对齐数 5. 结构体传参 6. 结构体实现位段(位段的填充&可移植性) 6.1. 什么是位…...

我的创作纪念日 - 2048

机缘 昨天刚刚收到 C 站的 1024 勋章: 今天爬山途中就又收到了 CSDN 的创作 2048 天纪念推送: 虽然 1024、2048 这些数字对普通人来说可能没有意义,但对于程序员来说却有不一样的情结。感谢 C 站这波细心的操作,替程序员的我们记…...

拿捏面试官,高频接口自动化测试面试题总结(附答案)狂收offer...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 面试题&#xff1…...

大数据-Storm流式框架(六)---Kafka介绍

Kafka简介 Kafka是一个分布式的消息队列系统(Message Queue)。 官网:Apache Kafka 消息和批次 kafka的数据单元称为消息。消息可以看成是数据库表的一行或一条记录。 消息由字节数组组成,kafka中消息没有特别的格式或含义。 消息有可选的键&#x…...

自动驾驶的未来展望和挑战

自动驾驶技术是一项引人瞩目的创新,将在未来交通领域产生深远影响。然而,随着技术的不断演进,自动驾驶也面临着一系列挑战和障碍。本文将探讨自动驾驶的未来发展方向、技术面临的挑战,以及自动驾驶对社会和环境的潜在影响。 自动驾…...

2.11、自定义图融合过程与量化管线

introduction 介绍如何自定义量化优化过程,以及如何手动调用优化过程 code from typing import Callable, Iterableimport torch import torchvisionfrom ppq import (BaseGraph, QuantizationOptimizationPass,QuantizationOptimizationPipeline, QuantizationSetting,Tar…...

Linux——文件权限属性和权限管理

文件权限属性和权限管理 本章思维导图: 注:本章思维导图对应的Xmid文件和.png文件都以传到“资源” 文章目录 文件权限属性和权限管理1. sudo提权和sudoers文件1.1 sudo提权和成为root的区别 2. 权限2.1 Linux群体2.1.1 为什么要有所属组2.1.2 修改文件…...

数组与链表算法-单向链表算法

目录 数组与链表算法-单向链表算法 C代码 单向链表插入节点的算法 C代码 单向链表删除节点的算法 C代码 对单向链表进行反转的算法 C代码 单向链表串接的算法 C代码 数组与链表算法-单向链表算法 在C中,若以动态分配产生链表节点的方式,则可以…...

Oracle(6) Control File

一、oracle控制文件介绍 1、ORACLE控制文件概念 Oracle控制文件是Oracle数据库的一个重要元素,用于记录数据库的结构信息和元数据。控制文件包含了数据库的物理结构信息、数据字典信息、表空间和数据文件的信息等。在Oracle数据库启动时,控制文件会被读…...

吴恩达《机器学习》2-5->2-7:梯度下降算法与理解

一、梯度下降算法 梯度下降算法的目标是通过反复迭代来更新模型参数,以便最小化代价函数。代价函数通常用于衡量模型的性能,我们希望找到使代价函数最小的参数值。这个过程通常分为以下几个步骤: 初始化参数: 随机或设定初始参数…...

Pytorch detach()方法

detach() 是 PyTorch 中的一个方法,用于从计算图中分离(detach)张量。它可以将一个张量从当前计算图中分离出来,返回一个新的张量,该张量与原始张量共享相同的底层数据,但不再追踪梯度信息。 当你需要在计…...

CTF-php特性绕过

注意&#xff1a;null0 正确 nullflase 错误 Extract变量覆盖 <?php$flagxxx; extract($_GET);if(isset($shiyan)){ $contenttrim(file_get_contents($flag));//trim移除引号if($shiyan$content){ echoctf{xxx}; }else{ echoOh.no;} }?> extract() 函数从数组中将…...

人脸识别测试数据分析

一个人脸识别研究小组对若干名学生做了人脸识别的测试&#xff0c;将测试结果写入到一个文件 dir_50.txt 中&#xff0c;每一行是一张照片的识别结果“_照片编号”“.jpg”的字符串组合&#xff0c;示例如下&#xff1a; [1709020621, 0]_116.jpg [1709020621]_115.jpg [17706…...

MySQL 5.7限制general_log日志大小

背景 需求&#xff1a; 在MySQL 5.7.41中开启general_log 并限制其大小&#xff0c;避免快速增长占用硬盘空间。 解决&#xff1a; 通过定时任务&#xff0c;执行简单的脚本&#xff0c;判断general_log 日志的大小&#xff0c;实现对通用查询日志的“每日备份”或“每日清…...

tomcat9~10猫闪退个人经验

java版本17与8 8版本有jre&#xff0c;java17没有jre 所以在java8版本中将jre和jdk路径一同添加环境是不会出现闪退的&#xff0c;tomcat9没有闪退 但是在10就闪退了&#xff0c;因为java版本太低 java17没有jre&#xff0c;但是可以通过一种方法添加jre到java17的目录 完…...

Linux之J2EE的项目部署及发布

目录 前言 一、会议OA单体项目windows系统部署 1.检验工作 1. 检验jar项目包是否可以运行 2. 验证数据库脚本是否有误 3. 测试项目功能 2. 部署工作 2.1 传输文件 2.2 解压项目及将项目配置到服务器中 2.3 配置数据库 2.4 在服务器bin文件下点击startup.bat启动项目 …...

基于闪电搜索算法的无人机航迹规划-附代码

基于闪电搜索算法的无人机航迹规划 文章目录 基于闪电搜索算法的无人机航迹规划1.闪电搜索搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用闪电搜索算法来优化无人机航迹规划。 …...

【网络安全 --- 文件上传靶场练习】文件上传靶场安装以及1-5关闯关思路及技巧,源码分析

一&#xff0c;前期准备环境和工具 1&#xff0c;vmware 16.0安装 若已安装&#xff0c;请忽略 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客文章浏览阅读186次&#xff0c;点赞9次&#xff0c;收藏2次。【网络安全 --- 工…...

BUUCTF刷题记录

[BJDCTF2020]Easy MD51 进入题目页面&#xff0c;题目提示有一个链接&#xff0c;应该是题目源码 进入环境&#xff0c;是一个查询框&#xff0c;无论输入什么都没有回显&#xff0c;查看源码也没什么用 利用bp抓包查看有没有什么有用的东西 发现响应的Hint那里有一个sql语句&…...

黑客技术(网络安全)—小白自学

目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&am…...

免登陆 同步脚本 zookeeper kafka集群详细安装步骤

一.免登陆配置 #修改注解名 vim /etc/hostname #修改host文件 vim /etc/hosts 192.168.1.10 kafka1 kafka1 192.168.1.11 kafka2 kafka2 192.168.1.12 kafka3 kafka3#免登陆生成秘钥和授权自动登陆 ssh-keygen -t rsa cd ~/.ssh shh-copy-id kafka1 shh-copy-id kafka2 shh-co…...

深入理解NLP

引子 自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是人工智能领域中的一个重要研究方向&#xff0c;它涉及了计算机与人类自然语言之间的交互和理解。 1. NLP的起源与发展 NLP的起源可以追溯到早期的机器翻译项目&#xff0c;随着科技的进步&…...

Python-自动化绘制股票价格通道线

常规方案 通过将高点/低点与其 2 个或 3 个相邻点进行比较来检测枢轴点,并检查它是否是其中的最高/最低点。对所有枢轴点进行线性回归以获得上方和下方趋势线。价格离开通道后建仓。通过这样做,我们得到如下所示的价格通道。我认为我们可以利用给定的数据取得更好的结果。...