java12

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是在操作系统之上重新虚拟出来的一套系统,是Java程序(不仅仅是java程序,只要是符合JVM字节码规范的程序,比如Kotlin、 Groovy、 Scala这些语言的程序也是可以运行的)的运行环境,负责将字节码转换为机器码并执行。

 

JVM的作用

3.1 write once,run anywhere(一次编写,到处运行)

学过java的同学应该都听过吧,Java号称一次编写,到处运行,其实真正实现到处运行的就是JVM,JVM提供的字节码程序运行环境屏蔽了不同操作系统(windows、macOS、linux系统等)的差异,由JVM去适配各个操作系统的接口,也就是说不同的操作系统有不同的JVM实现,从而实现java语言跨平台运行的能力,达到一次编写到处运行的效果。

JVM提供的是程序的运行环境,它并不关心你用的是什么语言,只要最终编译后的字节码符合JVM规范,它都可以运行,这样就使得代码和运行环境分开了,同一份代码编译后就可以在不同的操作系统上由对应的JVM去运行。开发的时候我们安装的是JDK,JDK包含了开发的一些工具集,也包含了JRE(Java Runtime Environment,java程序运行环境),这个JRE包含了JVM,而生产上一般只需要安装JRE去运行我们编译好的class字节码文件即可。

 

3.2 自动内存管理

C和C++语言都是通过手动操作主动去申请内存和释放内存,虽然灵活但是稍不注意没有释放就可能导致内存泄漏,而JVM有自己的内存管理机制,开发同学不用过多关注内存的申请和释放,集中精力放到业务实现上,内存的分配和回收都由JVM去管理(虽然JVM也可能会导致内存泄漏,更多的原因可能是代码问题或者内存分配及垃圾回收参数配置不合理,调优即可)。

在java程序中,对象占用的空间内存分配由JVM来分配,对象无任何引用不再使用时,由JVM选择合适的时机进行垃圾回收,自动释放所占用的空间。

虚拟机栈
​ 虚拟机栈描述的方法执行的内存模型。在每个方法执行的同时会创建一个栈帧,用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法调用执行完成,都对应着一个栈帧在虚拟机中入栈到出栈的过程。

​ 局部变量表:存放的是方法参数和方法内定义的变量。局部变量表在编译时就确定了局部变量表的大小, 一个局部变量可以保存一个类型为boolean、byte、char、short、int、float、long、double、reference和returnAddress类型的数据。 long和double占用2个局部变量空间,其余类型占用1个局部变量空间。

​ 操作数栈:和局部变量表一样,操作数栈在编译时也确定了栈深度。操作数栈可以理解为java虚拟机栈中的一个用于计算临时数据的存储区(寄存器)。

​ 动态连接: 一个方法调用另一个方法,在栈帧中只会存储另一个方法的符号引用,需要将其转换成内存地址。

​ 方法出口:保存现场和恢复现场。

虚拟机栈的大小默认是1M。

本地方法栈
java调用c/c++的动态链接库,运行里面函数所需要的栈。JNI

​ Hot-Spot虚拟机直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈也会在栈深度溢出或者栈扩展失败时分别抛出StackOverflowError和OutOfMemoryError异常。

方法区
​ 方法区只是一个java虚拟机的规范,在jdk8以前方法区的具体实现是***永久代***,jdk8方法区的具体实现***元空间***

​ 主要存储类的元信息(IntanceKlass)

​ Java7及以前版本的Hotspot中方法区位于永久代中。同时,永久代和堆是相互隔离的,但它们使用的物理内存是连续的。 永久代的垃圾收集是和老年代捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。 但在Java7中永久代中存储的部分数据已经开始转移到Java Heap或Native Memory中了。比如,符号引用(Symbols)转移到了Native Memory;字符串常量池(interned strings)转移到了Java Heap;类的静态变量(class statics)转移到了Java Heap

 

JVM内存结构主要有三大块:堆(heap space)、方法区(method area/ PermGen/ MetaSpace)、本地区(native area)。
堆内存

堆内存(heap space)存放所有线程共享的对象和数组。在虚拟机启动时创建,Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”。GC回收的策略是按代回收。
对象在实例化后的整个运行周期内,都被存放在堆内存中。堆内存又被划分成不同的部分:是JVM中最大的一块由年轻代(Young Generation Space)和老年代(Old Generation Space)组成。而年轻代内存又被分成三部分,伊甸区(Eden)、From Survivor空间、To Survivor空间(幸存者区域(Survivor Sapce)包括From Survivor空间、To Survivor空间)。默认情况下年轻代按照8:1:1的比例来分配。

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

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

相关文章

vue3 基于element-plus进行的一个可拖动改变导航与内容区域大小的简单方法

1、先上个截图: 说明:拖动上面的分隔栏就可以实现,改变左右区域的大小。 2、上面的例子来自官网的: Container 布局容器 | Element Plus 3、拖动的效果来自: https://juejin.cn/post/7029640316999172104#heading-1…

Excel 无法打开文件

Excel 无法打开文件 ‘新建 Microsoft Excel 工作表.xlsx",因为 文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。

K8S node节点没有相应的pod镜像运行故障处理办法

查看从节点状态 kubectl describe node k8s-node1以下是报错提示 解决办法 需要处理node1节点上的磁盘空间,磁盘空间需要在85%内 处理后的状态 处理正常

使用代理时Stable Diffusion无法正常下载各类模型的解决办法

最近发现了 Stable Diffusion 这个好玩的ai绘画工具,不得不感叹现在ai工具已经进化到这么简单易用的程度,只要下载对应的模型就可以生成各种有意思的图片 就算你没有编程基础,跟着教程也能弄出来 不过使用过程中发现部分功能无法使用 查看日…

