回炉重造java----JVM

为什么要使用JVM

①一次编写,到处运行,jvm屏蔽字节码与底层的操作差异

②自动内存管理,垃圾回收功能

③数组下边越界检查

④多态

JDK,JRE,JVM的关系

JVM组成部分

JVM的内存结构

《一》程序计数器(PC Register)

作用:

java代码执行流程: java源代码-->二进制字节码文件(jvm指令)-->解释器-->机器码-->cpu执行,而程序计数器就是去记住下一条jvm指令的执行地址。

特点:

        ①线程私有

        ②唯一不会存在内存溢出的区

《二》虚拟机栈(JVM Stack)

概念:每个线程运行时所需要的内存,称为虚拟机栈。

        1. 答:垃圾回收不涉及栈内存,因为栈中是运行方法时的存放的地方,当方法结束后栈帧会自动退栈释放空间,不需要垃圾回收机制来处理。垃圾回收主要是去处理堆内存。

        2. 答:不是,内存分配越大并不会对程序的执行效率有提升,反而会减少内存空间和线程的数量。

        3. 答:方法内的局部变量是安全的,因为一个线程对应自己的一个栈,局部变量各自存在栈中。但是如果是static修饰的变量线程间就会共享,可能会产生线程安全问题。另外如果局部变量是引用类型并且逃离了方法的作用范围,就会产生线程安全问题。

栈内存溢出:java.lang.StackOverflowError

        ①方法(栈帧)过多,栈帧内存超过栈的总内存就会发生栈溢出 

        ②栈帧过大直接挤满了栈发生栈溢出(反复调用)

 线程诊断:

        ①top命令可以查看所有正在运行的进行和系统负荷提供不断更新的概览信息,包括系统负载、CPU利用分布情况、内存使用、每个进程的资源占用情况等信息

        ②ps H -eo pid,tid,%cpu |  grep 进程ID    查看线程的信息

        ③jstack 进程ID  查看进程的线程信息

        

《三》本地方法栈(Native Method Stacks)

        有的时候我们需要调用操作系统底层的一些方法,但是java语言不可以直接调用,所以就需要一些更底层的c或者c++写的本地方法去间接调用。所以我们要创建一个本地方法栈去存储本地方法运行时需要的空间

        

《四》堆(Heap)

        ①通过new 创建的对象都会使用堆内存

        ②线程共享,其中的对象都需要考虑线程安全的问题

        ③垃圾回收机制

堆内存溢出: java.lang.OutOfMemoryError

堆内存诊断:

        ①jps   查看当前正在运行的java进程

        ②jmap -heap 进程号   查看堆内存的占用情况

        ③jconsole

《五》方法区(Method Area)

        ①线程共享,在虚拟机启动时创建

        ②ClassLoader,类加载器,加载类的二进制字节码

 方法区内存溢出:

运行时常量池 

①二进制字节码文件:类的基本信息+常量池+类方法定义包括虚拟机指令

②常量池:是.class文件中的,其实就是一张表,虚拟机指令根据常量池去找到要执行对应的类名,方法名,参数等信息

③运行时常量池:当类被加载时他的常量池信息就会放进运行时常量池,并且把其中的符号地址编程真实地址

StringTable串池(hashtable结构,不能扩容)

常量池被加载到运行时常量池的时候,这时 a b ab 都是常量池中的符号,还不是java对象。当程序中要使用的时候会先去查看串池中有没有,没有的话就把这些符号放到串池当中变成字符串对象。这个是叫做字符串的延迟加载,不用就不加载

s1+s2会在堆中创建一个新的字符串对象。其底层是一个StringBuilder对象,使用toString方法最后再new String对象,注意:这个对象是只在堆中,不在串池中

s5中,两个字符串拼接起来是直接在串池中找

注意,1.6版本的话如果串池中没有的话,会复制一份对象放进去,而不是放本身,所以串池中的对象跟外面的那个不是一个,外面那个对象还是在堆中

来个题目练练手:

StringTable的位置:1.6下存放在常量池(永久代)中,1.7之后就放在堆中,因为在常量池中的回收效率很低 

StringTable垃圾回收

当存入的数据大于Stringtable的空间大小时,会触发垃圾回收机制

StringTable性能调优

①参数StringTableSize来调整StringTable的桶个数,让下面的链表不能太长

②当有大量的字符串对象时,考虑将字符串对象是否入池,去重优化字符串的个数

