JVM详细解析

一篇文章掌握整个JVM,JVM超详细解析!!! 首先先了解电脑是二进制的系统,他只认识 01010101比如我们经常要编写 HelloWord.java 电脑是怎么认识运行的 HelloWord.java是我们程序员编写的,我们人可以认识,但是电脑不认识Java文件编译的过程 因此就需要编译:(这是一个大概的观念 抽象画的概念)这个夸平台是中间语言(JVM)实现的夸平台 java有JVM从软件层面屏蔽了底层硬件、指令层面的细节让他兼容各种系统难道 C 和 C++ 不能夸平台吗 其实也可以 C和C++需要在编译器层面去兼容不同操作系统的不同层面,写过C和C 阅读详情

一、java代码的编译及执行原理

将Java代码通过编译器编译成.class文件,是一个二进制字节码文件,然后再通过解释器,解释成机器码,最后在CPU中进行执行

JVM各组件介绍

CPU(寄存器):记住jvm中下一条指令的执行地址。CPU中的寄存器来当作程序计数器。
特点:
1.是线程私有的
2.不会存在内存溢出
栈:线程运行时,需要的一个内存空间,由一个个栈帧组成,一个栈帧就对应着一个方法的调用,栈帧中主要存储着方法参数,局部变量,返回地址等信息。栈只对于线程是可见的。所以是线程私有,他的生命周期和线程相同。
-Xss 设置大小
思考:
1.栈内存需要垃圾回收进行回收吗?
答:不需要,因为每次方法调用执行完毕后都会弹出栈,自动就释放了

2.栈空间是否越大越好?
答:不是,栈内存的增加会导致执行线程数的减少,因为物理内存的大小是固定的。栈内存的增加也只是能够进行更多次的方法的递归调用

3.方法内的局部变量是否是线程安全的?
答:1.如果局部变量没有逃离方法的作用范围,则是线程安全的
2.如果该局部变量引用了对象,并且逃离了作用范围,则是线程不安全的.

4.什么情况下会导致栈内存溢出?
答:栈帧过多,导致栈内存溢出,比如递归调用,未设置结束条件
栈帧过大,导致占内存溢出,比较少见
第三方库的使用也可能导致,比如fastjson,当两个对象循环引用的时候,调用转json方法就会出现内存溢出问题

补充:虚拟机上定位占用内存过高的线程方法
案例1:CPU占用过多
1.使用 top 命令,查看并找到占用cpu最高的PID
在这里插入图片描述
2.使用命令ps找到具体的线程ID
ps H -eo pid,tid,%cpu | grep 32655
在这里插入图片描述
3.使用jstack命令,跟着进程ID 就可以列出所有的线程
jstack 32655
然后将找到的线程ID32665转换成十六进制,是7F99,然后在打印的线程中去找
在这里插入图片描述
找到后可以看到,具体的哪一行代码出的问题
本地方法栈:不是由java代码编写的方法,因为java代码是有一定的限制的,它不能直接的跟操作系统的底层打交道,所以需要一些用C或C++的方法调用到底层的一些功能

堆:它是线程共享的,堆中对象都需要考虑线程安全问题,通过new关键字创建的对象都会使用堆内存,有垃圾回收机制。堆内存可细分为一个Edon区和Survivor区,Survivor区分为from区和to区,新创建的对象都在Edon区,不同区的GC机制也不相同。
-Xmx设置堆空间大小
堆内存溢出:OutOfMemoryError
堆内存诊断
1.jps工具
可以查看当前系统中有哪些java进程
2.jmap工具
查看堆内存占用情况
3.jconsole工具
图形界面的,多功能的监测工具,可以连续监测
在这里插入图片描述

方法区:它也是线程共享的,主要存储 类的加载信息,常量池,运行时常量池。在JDK 7以前,习惯上把方法区称为永久代(习惯上),而到了JDK8,终于完全废弃了永久代的概念,改用与JRockit、J9一样在本地内存中实现的元空间(Metaspace)来代替。这两个最大的区别就是:元空间不在虚拟机设置的内存中,而是使用本地内存。
常量池:就是一张表,虚拟机指令根据这张常量表找到要执行的类名,方法名,参数类型,字面量等信息
运行时常量池:常量池是*.class文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址

垃圾回收机制

1.判断对象是否可回收

1.引用计数法:

当一个对象被其他对象引用时,计数+1,当不再引用时,计数-1,当计数为0时,该对象就会被回收掉。但是有个问题,当两个对象互相持有对方的引用时,也就是循环引用的时候,这两个对象都不会被回收,即使他们不再使用,这就导致了内存泄漏的问题

