浅谈JVM,走进JVM的世界

Java基础知识总结(绝对经典),Java笔试题及答案详解 21、Java注解深入浅出 22、山顶洞人都懂的反射,你懂吗? 23、【Java8 新特性】Supplier简介 二、Java多线程 1、浅谈Java多线程<最通俗易懂的讲解> 2、浅谈Java守护线程 3、死锁、活锁、饿死和阻塞的个人理解 4、Java线程池原理及实现 5、Java多线程之Executor框架 6、搞懂ThreadLocal,一篇文章足矣 7、Java常见的线程池 三、Java面试题 1、Java面试题进阶 2、Spring面试题总结 3、Java面试题总结(绝对经典) 4 阅读详情

走进JVM的世界,重新认识JVM  ----->>>>>>>>原来JVM的世界我也懂

      JVM有2种运行模式,一个是server,一个是client,client启动较快,而server模式启动启动较慢,但能长期稳定运行,运行之后会比client的速度快,我们常用的也是server模式,如何查看使用的是什么模式  很简单  java -version 就清楚了。

目录

1.什么是JVM

2.什么是class文件,被编译后的class字节码你还认识吗?

3.类加载(JVM的类加载是通过ClassLoader及其子类来完成的)

4.类加载过程(不同来源的.class字节加载到jvm内存中【方法区】)

5.运行时数据区

A.方法区

B.java堆

C.方法区和元空间区别


1.什么是JVM

JVM是一个跨平台虚拟机,JVM和class有扯不清的关系,直接上图,让你重新认识jvm,原来jvm是这个样子

 

2.什么是class文件,被编译后的class字节码你还认识吗?

      被编译后的class字节码文件内容为16进制,都是以 CA FE BA  BE 开头 [ 俗称魔数(magic)] +副版本号 +主版本号+常量池计数器+常量池数据区+访问标志+类索引 +父类索引 +接口计数器 +接口信息数据区+字段计数器+方法信息数据区 +方法计数器 +方法信息数据区 +属性计数器 +属性信息数据区

其中jdk1.8的16进制版本号为 00 00 00 34  jdk1.7的16进制版本号为 00 00 00 33

      常量计算器默认是从1开始,当constant_pool_count = 1时,常量池中的cp_info个数为0;当constant_pool_count为n时,常量池 中的cp_info个数为n-1。

      常量池分为字面量和符号引用。
字面量:文本字符串、被声明的final常量值、基本数据类型、等。
符号引用:类和结构完全限定名、字段的名称和描述、方法名称和描述
...............
 

3.类加载(JVM的类加载是通过ClassLoader及其子类来完成的)

  1.   类加载时机
  •    遇到 new 、 getstatic 、 putstatic 和 invokestatic 这四条字节码指令时,如果对应的类没有
    初始化 ,则要对对应的类先进行初始化。
  • 使用 java.lang.reflect 包方法时对类进行反射调用的时候
  • 初始化一个类的时候发现其父类还没初始化,要先初始化其父类
  • 当虚拟机开始启动时,用户需要指定一个主类,虚拟机会先执行这个主类的初始化。

4.类加载过程(不同来源的.class字节加载到jvm内存中【方法区】)

         验证--->加载--->准备【不包含final修饰的static】--->解析【符号引用替换为直接引用的过程】--->初始化【同一个类加载器下,一个类型只初始化一次】
 
 
 

5.运行时数据区

JDK1.8前和JDK1.8后(包括1.8)内存模型是不一样的,1.8后方法区已迭代更名为元空间
 
 

运行时数据区的使用顺序:方法区(类信息、常量池信息等)==> 堆(对象或者数组)==>虚拟机栈、程序计数器、本地方法栈(不 是必须的)

A.方法区

1、类型信息

  • 类型的全限定名
  • 超类的全限定名
  • 直接超接口的全限定名
  • 类型标志(该类是类类型还是接口类型)
  • 类的访问描述符(public、private、default、abstract、fifinal、static)

