jvm梳理

news2024/12/25 12:54:32

jvm是一个虚拟机,用于运行java代码,类的编译到运行主要为一下:

通过javac.exe编译,产生class文件,然后通过类加载器加入jvm:

类加载器

引导加载器:使用c++编写,负责java的核心库,只能底层调用,无法直接获取。

扩展加载器:在jdk\bin\ext文件下,拓展的jar包,

系统加载器:最常用的加载器,它负责加载用户路径(ClassPath)上所指定的类库。我们自己编写的代码以及使用的第三方的jar包都是由它来加载的。

自定义加载器:就是我们自己编写的类。

类加载器有一个很重要的机制:

双亲委派机制

是为了程序的安全产生的,他的效果是:

会一直委派到最底层的加载器:

引导加载器<——扩展加载器<——系统加载器<——自定义加载器<——代码

然后一级一级寻找类,为什么这样可以保证安全?

因为:很多类都是已经写好的了(String),非常多的工具、框架中都使用了这个类,如果有一天,我自己也写了这样一个类(String),名字和它一模一样,那么,程序到底用谁的类呢?

所以双亲委派机制解决了这个问题,程序直接用原来的类,因为从逻辑上知道,这个类是对的。

虚拟机栈:

里面主要存放:对象引用地址+8大基本类型+局部变量+实例方法

存放程序的执行步骤,为什么要怎么说呢?

我们都知道,main方法是最先执行的,那么,它到底什么时候结束的呢?我想这个问题大家都知道,main方法是最后结束的,所以这就说明了,程序调用时用栈实现的。

  本地方法栈:

存放调用的本地接口方法,如果大家查看过多线程的类,会发现,底层开启线程并不是java实现的,调用了一个方法:

native就是用来标记该方法为调用本地方法,也就是本地的c++方法,所以jvm的底层其实就是c++。

然后我们就来说一下堆:

这玩意就是jvm核心的地方,也是最麻烦的地方

堆中包含如下:

堆中主要存放实力对象!

 新生代,老年代,伊甸园、幸存区是啥呢?

新生代指的是在程序运行时,创建的类,会被GC垃圾清理机制清理掉,而老年代指的是有些类经常使用,不会被清理。

一旦这个类多次被使用了,就会放去幸存区,如果再多次调用,就会放去老年区。

也就是说,伊甸园>幸存区,GC优先清理伊甸园,GC清理机制分为普通清理加强清理,当普通GC清理不了的时候,就调用加强GC清理。所以中99%的垃圾处理都在堆中处理,栈中是不会存在的,因为栈一旦使用,就出栈了。

GC清理机制用白话说挺简单,就是判断改类是否被用,一个类被调用时,栈就会指向它,是一个双向,类似双向链表,所以一旦为null,就可以回收啦~

方法区:主要放static修饰的变量,方法,final常量,类的信息

这里还有一个知识点,堆、方法区是线程共享的,谁都可以调用,也就是为什么,static全部地方都可以使用。

程序计数器:

看到这个,我就想起了cpu也有这玩意,用来记录执行的指令,它们都是一样的效果,这玩意也是拿来保存指令,记录下一条指令是啥。

 然后就是写过递归的同志都遇见过的报错:StackOverFlowError栈溢出

这玩意就是调用过多的方法,导致栈爆满,一般情况都是死递归调用,闭环。

还有一个就是学习的时候根本遇不到,只能刻意的创建(因为学习肯定不会创建这么多的对象)

StackOverFlowError内存溢出,因为对象创建太多了,堆都装满了,死循环new对象。。。。

解决办法就是先提高堆的内存,看看是否再次报错,用idea就是如下:

 然后就是导出dump文件,使用jprofiler软件查看,具体看视频: 

9、使用JPofiler工具分析OOM原因_哔哩哔哩_bilibili

 

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

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

相关文章

【高项】项目绩效域,信息文档配置与变更,标准与规范管理(第4版教材第18-19,24章,项目规范知识)

