JVM知识点

2023-11-17

概念

Java虚拟机——模拟cpu执行指令的一个程序。

JDK、JRE、JVM关系
在这里插入图片描述

java内存模型

在这里插入图片描述

线程私有

程序计数器:程序计数器是一块比较小的内存区域,可看做当前线程执行字节码的行号指示器.是线程隔离的
JVM虚拟机栈每个方法执行的同时会创建一个栈帧用于存储局部变量、操作数栈、动态链接、方法出口等信息。每一个方法从调用直到执行完成的过程,就对应一个栈帧在虚拟机中入栈和出栈的过程。入栈:方法调用。 出栈:方法返回。是线程隔离的

  • 和线程相关,不同线程内,即使运行同一个方法,也是处于不同内存。
  • 和方法相关,即使是同一个线程,递归调用某个方法,每次调用都会生成该此方法调用的栈帧。

此区域一共会产生以下两种异常:

  • 如果线程请求的栈深度大于虚拟机所允许的深度(-Xss设置栈容量),将会抛出StackOverFlowError 异常。–递归返回逻辑有问题
  • 虚拟机在动态扩展时无法申请到足够内存会抛出OOM(OutOfMemoryError)异常。—内存溢出

内存溢出和内存泄漏

  • 内存溢出:线程调用方法,创建方法该次调用的栈帧,内存不足抛出OOM。应用程序中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存,此时程序运行不了,系统提示内存溢出(进程会挂掉,情况严重)
  • 内存泄漏:程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
  • 一般出现内存泄漏的情况:长生命周期存活的对象,内部持有不使用对象的引用,导致不使用的垃圾对象无法回收
  • 一般经常出现内存泄漏的例子:在使用长期存活的数据结构、数组时,都要考虑对象的引用导致内存泄漏的问题

本地方法栈
调用java方法,就是创建栈帧,放在线程的java虚拟机栈中。
调用其他语言的函数,就是使用本地方法栈

线程共享区域——存在GC

java堆:在JVM启动时创建,所有的对象实例以及数组都要在堆上分配,如果在堆中没有足够的内存完成实例分配并且堆也无法再扩展时,抛OOM(内存溢出)

在这里插入图片描述

方法区/元数据区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。此区域内存的回收主要针对常量池的回收以及类型的卸载,当方法区无法满足内存分配需求时,抛OOM

运行时常量池:编译期及运行期间产生的常量被放在运行时常量池。这些所说的常量包括:基本类型、包装类(包装类不包括浮点型,整形只会管理-128~127),类加载时会查询字符串常量池,以保证运行时常量池所引用的字符串与字符串常量池中一致

class文件常量池:class文件除了有类的版本、字段、方法、接口等描述信息,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,类加载后进入

直接内存:在JDK 1.4中新加入NIO(New Input/Output)类,引入了一种基于管道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在java堆中的DirectByteBuffer对象作为这块内存引用进行操作,这样能在一些场景中提高性能,避免在java堆和Native堆来回复制。直接内存不会受java堆大小限制,但既然是内存,肯定会受到本机总内存(包括RAM及Swap区或分页文件)大小以及处理器寻址空间的限制,也可能导致OOM

类加载

jvm类加载过程:

在这里插入图片描述

类加载机制——双亲委派模型

class字节码文件需通过 类加载器 来加载到java进程的内存。

在这里插入图片描述
双亲委派模型:就是基于4种类加载器,按照从上到下的顺序,来加载类。
因为类加载只执行一次,所以,上边的找到,下边就不执行加载;没有找到,就交给下—级的加载
优点: 安全
在这里插入图片描述

垃圾回收GC

概念

java语言,是不用程序员自己分配内存,也不用自己回收内存===>原因: jyvm中,实现了垃圾回收的机制(自动回收)
需进行GC的内存区域堆、方法区

什么是垃圾

在这里插入图片描述

如何判断一个对象是垃圾?有两种算法

1.引用计数算法

在这里插入图片描述

2.可达性分析算法——JVM采取

在这里插入图片描述

垃圾回收算法

新生代/老年代