2、类型的常量池

存放该类型所用到的常量的有序集合,包括直接常量(如字符串、整数、浮点数的常量)和对其他类

型、字段、方法的符号引用 。常量池中每一个保存的常量都有一个索引,就像数组中的字段一样。因为
常量池中保存着所有类型使用

3、字段信息(该类声明的所有字段)

  • 字段修饰符(public、protect、private、default)
  • 字段的类型
  • 字段名称

4、方法信息

  • 方法信息中包含类的所有方法,每个方法包含以下信息:
  • 方法修饰符
  • 方法返回类型
  • 方法名
  • 方法参数个数、类型、顺序等
  • 方法字节码
  • 操作数栈和该方法在栈帧中的局部变量区大小
  • 异常表

5、类变量(静态变量)

  • 指该类所有对象共享的变量,即使没有任何实例对象时,也可以访问的类变量。它们与类进行绑定。

6、指向类加载器的引用

  • 每一个被JVM加载的类型,都保存这个类加载器的引用,类加载器动态链接时会用到。

7、指向Class实例的引用

  • 类加载的过程中,虚拟机会创建该类型的Class实例,方法区中必须保存对该对象的引用。通过 Class.forName(String className)来查找获得该实例的引用,然后创建该类的对象。
8 、方法表
  • 为了提高访问效率,JVM可能会对每个装载的非抽象类,都创建一个数组,数组的每个元素是实例可能 调用的方法的直接引用,包括父类中继承过来的方法。这个表在抽象类或者接口中是没有的。
9 、运行时常量池 (Runtime Constant Pool)
  • Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种字面常量和符号引用,这部分内容被类加载后进入方法区的运行时常量池中存放。
  • 运行时常量池相对于Class文件常量池的另外一个特征具有动态性,可以在运行期间将新的常量放入池 中(典型的如String类的intern()方法)。
 

B.java堆

堆被划分为老年代和年轻代。 年轻代和老年代的内存占比默认为1:2。年轻代又划分为:伊甸园(Eden)、两个幸存区(Survivor),伊甸园和两个幸存区的内存占比默认为8:1:1。之所以我们堆内存要进行以上这么细粒度的内存划分,是为了垃圾回收

垃圾回收针对不同情况的对象,回收策略(回收算法)是不同的的。而通过内存的划分,可以将不同的算法在不同的区域中进行使用。比如说年轻代使用了复制算法。 年轻代中的对象,生命周期很短,基本上是很快就死了,也就是被GC了。 老年代中的对象,都是一些老顽固,都是多次回收的对象或者大对象才存到老年代中

  • 内存分配原则
  1. 优先在 Eden 分配,如果 Eden 空间不足虚拟机则会进行一次 MinorGC
  2. 【大对象】直接接入老年代,【大对象】一般指的是【很长的字符串或数组】
  3. 【长期存活的对象】也会进入老年代,每个对象都有一个age

C.方法区和元空间区别

存储位置不同,永久代物理是是堆的一部分,和新生代,老年代地址是连续的,而元空间属于本地内存; 由于永久代它的大小是比较小的,而元空间的大小是决定于内地内存的。 所以说永久代使用不当,比较容易出现OOM异常。而元空间一般不会。存储内容不同,元空间存储类的元信息,[静态变量]和[常量池]等并入堆中。相当于永久代的数据被分到了堆和元空间中。


  • 勿喷,如有不正确的地方指出来,一起学习研究
【经典面试题】【JVM与性能调优】JDK入门介绍,别再说你分不清JRE、JDK、JVM、SDK的区别了 JDK、JRE、SDK傻傻分不清楚~ 阅读详情

相关推荐

跨阻放大器(TIA)的输入输出阻抗的定义、分析和影响因素

