JVM-满老师

JVM

  • 前言
  • 程序计数器,栈,
    • 虚拟机栈:
    • 本地方法栈:
    • 堆,方法区:
      • 堆内存溢出
      • 方法区
      • 运行时常量池
    • 垃圾回收
    • 垃圾回收算法
      • 分代回收

前言

在这里插入图片描述
在这里插入图片描述
JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机
在这里插入图片描述

程序计数器,栈,

程序计数器:作用,是记住下一条jvm指令的执行地址
线程私有的,不会存在内存溢出

虚拟机栈:

不需要垃圾回收
栈内存分配不是越大越好,越大,能分配的线程数会变少
在这里插入图片描述
活动栈帧,栈顶的那个栈帧(正在执行的那个方法)
在这里插入图片描述

栈内存溢出
栈帧过多导致栈内存溢出
比如递归方法反复调用自己,没有临界条件,只有一直入栈,没有出栈释放
在这里插入图片描述
栈帧过大导致栈内存溢出

本地方法栈:

本地方法,native method,不是有Java语言编写的代码,由C、C++编写的,本地方法调用的时候就放在本地方法栈

在这里插入图片描述

堆,方法区:

通过 new 关键字,创建对象都会使用堆内存
特点
它是线程共享的,堆中对象都需要考虑线程安全的问题
有垃圾回收机制

堆内存溢出

大量对象占据了堆空间,这些对象都持有强引用导致无法回收

解决办法

  • 使用Xmx参数指定一个更大的堆空间;
  • 由于堆空间不可能无限增长,分析找到大量占用对空间的对象,在应用程序上做出优化;

在这里插入图片描述
还有jvirsualvm

方法区

在这里插入图片描述
方法区(Method Area)被所有线程共享,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

运行时常量池

  • 常量池,就是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息

  • 运行时常量池,常量池是 *.class 文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址