在这里插入图片描述
什么时候发生gc?
对象进入哪个区域(新生代还是老年代),如果该区域空间不足,就会触发该区域的gc

两个gc的特性:
新生代gc:又叫minor gc,采取复制算法,效率比较高
老年代gc: 又叫major gc,采取标记清除/标记整理算法,效率比较差,一般比新生代gc慢10倍以上

1.标记清除算法——老年代回收算法

在这里插入图片描述

⒉复制算法——新生代的回收算法

将某个内存区域,划分为两块大小相同的空间,每次只使用其中一个,回收就是把存活对象复制到另一个不用的空间,清除之前使用的空间。

在这里插入图片描述
使用场景: 大多数对象,具有朝生夕死的特性。
说明:比如很多方法调用,在方法中使用局部变量=new对象,方法执行完,对象就是垃圾了

在这里插入图片描述

3.标记整理算法——老年代的回收算法

过程:

  • 标记
  • 整理:把存活对象往一端移动,然后清理掉端外的空间

在这里插入图片描述

4.分代回收算法——jvm中,采取的算法

内存(堆)划分为新生代(E区 * 1+S区 * 2)和老年代。
新生代采取 复制算法,老年代采取 标记清除/标记整理算法。

垃圾回收器

垃圾回收工作,是由垃圾回收线程(它是守护线程=>一个进程中,还存在非守护线程,进程就不会结束)
概念区分:
(1)可达性分析算法=>判断对象是否是垃圾
(2)垃圾回收算法=>回收垃圾,采取的算法
(3)垃圾回收线程=>垃圾回收工作,就是在垃圾回收线程中执行的
(4)垃圾回收器=>名词,类似开垃圾车的师傅

关联: 在垃圾回收线程中,使用垃圾回收器(垃圾车师傅),先找到垃圾(可达性分析算法),再回收垃圾(采取了什么垃圾回收算法)

前置知识:

在这里插入图片描述

jvm中经典的垃圾回收器

在这里插入图片描述
各个收集器大致介绍:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM知识点 的相关文章