跨阻放大器(Transimpedance Amplifier,简称TIA)是一种常用于将电流信号转换为电压信号的放大器。在TIA电路中,输入阻抗是指输入端对电流信号的响应能力,输出阻抗是指输出端对负载电阻的驱动能力。本文将分别介绍TIA的输入和输出阻抗的定义、分析以及影响因素。

weixin_44378594的博客 1万+

了解jvm的世界

基本概念 JVM是可运行Java代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM是运行在操作系统之上的,它与硬件没有直接的交互。 JVM 类加载机制 加载 通过类的全路径名,获取类的二进制数据流。 获得了类的信息,解析类的数据流,转化为⽅法区内部的数据结构。 创建java.lang.Class类的实例 验证 这一阶段的主要目的是为了确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。 验证的步骤: 格

qq_40297844的博客 207

【外挂编程】外挂编程技术揭秘(二)

引言: 经过上一篇文章大家可能对外挂有了一个初步的认识,之前的内容比较简单,应该大家很容易掌握。我写作过程中我发现三个篇幅可能写不完,后续还可能要多加几个篇幅,这篇我们就先以内存挂为主吧。话不多说了,让我们开始吧。 文章中代码github地址: https://github.com/Diamonds-ZhaoYu/hz_example 环境要求: 系统:Windows 语言...

c-rain 4034

JVM运行时数据区

常见JVM面试题及答案整理 1、运行时数据区的结构 运行时数据区包括,方法去、堆、pc计数器、本地方法区和虚拟机栈。其中方法区在JDK8中更名为元空间。程序计数器和虚拟机栈都不会发生GC,程序计数器也不会发生溢出异常,虚拟机栈有溢出错误。堆空间和方法区有GC和OOM异常,但是方法区GC条件苛刻,GC效率低,GC主要发生在堆区。 2.虚拟机栈栈帧的组成 虚拟机栈由一个个的栈帧组成,栈帧的大小决定了栈的最大深度,而栈帧的大小主要取决于局部变量表和操作数栈。 ...

cl19950327的博客 1396

某音播放量查询,播放量接口研究,最新版本抓包,修改SO文件绕过SSL

本教程适用于某音27.8,64位版本,32为版本及某音旁侧版本修改方法大同小异,部分旁侧版本修改之后模拟器可能无法抓包,真机测试均可正常抓包,此方法修改后绝大部分包可以正常抓取,但部分包无法抓取,例如验证码,内置浏览器功能,如需抓取此类包可通过 Postern + Charles 实现。

byalipus的博客 1万+

抖音小游戏(IAA)巨量引擎投放指南

摘要:本文详细介绍了在巨量引擎平台投放小游戏广告的完整流程,包括五个关键步骤:1)添加小游戏资产,填写ID等信息并等待审核;2)添加事件管理,配置激活和关键行为事件;3)通过橙子建站创建落地页,设置跳转链接;4)新建广告项目,选择小程序推广目标;5)完成广告创建。

分享前端工程化、AI 应用、Agent 开发与大模型实践! 4499

JVM——运行时数据区域

一、运行时数据区的结构 如上图,运行时数据区包括五个部分,红色区域多个线程共享,灰色区域每一个线程独占, 在java API ,一个java虚拟机就对应一个Runtime类,一个Runtime就对应一个运行时数据区。 1.1 程序计数器 程序计数器用来存储指向下一条指令的地址,也即将要执行的指令代码,由执行引擎读取下一条指令。不会出现OutOfMemoryError情况,也没有GC(垃圾回收) Code: stack=2, locals=4, args_s...

qq_41891244的博客 4792

DC/DC开关电源EMC仿真红宝书

本红宝书系统性介绍开关电源EMC仿真方法,包括仿真原理、仿真思路、仿真工具以及仿真效率提升与仿测一致性的实战经验。从理论到仿真,从仿真到应用,真正帮你实现一文掌握开关电源EMC仿真!全文约14000字,适读人群:开关电源设计、电磁兼容EMC相关从业者,电磁相关专业研究生及CST仿真爱好者等。