StringTable:

  • 常量池中的字符串仅是符号,第一次用到时才变为对象,用串池Stringtable(串池)的机制,来避免重复创建字符串对象
  • 字符串变量拼接的原理是 StringBuilder视频说明:s1+s2
  • 符串常量拼接的原理是编译期优化{“a"+“b”}

垃圾回收

1.可达性分析算法

  • Java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象
  • 扫描堆中的对象,看是否能够沿着 GC Root对象 为起点的引用链找到该对象,找不到,表示可以回收

在这里插入图片描述

  1. 强引用
    只有所有 GC Roots 对象都不通过【强引用】引用该对象,该对象才能被垃圾回收

  2. 软引用(SoftReference)
    仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次出发垃圾回收,回收软引用对象,可以配合引用队列来释放软引用自身

  3. 弱引用(WeakReference)
    仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象,可以配合引用队列来释放软引用自身

  4. 虚引用(PhantomReference)
    必须配合引用队列使用,主要配合 ByteBuffer 使用,被引用对象回收时,会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法释放直接内存
    视频3分钟处:

  5. 终结器引用(FinalReference)
    无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由 Finalizer 线程通过终结器引用找到被引用对象并调用它的 finalize方法,第二次 GC 时才能回收被引用对象

垃圾回收算法

  • 标记清除(速度较快但会造成内存碎片)
  • 标记整理(无内存碎片但速度较慢)
  • 复制(不会有内存碎片需要占用双倍内存空间)

分代回收

在这里插入图片描述

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

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

相关文章

虫情测报灯如何实现自动化测报?

一、KH-CQPest虫情测报灯的工作过程 虫情测报灯是新一代的图像式虫情测报智能设备,在农业虫害防治领域拥有独特魅力,它内置高像素的摄像头,能够精准记录并将照片上传至智慧农业平台识别害虫的形态、种类。虫情测报灯运用现代光电数控集成技术…

【案例】从kaggle的房价预测模型案例中了解深度学习模型,即如何学习深度学习模型

1、背景 深度学习是什么,为了解决什么样的问题 深度学习是一种机器学习的方法,它的主要目的是从数据中自动学习到有效的特征表示。深度学习通过多层的特征转换,把原始数据变成更高层次、更抽象的表示。这些学习到的表示可以替代人工设计的…

领域驱动设计

今天我们来聊聊领域驱动设计(Domain Driven Design,即 DDD)。 说起业务建模,领域驱动设计是一个绕不过去的话题。自从 Eric Evans 在2000后发布他的名著“Domain Driven Design:Tackling the Complexity in the Heart …

Netty(四)NIO-优化与源码

Netty优化与源码 1. 优化 1.1 扩展序列化算法 序列化,反序列化主要用于消息正文的转换。 序列化:将java对象转为要传输对象(byte[]或json,最终都是byte[]) 反序列化:将正文还原成java对象。 //java自带的序列化 // 反序列化 b…

SpringBoot自带模板引擎Thymeleaf使用详解①

目录 前言 一、SpringBoot静态资源相关目录 二、变量输出 2.1 在templates目录下创建视图index.html 2.2 创建对应的Controller 2.3 在视图展示model中的值 三、操作字符串和时间 3.1 操作字符串 3.2 操作时间 前言 Thymeleaf是一款用于渲染XML/HTML5内容的模板引擎&am…

[unity]保存文件的路径设置

序 比如,序列化了一个数组,保存到磁盘上。 原来的路径是"D://test.bin",能跑,但是有点问题:序列化出来的文件和原项目离的太远,不好管理。 要是能保存到unity工程的文件夹里就好了。这个路径该…

学习记忆——方法篇——整除特点

理解记忆法 对于数的整除特征大家都比较熟悉:比如4看后两位(因为100是4的倍数),8看后三位(因为1000是8的倍数),5末尾是0或5,3与9看各位数字和等等,今天重点研究一下3,9,…

毕设-原创医疗预约挂号平台分享

医疗预约挂号平台 不是尚医通项目,先看项目质量(有源码论文) 项目链接:医疗预约挂号平台git地址 演示视频:医疗预约挂号平台 功能结构图 登录注册模块:该模块具体分为登录和注册两个功能,这些…

小样本学习——匹配网络

目录 匹配网络 (1)简单介绍: (2)专业术语 (3)主要思想 (4)训练过程 问题 回答 MANN 匹配网络 (1)简单介绍: Matching netwo…

647. 回文子串

题目描述 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成&#xff0c…

css 实现相关案例

css 实现相关案例 抽屉案例(带吸附箭头) <template><div class"container"><div class"main-box"><div class"left-box">左边盒子</div><!--下面两种方式皆可实现展示和隐藏 --><div :style"{ f…

SpringBoot 如何进行参数校验?

在Spring Boot中进行参数校验通常是使用JSR 303规范&#xff08;也称为Bean Validation&#xff09;的注解和Spring的Validation API来完成的。以下是一些常见的步骤和示例&#xff0c;用于在Spring Boot应用程序中进行参数校验&#xff1a; 添加依赖&#xff1a; 首先&#xf…

创新家庭办公室:打造完美工作空间的秘诀

一个精心策划的家庭办公室有很多好处&#xff0c;何不把临时工作区升级改造为你的专属工作区呢&#xff0c;还能为这些至关重要的区域注入新的活力。 创造多用途的起居室&#xff1a;我们大多数人都不曾拥有一个可以完全根据工作需求设计的独立家庭办公室——所以有时候要找到…

【锁的区别】C++线程库和POSIX线程库锁的区别

C线程库和POSIX线程库锁的区别 C线程库代码段的互斥&#xff1a;mutex、recursive_mutex、timed_mutex、recursive_timed_mutex互斥量mutex&#xff1a;直接进行lock()或者unlock()递归互斥锁recursive_mutex&#xff1a;可以多次加锁&#xff0c;意味着加几次锁就需要解几次锁…

【C++】:类和对象(2)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux的基础知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…

netcore Polly.Core

一、安装包 <PackageReference Include"Polly.Core" Version"8.0.0" /> 二、编写重试 ResiliencePipeline pipeline new ResiliencePipelineBuilder().AddRetry(new RetryStrategyOptions{MaxRetryAttempts 2,Delay TimeSpan.FromSeconds(3),O…

王杰国庆作业day6

服务器 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <my_head.h> #define PORT 2324 //端口号 #define IP "192.168.10.107" //本机IP int main(int argc, const char *argv[]) {sqlite3* d…

【JavaEE】JUC(Java.util.concurrent)常见类

文章目录 前言ReentrantLock原子类线程池信号量CountDownLatch相关面试题 前言 经过前面文章的学习我们大致了解了如何实现多线程编程和解决多线程编程中遇到的线程不安全问题&#xff0c;java.util.concurrent 是我们多线程编程的一个常用包&#xff0c;那么今天我将为大家分…

QT 实现 TCP 客户端服务器代码

服务器 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> //服务器头文件 #include<QTcpSocket> //客户端头文件 #include<QList> //链表容器 #include<Q…

Vue2插槽的简单使用示例

插槽-slot 基本使用作用域插槽具名插槽 1. 基本使用 比较简单, 比如: <template> <a :href”url”> <slot :slotData”website”>xxxx</slot> </a> </template> 父页面使用--不用获取slotdemo组件里面的数据的时候: <slotDemo :u…