2.可达性分析:

首先要确定一系列根对象(GC root对象),根对象是肯定不能被回收的一些对象,在垃圾回收之前,首先会对堆内存中的所有对象进行一遍扫描,然后看每一个对象是否被根对象直接或间接引用,如果是,那么这些对象就不能被回收。

根对象:核心的系统类比如Object类,hashMap类等等,或一些native类,一些活动线程类,或一些正在加锁的对象都可以做根对象

2.引用类型有哪些,与回收有什么关系

强引用:就是我们常用的那些,比如new出来的对象都是强引用对象,垃圾回收时只有该对象不被其他对象直接或间接引用时才会被回收掉。
软引用:软引用在java中有个专门的SoftReference类型,软引用的意思是只有在内存不足的情况下,被引用的对象才会被回收。
弱引用:weakReference和softReference很类似,不同的是weekReference引用的对象只要垃圾回收执行,就会被回收,而不管是否内存不足。
虚引用:PhantomReference的作用是跟踪垃圾回收器收集对象的活动,在GC的过程中,如果发现有PhantomReference,GC则会将引用放到ReferenceQueue中,由程序员自己处理,当程序员调用ReferenceQueue.pull()方法,将引用出ReferenceQueue移除之后,Reference对象会变成Inactive状态,意味着被引用的对象可以被回收了。

3.垃圾回收算法

1.标记清除算法:首先通过可达性分析,将没有被根对象所引用的对象标记出来,然后进行清除。但是会产生内存碎片,一些大的对象会需要一部分连续的存储空间,这样就会导致内存的利用率降低
特点:速度快,但是会产生内存碎片
2.标记整理算法:与标记清除的不同点就在于,会将当前内存使用进行整理,使其更加紧凑,使得回收后也不会有这种内存碎片的情况
特点:速度慢,但是不会产生内存碎片
3.复制算法:有两个一样大小的内存区域,From区和To区,将还在使用的对象复制到To区内存中,然后清空From区的内存空间,然后再交换From区和To区的内容。
特点:它需要占用双倍的内存空间

虚拟机的垃圾回收

实际的垃圾回收不会是采用某一种回收算法,而是针对于不同内存区使用更合适的垃圾回收算法
堆内存大的可以划分为一个新生代,一个老年代,新生代又细分为三个区,一个Edon区,两个survie区,From区和To区。这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。新创建的都对象都是在新生代中,再具体点就是在edon区,当edon区装满了时,就会出发一次Minor GC,先采用可达性分析对堆中对象做一次标记,然后采用复制算法,将edon区和from区存活的对象复制到To区,并且设置年龄为1,每经历一次垃圾回收年龄就会+1。然后再将From区和To区进行交换,当From区中某个对象的年龄达到15时,就会被晋升到老年代中。
minor GC时会引发一次 stop the world,在GC未完成时其他线程都会被暂停,只有GC完成后其他线程才继续执行
随着Minor GC的持续进行,老年代中对象也会持续增长,导致老年代的空间也会不够用,最终会执行Major GC(MajorGC 的速度比 Minor GC 慢很多很多,据说10倍左右)。Major GC使用的算法是:标记清除(回收)算法或者标记压缩算法。当新生代和老年代都满了放不下的时候,就会触发一次full GC

相关VM参数

堆初始大小 -Xms
堆最大大小 -Xmx
新生代大小 -Xmn
-XX:~ 幸存区比例,晋升阈值,晋升详情等


JVM解析 JVM,全称Java虚拟机(Java Virtual Machine),是一种抽象化的计算机,亦是运行Java应用程序的核心组件之一。它提供了一个独立于底层操作系统的运行环境,使得用Java编写的程序能够实现“编写一次,到处运行”的理念。本地方法是指那些在Java程序中声明,但在Java外部实现的方法。这些方法通常用于访问底层系统资源或执行那些Java无法直接完成的操作。本地方法使得Java程序能够与非Java语言编写的代码进行交互,扩展了Java程序的功能。 阅读详情

相关推荐

GoPro官方API实战:从蓝牙配对到Wi-Fi流媒体,构建跨平台控制应用

本文详细解析了GoPro官方API的开发实践,涵盖蓝牙配对、Wi-Fi流媒体控制等关键技术。通过实战案例,指导开发者如何构建跨平台控制应用,解决设备发现、指令解析、视频流传输等核心问题,并分享Android平台迁移经验与常见问题排查方法。

weixin_30727835的博客 396

JVM分析(附GC的有关知识)