文章目录 1、配置与变更管理1.1 信息文档1.2 配置管理1.3 变更管理 2、标准规范&#xff08;合同管理&#xff0c;知识产权&#xff09;2.1 合同管理2.2 知识产权和标准规范&#xff08;合同法&#xff0c;招投标法&#xff0c;著作权法&#xff0c;政府采购法&#xff09;2.3 …

力扣算题Day17

110.平衡二叉树(递归很难理解,思维很重要) 下面才是做二叉树的一种正确思维&#xff1a; copy他人运行代码&#xff1a; class TreeNode:def __init__(self, val0, leftNone, rightNone):self.val valself.left leftself.right right class Solution:def judgeDepth(self, …

自底向上分析概述

4-8自底向上的分析概述_哔哩哔哩_bilibili &#xff08;开始准备期末考试&#xff09;&#xff08;可菜&#xff09; 移入-规约分析&#xff1a; 每次归约的符号串称为“句柄”&#xff0c;一旦句柄在栈顶形成&#xff0c;我们立即将它规约&#xff0c;因此每一步规约都是最左…

[JAVA EE]创建Servlet——继承HttpServlet类笔记2

创建Servlet的方式之一&#xff1a;继承HttpServlet类&#xff08;经常使用&#xff09; 如果请求方式为get请求则调用doGet()方法; 如果请求方式为post请求则调用doPost()方法。 开发中通常不会在两个方法中写重复的代码&#xff0c;会造成代码冗余。 Request 一、获取请求…

[前端基础]websocket协议

(1)websocket websocket(简写为ws),是一种轻量化的协议,经过最开始的握手阶段以后,前后端之间允许自由地发送信息不受限制(建议发送json字符串).虽然理论上这个东西是属于协议内容,但是已经被疯狂封装得像框架一样了. websocket协议具有天然的优势处理前端多线程并发,并且只需…

Android---Glide的基本使用

目录 Glide 基本使用 Glide 进阶 Glide 是一个快速高效的 Android 图片加载库&#xff0c;可以自动加载网络、本地文件&#xff0c;app 资源中的图片&#xff0c;注重于平滑的滚动。 Glide 第一次加载一张图片后&#xff0c;就会自动帮我们把这张图片加入到内存中进行管理。…

Linux内核同步之RCU机制基础

Why RCU 1. 中断与抢占 当一个进程被时钟中断打断后&#xff0c;kernel运行tick中断处理程序&#xff08;一般是top half&#xff09;&#xff0c;中断处理程序运行结束后&#xff0c;有两种情况&#xff1a; 之前的进程获得CPU继续运行。 另一个进程获得了CPU开始运行&…

AI智慧安监:打电话/玩手机智能检测,构筑安全生产新防线

1、方案背景 在油库、加油站、化工厂等场景中&#xff0c;安全生产是首要的监管问题&#xff0c;因为有易燃物品的存放&#xff0c;打电话很容易引起火灾爆炸等安全事故&#xff0c;造成巨大的生命和财产损失。因此&#xff0c;对人员行为的监管是安全的关键&#xff0c;在一些…

计算机图形学 | 实验六:旋转立方体

计算机图形学 | 实验六&#xff1a;旋转立方体 计算机图形学 | 实验六&#xff1a;旋转立方体Z-缓冲GLM函数库PVM矩阵PVM矩阵的使用 华中科技大学《计算机图形学》课程 MOOC地址&#xff1a;计算机图形学&#xff08;HUST&#xff09; 计算机图形学 | 实验六&#xff1a;旋转…

怎么看待QA(软件测试)漏测bug?

先抛出我的2个观点&#xff1a; 1、漏测不一定是测试的锅。但当问题发生时&#xff0c;测试第一时间不要去拒绝推卸责任&#xff0c;而是要先去解决漏测问题。 2、漏测问题的及时处理很重要&#xff0c;但是避免再次漏测更重要。 为了将此问题阐述的更清楚&#xff0c;我将通过…

SSM框架学习-DI依赖注入方式实例