电磁学社 2502

快速上手JVM系列(整合篇)

JVM入门必看、类加载机制、JVM内存结构、堆区GC机制,周志明老师深入理解Java虚拟机与尚硅谷JVM教程的整合与理解一、走进Java与JVM二、类加载器与类加载过程三、JVM运行时数据区

2169

树莓派与无人机协同实战:基于OpenCV的地标识别优化策略

本文深入探讨了基于树莓派与无人机的协同系统,重点分享了利用OpenCV优化地标识别以实现精准降落的实战策略。内容涵盖从应对复杂光照的图像预处理、鲁棒的轮廓几何过滤,到通过ROS进行稳定通信,以及实现分层控制与状态机设计,旨在提升系统在真实环境中的可靠性与性能。

y2z3a4b5c的博客 1086

扣子Coze智能体万字教程:从入门到精通,一文掌握AI工作流搭建

智能体 = 角色设定 + 提示词 + 变量输入一个好提示词的核心是结构、风格和复用性创建后可以一键发布成网页应用、对话助手整个过程0代码,只靠配置,人人可学,人人可用四、进阶一:理解「工作流」的威力如果你已经用扣子创建了几个简单的智能体,比如写个爆款小红书文案、生成一段短视频脚本,那恭喜你已经入门。但如果你还停留在“一个智能体 = 一段提示词”的层级,你离真正的智能体生产力革命,还差一步:学会搭建“工作流”——让多个大模型自动协同完成任务。

互联网架构师笔记 3508

Java基础知识总结(绝对经典)

一、Java概述 1991 年Sun公司的James Gosling(詹姆斯·高斯林)等人开始开发名称为 Oak 的语言,希望用于控制嵌入在有线电视交换盒、PDA等的微处理器; 1994年将Oak语言更名为Java; Java的三种技术架构: JAVAEE:Java Platform Enterprise Edition,开发企业环境下的应用程序,主要针对web程序开发; JAVASE:Java Platform Standard Edition,完成桌面应用程序的开发,是其它两者的基础; JA

学Java,找哪吒 2万+

【Dify】36氪新闻热榜智能自动化采集与AI处理

本文介绍如何利用Dify等自动化工具实现36氪新闻热榜的智能采集与处理。通过HTTP请求节点获取数据,JSON解析节点结构化处理,AI处理节点生成智能摘要,最终格式化输出结果。工作流程包含数据获取、解析、AI摘要、文本整理和内容输出五个环节,支持批量化、定制化的新闻处理需求。该方案适用于行业监测、内容创作、舆情管理等场景,显著提升信息获取效率,实现"所需即得"的自动化新闻服务。系统采用OpenAI GPT和Dify API作为核心模型,无需复杂人工干预即可完成全流程处理。

Mr数据杨 600

菜鸟的自我修炼——阿里巴巴一道笔试题浅谈

java菜鸟一枚,各种不会被各种吊打,被吊打多了慢慢也就习惯了。 相信本渣的名言:菜鸟被吊打多了,自然就成为大神了,哈哈,加油,奥力给!!! 回到正题,今天写下我的第一篇博客,讨论的是阿里巴巴之前的一道笔试题, 斗胆拿出来和大家探讨一下,大神看到了请移步啊 大神:卧槽,这么简单的问题你也敢拿来怼文章? 菜鸟:呃……,好吧????,不是我不想怼其他的,实在是因为其他高大上的文章也不会啊...

菜鸟的自我修炼——阿里巴巴一道面试题浅谈 1859

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

浅谈编译原理