《六》垃圾回收

1,如何判断对象可以回收:

        ①引用计数法

        ②可达性分析算法,这个算法的基本思想就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的。

        ③Java的五种引用

2,垃圾回收算法

标记—清除:分为两个阶段,一个是标记阶段,为每个对象进行标记看是不是被GC ROOT引用;第二个阶段是清除阶段,该阶段对死亡的对象进行清除,执行 GC 操作。

        优点:是可以解决循环引用的问题必要时才回收(内存不足时)

        缺点:标记和清除的效率不高,尤其是要扫描的对象比较多的时候,会造成内存碎片

标记—整理:也是分为两个阶段,一个是标记阶段,为每个对象进行标记看是不是被GC ROOT引用;第二个阶段是整理,在清理垃圾的过程中将所有存活的对象整理移动一下,再去清理空间

        优点:解决标记清除算法出现的内存碎片问题。

        缺点:压缩阶段,由于移动了可用对象,需要去更新引用。

复制算法:将内存分成两个相同大小的区,分别为from和to。使用时只使用一个,当进行垃圾回收时,首先将from区的垃圾标记,然后把存活的对象全部放去to区,再清空from区,执行完之后把二者身份互换。

        优点:能解决内存碎片

        缺点::会造成一部分的内存浪费;如果存活对象的数量比较大,复制算法的性能会变得很差。

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

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

相关文章

傻瓜化备份/恢复K8S集群Etcd数据

前言: 备份重要数据,简化重复操作,让一指禅、点点点也能完成运维任务。 脚本呈现界面如下: 1、查看Etcd版本 rootmaster:~# cat /etc/kubernetes/manifests/etcd.yaml | grep image: | awk {print $2} registry.aliyuncs.com/goo…

SpringCloud------Eureka,Ribbon,Nacos

认识微服务 微服务技术栈 微服务概念 微服务结构 微服务技术对比 企业需求 SpringCloud 认识Springcloud 服务拆分及远程调用 每个服务只能查询自己数据库中的表,导致其他服务如果想使用别人的表数据,这就需要进行远程调用,这里使用RestTem…

杨校老师项目之基于51单片机的汽车智能照明系统【嵌入式】

获取全套资料: 有偿获取:mryang511688 技术:C语言、单片机等 摘要: 科技的发展,人们对汽车的安全性也提出了更高要求。照明系统作为汽车组成部分之一,承担着重要职能,传统汽车智能照明系统已无法…

【云计算小知识】云管理的作用是什么?

云计算已经成为推动企业数字化转型,提升运营效率的重要力量。而在这个过程中,云管理作为确保云计算环境稳定、高效运行的关键环节,其作用愈发凸显。今天我们小编就给大家详细介绍一下云管理的作用是什么? 云管理的作用是什么&…

小程序的小组件

进度的组件 文字换行过滤 以及 排序 简单易懂 只为了记录工作 <template><div><ProgressBar :progress"progress" /><button click"increaseProgress">增加进度</button><view class"goods-name">12…

【408精华知识】提高外部排序速度的三种方式

文章目录 一、败者树二、置换-选择排序三、最佳归并树 一、败者树 还没写完… 二、置换-选择排序 三、最佳归并树 写在后面 这个专栏主要是我在学习408真题的过程中总结的一些笔记&#xff0c;因为我学的也很一般&#xff0c;如果有错误和不足之处&#xff0c;还望大家在评…

Wikimedia To Opensearch

概览 Wikimedia ⇒ Kafka ⇒ OpensearchJava Library&#xff1a;OKhttp3和OkHttp EventSource&#xff1b;生产者&#xff1a;Wikimedia&#xff1a;WikimediaChangeHandler和WikimediaChangeProducer&#xff1b;消费者&#xff1a;Opensearch&#xff1a;OpenSearchConsume…

AI智能体|我把Kimi接入了个人微信

大家好&#xff0c;我是无界生长。 最近加入AI学习交流群的小伙伴越来越多&#xff0c;我打算在微信群接入一个聊天机器人&#xff0c;让它协助管理微信群&#xff0c;同时也帮忙给群友解答一些问题。普通的群聊机器人肯定是不能满足需求的&#xff0c;得上AI大模型&#xff0c…

【JVM类加载机制】深度剖析JVM类加载机制