DI依赖注入&#xff1a;依赖注入&#xff08;Dependency Injection, DI&#xff09;是一种设计模式&#xff0c;用于将一个对象所需要的其他对象的引用或依赖关系从代码中解耦出来&#xff0c;将其交由某个第三方来管理&#xff0c;使得对象本身更加独立&#xff0c;便于测试和…

使用读写锁提高并发

我们想要的是&#xff1a;允许多个线程同时读&#xff0c;但只要有一个线程在写&#xff0c;其他线程就必须等待。 ReadWriteLock ReadWriteLock的作用&#xff1a; 只允许一个线程写入&#xff08;其他线程既不能写入也不能读取&#xff09;&#xff1b;没有写入时&#xf…

基于深度学习的三维重建网络PatchMatchNet(三):如何利用patchmatchnet完成自己场景的数据集制作与利用自己的数据完成三维重建工作

目录 1.如何使用本篇博客 1.1 patchmatchnet网络环境配置 1.2 colmap环境配置 2.如何利用colmap制作自己的三维重建数据集 2.1 采集数据 2.2 使用colmap计算位姿 2.3 转换位姿到MVS读取的格式 2.4 剔除离群图片 2.5 运用patchmatchnet进行三维重建 1.如何使用本篇博客 …

【MySQL】简单使用

数据库&#xff1a;文件&#xff0c;管理系统 类别&#xff1a;关系型&#xff0c;非关系型&#xff08;nosql&#xff09; C/S模式&#xff08;客户端服务器&#xff09; mysql登录 用户名&密码 默认管理员&#xff1a;root 登录&#xff1a;Linux管理员身份运行客户…

为什么二极管具有单向导通性

大家都知道二极管具有单向导通性&#xff0c;比如一个双极性的信号通过二极管后会变成一个单极性的信号。 为了弄清这个问题先来看一下二极管的构成。 在纯净的硅晶体中掺入五价元素&#xff0c;比如磷&#xff0c;就形成了N型半导体&#xff0c;掺入的五价元素多余的电子很容…

汉明码简单计算方法

正算 看一张图 其中标绿底色的为汉明码校验位&#xff0c;可以发现&#xff0c;这些位置的2进制里面只有一个1&#xff0c;其他位上都是0。 先说结论&#xff1a;校验位上的1在第几个位上&#xff0c;就会用来保证位置的2进制里面该位上为1的位置上的1的个数为偶数。 比如&…

11_Uboot启动流程_3

目录 run_main_loop函数详解 cli_loop函数详解 cmd_process函数详解 run_main_loop函数详解 uboot启动以后会进入3秒倒计时,如果在3秒倒计时结束之前按下按下回车键,那么就,会进入uboot的命令模式,如果倒计时结束以后都没有按下回车键,那么就会自动启动Linux内核,这个功能…

MySQ ---- 函数

函数 函数是指一段可以直接被另一段程序调用的程序或代码。MySQL 内置了很多函数&#xff0c;开发人员只需要调用使用即可。查询语句中已经使用过了一些聚合函数。下面还有些常用的函数需要掌握。 函数应用场景举例 函数的分类 ① 字符串函数 ② 数值函数 ③ 日期函数 ④ 流程…

chap和ppp认证配置+MGRE实验

题目要求 1.R2为ISP&#xff0c;其上只能配置IP地址 2.R1-R2之间为HDLC封装 3.R2-R3之间为ppp封装&#xff0c;pap认证&#xff0c;R2为主认证方 4.R2-R4之间为ppp封装&#xff0c;chap认证&#xff0c;R2为主认证方 5.R1,R2,R3构建MGRE环境&#xff0c;仅R1的IP地址固定 6.内…

OpenPCDet系列 | 4.KITTI数据集数据加载流程代码解析

文章目录 数据加载流程0. create_kitti_infos1. __getitem__函数2. prepare_data函数3. collate_batch函数数据加载流程 这里记录一下具体用到的那些数据形式,整个kitti数据集的处理框架图如下所示: 在数据集处理到获取一个batch数据的整个流程的入口如下: # 开始迭代每…