一、JVM的基本概念 1.JVM是Java虚拟机,用来保证Java语言跨平台。 2.JVM与Java语言并没有必然的联系,他只与特定的二进制文件格式(class文件格式相关联) 3.JVM就是一个字节码翻译器,它将字节码文件翻译成各个系统对应的机器码,确保字节码文件能在各个系统正确运行。 二、JVM存在的意义 先想一个问题:电脑是怎么认识我们所编写的Java程序的 首先要明白电脑是二进制的系统,它只认识 机器码(二进制编码),例如01010... 比如我们经常要编写 的文件名.java...

hulin的博客 784

orangepi 5 plus ubuntu24.04上安装redroid

OrangePi 5 Plus运行reDroid云手机方案总结 在RK3588+Ubuntu 24.04上部署reDroid(Android容器化方案)的关键步骤: 内核要求:确保启用binderfs(无需ashmem,新版reDroid使用memfd替代); 安装流程: 安装Docker并配置代理加速镜像拉取; 拉取reDroid镜像(推荐Android 12/13 ARM64版本); 通过挂载binderfs启动容器,指定分辨率与DPI参数; 多实例管理: 脚本化创建多个容器(如8个实例),分配独立端口

babytiger的专栏 2284

java jvm 分析简述

java jvm 分析简述。

sxx_gyj的博客 585

LLM大模型基础知识【一】

大语言模型(LLM):是指在自然语言处理(Natural Language Processing,NLP)领域中的一类大模型,通常用于处理文本数据和理解自然语言。这类大模型的主要特点是它们在大规模语料库上进行了训练,以学习自然语言的各种语法、语义和语境规则。例如:GPT系列(OpenAI)、Bard(Google)、文心一言(百度)。视觉大模型:是指在计算机视觉(Computer Vision,CV)领域中使用的大模型,通常用于图像处理和分析。

lin_xi_xi的博客 2869

5种超实用方法:快速获取Windows文件夹下所有文件名(含CMD/PowerShell脚本)

本文详细介绍了5种快速获取Windows文件夹下所有文件名的实用方法,包括图形界面操作、Excel数据导入、CMD命令和PowerShell脚本。特别提供了高效的CMD和PowerShell脚本示例,帮助用户轻松实现文件名的批量获取与管理,大幅提升工作效率。

opencv7vision的博客 447

一篇文章掌握整个JVM,JVM超详细解析

程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经无法访问,程序用不了它们了,对程序而言它们已经死亡),为了确保程序运行时的性能,java虚拟机在程序运行的过程中不断地进行自动的垃圾回收(GC)。GC是不定时去堆内存中清理不可达对象。不可达的对象并不会马上就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行清楚那个对象,即使程序员能明确地判断出有一块内存已经无用了,是应该回收的,程序员也不能强制垃圾收集器回收该内存块。

Admans的专栏 804

西门子 标准程序解读---> 机器手抓取和涂胶控制程序

摘要 该程序实现机械手在OP70/OP90工位的自动化控制,核心功能包括: 流程控制:分段(Seg1-Seg11)管理抓件、涂胶、放件等动作,结合DB1050/DB1250数据块监控工位状态及变位机位置反馈。 安全机制:配置干涉区(FC124)、实时检测安全光/急停信号,防止碰撞;服务程序(FB191)支持维修位触发与安全隔离。 参数配置:通过DB块关联机器人速度、节拍(FB27)、车型编码(如空过=2)及手自动模式(DB70.DBX21.2)。 应用场景:适用于汽车焊接/装配线

工控智联驿站 1238

JVM超详细解析

文章目录一、初始JVM1. JVM 需要了解的三个方面2.常见的虚拟机二、JVM的内存布局1.内存的划分2.和内存区域相关的异常3.根据代码判断该变量在JVM的哪个内存中 一、初始JVM 1. JVM 需要了解的三个方面 a)JVM中的内存布局是怎么样的,它们分别的作用是什么? b)JVM中的类加载的过程是怎么样的,具体步骤? c)JVM中的垃圾回收机制(GC)有什么优缺点,涉及到的回收机制和算法有什么? 下面我们就来一一探讨这三个问题。 2.常见的虚拟机 JVM,说是叫“虚拟机”,但是对比VMware和V

ZJRUIII的博客 1878

数字孪生实战:如何用Blender+Unity快速搭建未来工厂3D模型(附资源包)

本文提供了一套利用Blender进行三维建模,再结合Unity构建虚拟仿真环境的实用方案,旨在帮助中小型制造企业低成本、高效率地搭建未来工厂数字孪生原型系统。文章详细介绍了从数据规划、模型优化到场景构建、逻辑仿真与数据对接的全流程,并附有资源包,助力技术团队快速实现从静态展示到动态交互的数字孪生应用。

