回炉重造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区,执行完之后把二者身份互换。

        优点:能解决内存碎片

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谷歌Gboard应用的语言模型创新:提升打字体验的隐私保护技术

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

浦语大模型笔记

书生浦语大模型全链路开源体系 浦语大模型全链路开源体系大模型成为发展通用人工智能的重要途径书生浦语 2.0(InternLM2)核心理念书生浦语 2.0(InternLM2)的主要亮点主要亮点 1:超长上下文支持主要亮点 2:性…

网络库-libevent介绍

1.简介 libevent是一个事件驱动的网络库,主要用于构建可扩展的网络服务器。它提供了跨平台的API,支持多种事件通知机制,如select、poll、epoll、kqueue等。 主要组件 event: 表示一个具体的事件,包括事件类型、事件回调等。eve…

大模型管理工具:SWIFT

目录 一、SWIFT 介绍 二、SWIFT 安装 2.0 配置环境(可选) 2.1 使用pip进行安装 2.2 源代码安装 2.3 启动 WEB-UI 三、部署模型 3.0 deploy命令参数 3.1 原始模型 3.2 微调后模型 一、SWIFT 介绍 SWIFT(Scalable lightWeight Infrastructure for Fine-Tuni…

golang创建式设计模式------单例模式

目录导航 1.单例模式1)什么是单例模式 2)使用场景3)实现方式1.懒汉式单例模式2.饿汉式3.双重检查式4.sysc.Once式 4)实践案例5)优缺点分析 1.单例模式 1)什么是单例模式 单例模式(Singleton Pattern)是一种常用的设计模式。单例模式的类提供了一种访问其唯一对象的方法&#…

UML快速入门篇

目录 1. UML概述 2. 类的表示 2.1. 类的表示 2.2. 抽象类的表示 2.3. 接口的表示 3. 类的属性,方法,访问权限的表示 3.1. 类的属性 3.2. 类的方法 3.3. 类的权限 4. 类的关联 4.1. 单向关联 4.2. 双向关联 4.3. 自关联 4.4. 类的聚合 4.5.…

sipeed 的 MaixCam显示图片

WiFi联网后,把固件升级到最新 一根tpyc-c连接线为MaixCam供电,点击液晶屏settings 在WiFi中设置确保联网,在更新MaixPy中升级固件 可以选择国内源加速,将固件升级到最新版 MaixVision的操作 1,在MaixVision左下角…

C语言(指针)6

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记&#x…

StackQueue+泛型简单理解

🍁 个人主页:爱编程的Tom💫 本篇博文收录专栏:Java专栏👉 目前其它专栏:c系列小游戏 c语言系列--万物的开始_ 🎉 欢迎 👍点赞✍评论⭐收藏💖三连支持一…

新的语言学习系统: 记忆镶嵌

摘要 记忆镶嵌是由多个关联记忆网络协同工作来完成感兴趣的预测任务。与transformer类似,记忆镶嵌具有组合能力和上下文学习能力。与transformer不同,记忆镶嵌以相对透明的方式实现这些能力。该研究在玩具示例上展示了这些能力,并且还表明记忆镶嵌在中等规模语言建模任务上的表…

JVM调优:JVM运行时数据区详解

一、前言 Java运行时数据区域划分,Java虚拟机在执行Java程序时,将其所管理的内存划分为不同的数据区域,每个区域都有特定的用途和创建销毁的时间。 其中,有些区域在虚拟机进程启动时就存在,而有些区域则是随着用户线程…

YOLOv9-20240507周更说明|更新MobileNetv4等多种轻量化主干

专栏地址:目前售价售价69.9,改进点70 专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,助力高效涨点!!! 本周已更新说明: ### ⭐⭐更新时间:2024/5/12⭐⭐ 1. YOLOv9…

企业网站HTTP网站业务被慢连接攻击了该怎么办

企业的网站建设中遇到网络攻击会出现哪些问题?一些中小型企业对于网络安全的认知不足,网站建设种类众多,电子商城类,小型游戏,支付类型,H5页面的网站,开发等等,如遇见网络攻击造成的…

ubuntu server 22.04.4 系统安装详细教程

本教程使用vmware workstation 17创建虚拟机进行安装演示,安装方式和真机安装没有区别。 1、下载镜像 下载ubuntu server版本系统镜像,官网下载地址:https://cn.ubuntu.com/download/server/step1 注意:自己下载时需要确认是否是…

ARP中间人

文章目录 ARP中间人ARP协议介绍使用kali进行ARP毒化使用kali进行ARP中间人使用kali进行ARP钓鱼ARP攻击防御ARP总结 ARP中间人 ARP协议介绍 维基百科ARP介绍 ARP(地址解析协议)在网络通信中扮演着至关重要的角色,它通过将网络层地址&#x…

运维基础(二)- 钉钉的使用

一、钉钉的介绍(来自百度百科) 免费沟通和协同的多端平台 帮助中国企业通过系统化的解决方案(微应用),全方位提升中国企业沟通和协同效率。 钉钉(Ding Talk) 是阿里巴巴打造的企业级智能移动…

Windows环境下代码文档生成工具Doxygen使用详细教程

背景 最近研究aom源码,发现编译需要依赖Doxygen工具,故此篇博客详细记录下Doxygen的安装和使用。 Doxygen Doxygen 是一个强大的源代码文档生成工具,它支持多种编程语言,能够直接从源代码中的注释提取文档,并生成多…

RabbitMQ中间件安装

消息队列 RabbitMQ yum -y update yum -y install epel-release erlang # 安装erlang erl -version # 判断是否安装成功根据官网的的表格判断自己用哪个版本的 RabbitMQ:https://www.rabbitmq.com/docs/which-erlang#r16b03 [rootiZuf6hqrs5cb2ccyuc9nqvZ ~]# er…

tomcat 设置JVM 参数

tomcat 启动的服务 设置jvm 设置的文件目录: /tomcat/bin/catalina.sh 添加设置参数: JAVA_OPTS“$JAVA_OPTS -server -Xms1024m -Xmx4096m -XX:MetaspaceSize1024m -XX:MaxMetaspaceSize2048m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/data/se…

0510Goods的Maven项目

0510Goods的Maven项目包-CSDN博客 数据库字段 商品主页 修改页面 点击商品主页更改信息, 跳转到修改页面, 并保留初始信息。 商品类别最多选取三项,最少选取一项 添加界面 商品类别最多选取三项,最少选取一项