随机推荐

  • pytorch 中register_buffer()

    今天在看DSSINet代码的ssim py时 遇到了一个用法 class NORMMSSSIM torch nn Module def init self sigma 1 0 levels 5 size average True chann
  • Docker网络体系结构:设计可扩展、可移植的Docker容器网络

    原文地址 译者 本人翻译水平有限 目的仅是为了学好Docker 如有错误请见谅 翻译版本 v1 01 将不断优化翻译质量 本文包含以下内容 Docker容器就是将应用及其所依赖运行环境的完整文件系统打成一个包 包括所需代码 运行库 系统工具
  • 一文读懂人脸识别技术

    2019 08 27 17 06 26 本文内容涵盖人脸识别发展历程 市场研究 核心技术 商业应用以及产业落地 个人看法等干货研究 注意 本文干货满满 约有2万7千字 强烈建议大家先收藏后学习 01 发展史 1 人脸识别的理解 人脸识别 F
  • DJANGO增删改查

    https www cnblogs com yuanlianghong p 10987877 html 一 Django的工作流 1 用户通过浏览器输入相应的 URL 发起 HTTP 请求 一般是 GET POST 2 Django 接受到
  • 微信小程序:初识微信小程序和前端

    一 前期准备工作 1 申请开发微信小程序 登录微信公众平台 gt 点击 小程序 gt 点击 前往注册 gt 注册成功即可 2 下载微信开发者工具 小程序文档 gt 工具中的下载 gt 下载自己需要的版本 3 在开发者工具中创建项目 这个当中
  • RabbitMQ的高级特性

    RabbitMQ的高级特性 在项目中 有一些无需即时返回且耗时的操作 我们可以将其提取出来 做异步处理 从而节省服务器的请求响应时间 从而提高系统的吞吐量 这就需要使用到MQ 而常见的RabbitMQ就是重中之重 之前说了他的几个常见的用处
  • WebSocket 的使用,和客户端断电,服务器检测断开连接

    WebSocket 的使用 和客户端断电 服务器检测断开连接 服务器用WebSocketServlet 实例化自定义的MessageInbound web xml中配置socket
  • ext4 buddy块分配算法源码剖析

    概述 ext4 buddy块分配算法的函数是ext4 mb regular allocator 阅读本文之前需要先看下ext4 mballoc之buddy算法 nginux的博客 CSDN博客 ext4 mb regular allocat
  • YoloV8改进策略:轻量级的CloFormer助力Yolov8在速度和精度上实现双双提升

    文章目录 摘要 论文翻译 摘要 1 简介 2 相关工作 3 方法 3 1 总体架构 3 2 AttnConv 3 3 不同的局部感知方式 3 4 实现细节 4 实验 4 1 ImageNet1K分类 4 2 COCO目标检测 4 3 ADE
  • C 实现Window/DOS 键盘监听事件

    今天是重新复习C语言实现的第一天 今天想编写C 对Windwos Dos 键盘事件的学习 但是我在安装Visual Studio 2022 没有安装MFC 框架 今天记录下VS 追加 MFC框架 Visual Studio 2022 追加M
  • 基于opencv3的人脸检测

    目前opencv3中已经有人脸检测的类了 只要调用函数库的类就行 该程序需要两个xml文件 分别是haarcascade frontalface alt xml和haarcascade eye tree eyeglasses xml 它们分
  • php安装部署及优化

    目录 PHP源码编译 php启动与nginx整合 php功能模块的扩展 php添加memcache功能模块 构建Nginx高速缓存 tomcat结合memcache PHP源码编译 https www php net 下载软件包 安装解压工
  • 【下资源】全网独家首发2014传智播客三层架构及餐饮管理系统项目

    核心技术课程 三层架构原理 手写三层 自己动手代码生成器 商业级代码生成器 三层架构应用案例 NPOI MD5 WinForm高级应用 常用WinForm相关设计模式 数据库设计工具PowerDesigner高级应用 源代码管理 团队配合做
  • 【更新中…】Matlab simulink建模与仿真

    本文为学习笔记 视频来源 https www bilibili com video BV1L7411a7uL Matlab simulink建模与仿真 1 初始simulink 1 1 simulink简介 1 1 1 matlab与sim
  • error: static assertion failed: Type is not registered, please use the Q_DECLARE_METATYPE macro to m

    error static assertion failed Type is not registered please use the Q DECLARE METATYPE macro to m 解决方案 报错信息如下 调用了类的静态函数导
  • 【docker】CMD ENTRYPOINT 区别 终极解读!

    昨天用Dockerfile来启动mongodb的集群 启动参数 replSet死活没执行 最后就决定研究一哈cmd和entrypoint 但是上网看了一些资料个人觉得讲的不好 还是没有说出根本的东西 决定自己研究并且整理一哈 首先上dock
  • Linux系统下使用socat将串口映射到TCP服务器端口

    首先需要安装socat 安装方法即是 apt get install socat 或 yum install socat 然后使用以下命令进行映射 socat TCP LISTEN 8899 fork reuseaddr FILE dev
  • 华为OD机试 - 可以组成网络的服务器(Java)

    题目描述 在一个机房中 服务器的位置标识在 n m 的整数矩阵网格中 1 表示单元格上有服务器 0 表示没有 如果两台服务器位于同一行或者同一列中紧邻的位置 则认为它们之间可以组成一个局域网 请你统计机房中最大的局域网包含的服务器个数 输入
  • Java进阶知识

    今天分享有关java方面的知识 Paradigm 除了Java语言基础 通常在每种语言中还有很多paradigm 这些paradigm往往是衡量老鸟和新手的地方 比如函数命名 异常处理 泛型等等 下面用异常处理的两种类型来说明 笔者见过很多
  • JVM知识点

    JVM知识点 概念 java内存模型 线程私有 内存溢出和内存泄漏 线程共享区域 存在GC 类加载 类加载机制 双亲委派模型 垃圾回收GC 概念 如何判断一个对象是垃圾 有两种算法 1 引用计数算法 2 可达性分析算法 JVM采取 垃圾回收