什么是编译原理? 编译原理顾名思义,编译就是将源语言(高级程序语言)翻译成等价的目标语言(机器语言即计算机可以识别的语言即0和1或汇编语言)的过程。原理就是研究这一过程的思想方法、理论和技术。从本质上来讲编译是一个算法问题,但由于它的问题相当复杂,导致设计解决这个问题的算法也十分复杂。这里的算法和我们学习的数据结构和算法中的算法有些不同,后者讲述的是基础算法,是解决我们生活中遇到的问题,而编译中...

weixin_30702887的博客 145

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

一、JAVA虚拟机发展史

由于本人对Java虚拟机的发展史本不是很了解,本片文章是学习周志明的《深入理解Java虚拟机 -- JVM高级特性与最佳实践》一书,所记录个人觉得比较有象征意义的或者个人觉得比较有意思的内容照抄下来的,如想了解更多,请学习周志明的这本书的第一部分《走进Java》。 1.1、Classic VM Sun Classic是世界上第一款商用Java虚拟机,1996年1月23日,sun公司发布J...

u012105931的博客 704

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

深入理解JAVA虚拟机

期待已久的分享终于来了,so happy! 今天,公司的CTO做了一次技术分享,主题是JAVA虚拟机的浅谈。是我感兴趣的。 以前一直羡慕BAT那样的公司,在公司内部都会有一些个人的分享。今天,我们公司也开始了这样的事情,这是多么令人兴奋的事情。 虽然只是简单分享,却是个好的开始。原来对j...

chirendan6562的博客 145

java基础知识总结(经典)_Java基础知识总结(绝对经典)

一、前言2012年毕业,2016年转行,没有一个体面的工作,机缘巧合之下,来到了大连,Java培训,一个全新的领域,迷茫、困惑、漫无目的的努力,转行真的被歧视,真的不行吗?我命由我不由天,我觉得我行!相信我,只要你足够努力,总有成为架构师,独挡一面的一天。 二、Java基础语法1、JDK 和 JRE 、final 与 static 、堆和栈2、浅谈Javac编译原理3、BIO、NIO、AIO 介绍...

weixin_36472741的博客 243

Java基础汇总

各类资讯汇总

老苏的一日三浪 466

2019年微服务实践第一课,网易&谐云&蘑菇街&奥思技术大咖深度分享

微服务的概念最早由Martin Fowler与James Lewis于2014年共同提出,核心思想是围绕业务能力组织服务,各个微服务可被独立部署,服务间是松耦合的关系,以及数据和治理的去中心化管理。微服务能够帮助企业应对业务复杂、频繁更新以及团队规模庞大带来的挑战,实现IT对业务创新的驱动。1月12日,网易云主办的“微服务实践沙龙”将走进深圳,邀请业界微服务的先行者,分享落地实践过程中总结的干货经...

weixin_30641465的博客 192

计算机软件扩展阅读

人文科学: 现代逻辑学启蒙[] 逻辑学:知识的基础[] 我的哲学的发展[] 数理哲学引论[] 西方哲学史[] 杜拉拉升职记[] 我的人生哲学[] 蒙田随笔全集[] 世界因你而不同[] 幸福之路[] 少有人走的路[] 罗素自传[] 爱因斯坦全传[] 留德十年[]...

weixin_34363171的博客 173

【JVM基础篇】JVM运行时数据区

本文深入剖析了Java运行时数据区的关键组成部分,包括程序计数器、Java虚拟机栈、本地方法栈、堆内存、方法区以及直接内存的概念与作用。特别强调了程序计数器在控制指令执行流程中的重要性,Java虚拟机栈与本地方法栈在方法调用过程中的数据管理,以及堆内存和方法区在对象存储和类信息保存方面的作用。同时,介绍了直接内存的引入背景及其在提高IO操作效率上的优势,并探讨了JDK7及以后版本中字符串常量池和静态变量存储位置的变化,以及如何通过ByteBuddy框架动态创建类以测试方法区的内存溢出情况。

我只管埋头前行,剩下的交给时间。 1557
上一篇: zookeeper
MWCSD
博客等级 码龄14年 1粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值