深度剖析JVM类加载机制 前言类加载运行全过程loadClass的类加载过程 类加载器和双亲委派机制类加载器的类型类加载器的初始化过程双亲委派机制为什么要设置双亲委派机制&#xff1f;全盘负责委托机制自定义类加载器实例打破双亲委派机制Tomcat打破双亲委派机制Tomcat自定义加载…

问题解决记录 | kettle中出现中文乱码

spoon.bat的启动文件中进行修改 if "%PENTAHO_DI_JAVA_OPTIONS%""" set PENTAHO_DI_JAVA_OPTIONS"-Xms1024m" "-Xmx2048m" "-Dfile.encodingUTF-8"

spark结课之小小tip

scala常用方法总结&#xff1a; 1.map()方法&#xff1a;用于对集合中的每个元素应用一个函数&#xff0c;并将结果收集到一个新的集合中。 基本结构&#xff1a; def map[B](f: (A) > B): List[B] 实例&#xff1a; val numbers List(1, 2, 3, 4, 5) val doubledNumber…

废品回收小程序,推动回收行业数字化发展

在垃圾分类、资源回收利用的时代背景下&#xff0c;废品回收行业迅速成长&#xff0c;市场规模逐渐扩大&#xff01; 随着“互联网”应用的普及&#xff0c;废品回收行业也进入到了数字化回收领域&#xff0c;各大回收行业开始专注于发展智能回收。此外&#xff0c;线上废品回…

‘vue-cli-service‘ is not recognized as an internal or external command解决方案

vue-cli-service is not recognized as an internal or external command, operable program or batch file.解决方案 先进行 &#xff1a; npm install -g vue/cli 命令安装vue cli 是必须的。 如果 npm run build 还是报错 遇到同样的提示&#xff1a; 这时候先安装依赖 np…

智慧管家物业管理系统(小组项目)

目录 前言 一、项目介绍 1、目的和背景 2、项目主要内容 3、技术介绍 二、功能模块 1、重要文件结构 2、功能实现&#xff08;部分个人负责模块功能&#xff09; 2.1 展示房源信息页面 2.2 房屋详情页面 2.3 房源信息管理 三、功能模块页面 1、前台模块 2、后台…

【讲解下iCloud如何高效利用】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【C语言/数据结构】栈:从概念到两种存储结构的实现

目录 一、栈的概念 二、栈的两种实现方式 1.顺序表实现栈 2.链表实现栈 三、栈的顺序存储结构及其实现 1.栈的声明 2.栈的初始化 3.栈的销毁 4.栈的压栈 5.栈的弹栈 6.栈的判空 7.返回栈顶元素 8.返回栈的长度 四、栈的链式存储结构及其实现 1.栈的声明 2.栈的…

推荐非常方便的初始配置nginx的开源工具

官网 https://www.digitalocean.com/community/tools/nginx?global.app.langzhCN直接复制base64字符串在 /etc/nginx 目录执行&#xff0c;会自动生成配置文件&#xff0c;最后执行 使用tar解压新的压缩配置 tar -xzvf nginxconfig.io-xxx.com.tar.gz | xargs chmod 0644在…

用Transformers实现简单的大模型文本生成

根据输入的prompt&#xff0c;生成一段指定长度的文字。Llama跑起来太慢了&#xff0c;这里用GPT-2作为列子。 from transformers import GPT2LMHeadModel, GPT2Tokenizer import torchtokenizer GPT2Tokenizer.from_pretrained("gpt2") model GPT2LMHeadModel.fr…

打造清洁宜居家园保护自然生态环境,基于YOLOv7【tiny/l/x】参数系列模型开发构建自然生态场景下违规违法垃圾倾倒检测识别系统

自然生态环境&#xff0c;作为我们人类赖以生存的家园&#xff0c;其健康与否直接关系到我们的生活质量。然而&#xff0c;近年来&#xff0c;一些不法分子为了个人私利&#xff0c;在河边、路边等公共区域肆意倾倒垃圾&#xff0c;严重破坏了环境的健康与平衡。这种行为不仅损…

计算机视觉的应用30-基于深度卷积神经网络CNN模型实现物体表面缺陷检测技术的项目

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用30-基于深度卷积神经网络CNN模型实现物体表面缺陷检测技术的项目主要包括&#xff1a;物体表面缺陷检测技术项目介绍&#xff0c;数据构造&#xff0c;模型介绍。 物体表面缺陷检测技术是工业自动化…