weixin_29191669的博客 335

YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 RepViT 轻量级的Vision Transformers架构

本文记录的是基于RepVit的YOLOv11轻量化改进方法研究。RepVit的网络结构借鉴ViT的设计理念,通过分离的token mixe和减少推理时的计算和内存成本,同时减少扩展比率并增加宽度,降低延迟,并通过来弥补参数大幅减少的问题,提高了准确性。本文在替换骨干网络中配置了原论文中的和五种模型,以满足不同的需求。

Limiiiing的博客 2972

【JVM】从零开始深度解析JVM

本篇博客给大家带来的是JVM的知识点, 重点在类加载和垃圾回收机制上.🐎文章专栏: JavaEE初阶🚀若有问题 评论区见❤如果你不知道分享给谁,那就分享给薯条.你们的支持是我不断创作的动力 .王子,公主请阅🚀1. JVM简介1.2 Taobao JVM(国产研发)1.3 JDK JRE JVM三者关系(经典面试题)2. JVM 运行流程★3. JVM运行时数据区(内存区域)3.1 堆(线程共享)3.2 Java虚拟机栈(线程私有)/本地方法栈。

薯条不要番茄酱的博客 3778

Open3D点云数据处理(五):点云、mesh可视化(draw_geometries方法)

本文介绍了Open3D中的draw_geometries可视化方法,可以用于可视化点云和mesh。详细讲述了该方法的各个参数的作用,给出了代码示例。

孙悟空 3136

【JVM】JVM07(类加载阶段详细解析)

类加载阶段详细解析,值得收藏

wenwenaier的博客 2278

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JVM深入解析

本文深入解析Java虚拟机(JVM)的基础架构和垃圾回收机制。JVM作为Java程序运行的核心环境,负责字节码执行、内存管理、安全控制和异常处理,其跨平台特性基于字节码中间层和平台特定JVM实现。文章详细分析了JVM运行时数据区域,包括线程私有的程序计数器、虚拟机栈和本地方法栈,以及线程共享的堆内存(分新生代、老年代)。特别介绍了垃圾回收机制中对象分配策略,如大对象直接进入老年代的优化方式。-XX:PretenureSizeThreshold参数可调整大对象分配阈值。

weixin_54879811的博客 1125

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

一篇文章掌握JVM,JVM超级详细解析!

程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经无法访问,程序用不了它们了,对程序而言它们已经死亡),为了确保程序运行时的性能,java虚拟机在程序运行的过程中不断地进行自动的垃圾回收(GC)。GC是不定时去堆内存中清理不可达对象。不可达的对象并不会马上就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行清楚那个对象,即使程序员能明确地判断出有一块内存已经无用了,是应该回收的,程序员也不能强制垃圾收集器回收该内存块。

Tirut的博客 1395

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

总结JVM常量池解析

目录 constantPoolOop初始化 解析 类元素解析 方法元素解析 字符串元素解析 JVM要解析常量池里的数据,就要先进行内存分配,为常量池划分出一块内存空间,分配的空间需要多大?从哪里划出一片内存,这些在前面的日志里有总结过,在分配链路里有专门的函数根据常量池里的元素数量计算出需要的大小length,为常量池constantPoolOop对象分配的headSize(对象头)+length大小内存区域位于JVM的永久区permanent区,是一片连续的区域,最后进行清零等内存...

大力海棠的博客 779

JVM的类加载机制超详细解析

JVM的类加载机制全面解析 什么是类加载机制 JVM把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被JVM直接使用的Java类型,这就是JVM的类加载机制。 类的生命周期 类从被加载到内存中,到被卸载出内存,一共分为以下几步: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 初始化...

culous的博客 604

JVM完整深入解析

https://segmentfault.com/a/1190000014395186

u010730870的博客 251

JVM完全解析

一、概述 JVM,全称Java Virtual Machine,就是java虚拟机,是一台虚构的机器,或者软件,用来执行虚拟计算指令;jvm是一种程序虚拟机,执行的是 .class字节码文件里面的字节码指令,现在使用最多的是java虚拟机是Hotspot虚拟机。 二、JVM的结构 由类加载子系统(ClassLoader)、运行时数据区、执行引擎、内存回收系统这四个部分组成。 ...

jcgaogs的博客 242
上一篇: poi-tl的使用(最全详解)
下一篇: mysql-JPA对数据库中JSON类型数据的支持
Sonk.
博客等级 码龄8年 84粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sonk.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值