GODOT 4 不用scons编译cpp扩展的方法

以terrain3d插件,Godot_v4.3 为例: 下载下来,先用scons编译一遍通过后,整个占用1GB,obj文件都生成在源码旁边,够乱。 scons 是跨平台的构建工具,但是需要需要写python脚本。流程比较莫名其妙…

Python 学习完基础语法知识后,如何进一步提高?

入门Python后,就可以拿些小案例练手了,这时候千万不要傻乎乎地成天啃语法书。 编程是一门实践的手艺,讲究孰能生巧。不管是去手撸算法、或者照葫芦画瓢写几个小游戏都可以让你的Python突飞猛进。 之前看github比较多,推荐给大家…

基于Java的简单图书管理系统的实现(增删改查)

基于Java的简单图书管理系统的实现(增删改查) package com.situ.lib;public class Book {//对象:书-----定义书的属性:private String name;private String isbn;private String author;private double price;//无参构造方法:pub…

C语言必做30道练习题

C语言练习30题(分支循环,数组,函数,递归,操作符) 目录 分支循环1.闰年的判断2.阅读代码,计算代码输出的结果3.输入一个1~7的数字,打印对应的星期几4.输入任意一个整数值,…

tp接口 入口文件 500 错误原因

一、描述 二、可能的原因 1、runtime目录没权限 2、关闭了Tp记录日志的功能 3、关闭debug调试模式 4、关闭了debug模式还是报错 一、描述 Thinkphp项目本地正常,上传到线上后静态文件访问正常,访问tp接口报500错误。 经调试发现,在php入…

思源笔记轻松连接本地Ollama大语言模型,开启AI写作新体验!

文章目录 前言1. 下载运行Ollama框架2. Ollama下载大语言模型3. 思源笔记设置连接Ollama4. 测试笔记智能辅助写作5. 安装Cpolar工具6. 配置Ollama公网地址7. 笔记设置远程连接Ollama8. 固定Ollama公网地址 前言 今天我们要聊聊如何通过cpolar内网穿透技术,把国产笔…

CAS 详解

Java 中 CAS 是如何实现的? 在 Java 中,实现 CAS(Compare-And-Swap, 比较并交换)操作的一个关键类是Unsafe。 Unsafe类位于sun.misc包下,是一个提供低级别、不安全操作的类。由于其强大的功能和潜在的危险性&#xf…

九识智能与徐工汽车达成战略合作,共绘商用车未来新蓝图

近日,九识智能与徐工汽车签署战略合作协议,标志着双方在智能驾驶技术与新能源商用车融合应用、联合生产及市场推广等方面迈入深度合作的新篇章,将共同引领智能驾驶技术商业化浪潮。 近年来,在国家智能化发展战略的引领下&#xff…

【vue2.7.16系列】手把手教你搭建后台系统__登录使用状态管理(15)

使用store进行登录信息管理 其实就是把登录放到vuex的actions中去执行,然后保存用户信息、权限等 在store/modules/account.js中添加如下代码: import { login, logout, getInfo, menusApi } from /api/account; // getExpiresTime import {getToken,s…

sql报错信息将字符串转换为 uniqueidentifier 时失败

报错信息: [42000] [Microsoft][SQL Server Native Client 10.0][SQL Server]将字符串转换为 uniqueidentifier 时失败 出错行如下: 表A.SourceCode 表B.ID 出错原因: SourceCode是nvarchar,但ID是uniqueidentifier 数据库查询字段和类…

「Mac畅玩鸿蒙与硬件22」鸿蒙UI组件篇12 - Canvas 组件的动态进阶应用

在鸿蒙应用中,Canvas 组件可以实现丰富的动态效果,适合用于动画和实时更新的场景。本篇将介绍如何在 Canvas 中实现动画循环、动态进度条、旋转和缩放动画,以及性能优化策略。 关键词 Canvas 组件动态绘制动画效果动态进度条旋转和缩放性能优…

Python练习10

Python日常练习 题目: 编写程序,输出如下所示图案。 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 要求: 使用for循环的方式完成 --------------------------------------------------------- 注意: …

【前端】html的8个常用标签

HTML html 超文本链接(标记)语言 H5 HTML v5 get/post/delete/put —— restful 网络规划 Web开发 结构样式动作 架构 装饰 交互(动作) 装饰做好了–> UI工程师 标签 文本相关 图片、图像、声音 导航 表格* 列表 表单标签* 布局标签 H5…

Java高效学习家教平台系统小程序源码

📚 家教平台系统:让孩子学习更高效的秘密武器 🚀 👩‍🏫 引言:家教新风尚,线上平台引领教育潮流 在这个信息爆炸的时代,家教平台系统如同雨后春笋般涌现,为孩子们的学习…

Qt多边形填充/不填充绘制

1 填充多边形绘制形式 void GraphicsPolygonItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {Q_UNUSED(option);Q_UNUSED(widget);//painter->setPen(pen()); // 设置默认画笔//painter->setBrush(brush()); // 设置默…

OpenAI大事记;GPT到ChatGPT参数量进化

目录 OpenAI大事记 GPT到ChatGPT参数量进化 OpenAI大事记 GPT到ChatGPT参数量进化 ChatGPT是从初代 GPT逐渐演变而来的。在进化的过程中,GPT系列模型的参数数量呈指数级增长,从初代GPT的1.17亿个参数,到GPT-2的15 亿个参数,再到 GPT-3的1750 亿个参数。模型越来越大,训练…