【JVM】总结篇-运行时内存篇

文章目录

    • JVM内存模型(内存结构)
      • 程序计数器 pc
      • 虚拟机栈
      • 本地方法栈 native
        • 堆空间
        • 堆中一些JVM参数
        • 堆中垃圾回收过程
        • MinorGC MajorGC FullGC
          • 年轻代GC(Minor GC)触发机制:
          • 老年代GC(Major GC/Full GC)触发机制:
          • Full GC触发机制:
        • OOM解决?
      • 方法区
      • 直接内存
      • StringTable

JVM内存模型(内存结构)

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

程序计数器 pc

在这里插入图片描述
它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。执行引擎的字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。

JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。

  • 它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。不会随着程序的运行需要更大的空间。

  • 在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。

  • 它是唯一一个在Java 虚拟机规范中没有规定任何OutOtMemoryError 情况的区

在这里插入图片描述
多线程在一个特定的时间段内只会执行其中某一个线程的方法,CPU会不停地做任务切换,这样必然导致经常中断或恢复。

虚拟机栈

在这里插入图片描述

栈和堆的区别
角度一:GC;OOM
角度二:栈、堆执行效率
角度三:内存大小;数据结构
角度四:栈管运行;堆管存储。

栈中存在垃圾回收吗?不存在GC ; 存在OOM

Java 虚拟机规范允许Java栈的大小是动态的或者是固定不变的。
如果采用固定大小的Java虚拟机栈,那每一个线程的Java虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量,Java虚拟机将会抛出一个 StackOverflowError 异常。
如果Java虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出—个 OutOfMemoryError 异常。

什么情况下会发生栈内存溢出?
一、局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。
二、递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。

如何设置栈内存的大小? -Xss size (即:-XX:ThreadStackSize)-Xss1024k

栈内部的单位是栈帧
每个栈帧中存储着:

局部变量表(Local Variables)
操作数栈(Operand Stack)(或表达式栈)
动态链接(DynamicLinking) (或指向运行时常量池的方法引用)
方法返回地址(Return Address)(或方法正常退出或者异常退出的定义)
一些附加信息

在这里插入图片描述
局部变量表中的变量也是重要的垃圾回收根节点,只要被局部变量表中直接或间接引用的对象都不会被回收。

动态链接:Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在class文件的常量池里。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。
动态链接引出 ①虚方法 ②invokedynamic指令 ③虚方法表

在这里插入图片描述

public class LocalVariableThreadSafe {//s1的声明方式是线程安全的,因为线程私有,在线程内创建的s1 ,不会被其它线程调用public static void method1() {//StringBuilder:线程不安全StringBuilder s1 = new StringBuilder();s1.append("a");s1.append("b");//...}//stringBuilder的操作过程:是线程不安全的,// 因为stringBuilder是外面传进来的,有可能被多个线程调用public static void method2(StringBuilder stringBuilder) {stringBuilder.append("a");stringBuilder.append("b");//...}//stringBuilder的操作:是线程不安全的;因为返回了一个stringBuilder,// stringBuilder有可能被其他线程共享public static StringBuilder method3() {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("a");stringBuilder.append("b");return stringBuilder;}//stringBuilder的操作:是线程安全的;因为返回了一个stringBuilder.toString()相当于new了一个String,// 所以stringBuilder没有被其他线程共享的可能public static String method4() {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("a");stringBuilder.append("b");return stringBuilder.toString();/*** 结论:如果局部变量在内部产生并在内部消亡的,那就是线程安全的*/}
}

本地方法栈 native

和虚拟机栈类似,只不过它是管理native本地方法。

几乎”所有的对象实例都在这里分配内存。
所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer, TLAB)。

堆空间

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

JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor
JVM的内存结构,Eden和Survivor比例。

java对象的生命周期长短
几乎所有的Java对象都是在Eden区被new出来的。
绝大部分的Java对象的销毁都在新生代进行了。

堆中一些JVM参数

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

什么是空间分配担保策略?

在这里插入图片描述

堆中垃圾回收过程

什么时候对象会进入老年代?(渣打银行)
什么时候对象会进入老年代?(顺丰)
问什么幸存者区15次进入老年区,懂原理吗?(58)
JVM的伊甸园区,from区,to区的比例是否可调?(花旗银行)
JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代(字节跳动)
什么时候对象会进入老年代? (字节跳动)
对象在堆内存创建的生命周期 (蚂蚁金服)
重点讲讲对象如何晋升到老年代,几种主要的JVM参数 (蚂蚁金服)
新生代和老年代的内存回收策略 (蚂蚁金服)
什么时候对象可以被收回? (蚂蚁金服)

在这里插入图片描述
一次完整的GC流程
在这里插入图片描述
在这里插入图片描述
内存分配策略(或对象提升(promotion)规则):
如果对象在Eden 出生并经过第一次MinorGC 后仍然存活,并且能被Survivor 容纳的话,将被移动到Survivor 空间中,并将对象年龄设为1 。对象在Survivor 区中每熬过一次MinorGC , 年龄就增加1岁,当它的年龄增加到一定程度(默认为15 岁,其实每个JVM、每个GC都有所不同)时,就会被晋升到老年代中。
在这里插入图片描述

/** 测试:大对象直接进入老年代* -Xms60m -Xmx60m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+PrintGCDetails*/
public class YoungOldAreaTest {public static void main(String[] args) {byte[] buffer = new byte[1024 * 1024 * 20];//20m}
}

在这里插入图片描述

MinorGC MajorGC FullGC

在这里插入图片描述

Minor GC 与 Full GC 分别在什么时候发生?(腾讯)
老年代的垃圾回收机制什么时候触发,自动触发的阈值是多少(蚂蚁金服)
新生代的垃圾回收什么时候触发(蚂蚁金服)
简述 Java 内存分配与回收策略以及 Minor GC 和Major GC(国美)
什么时候发生Full GC(58)
简述 Java 内存分配与回收策略以及 Minor GC 和Major GC (百度)
JVM垃圾回收机制,何时触发Minor GC等操作 (蚂蚁金服)
JVM的一次完整的GC流程(从ygc到fgc)是怎样的(蚂蚁金服)
描述JVM中一次full gc过程 (腾讯)
什么情况下触发垃圾回收? (阿里)

新生代的垃圾回收什么时候触发(花旗银行) 老年代的垃圾回收机制什么时候触发,自动触发的阈值是多少(花旗银行)

年轻代GC(Minor GC)触发机制:

年轻代空间不足时,就会触发Minor GC。这里的年轻代满指的是Eden区满,Survivor满不会引发GC。(每次 Minor GC 会清理年轻代的内存。)
因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。这一定义既清晰又易于理解。
Minor GC会引发STW,暂停其它用户的线程,等垃圾回收结束,用户线程才恢复运行。
在这里插入图片描述

老年代GC(Major GC/Full GC)触发机制:

在这里插入图片描述

Full GC触发机制:

在这里插入图片描述

OOM解决?

在这里插入图片描述

为什么需要把Java堆分代?不分代就不能正常工作了吗?

其实不分代完全可以,分代的唯一理由就是优化GC性能。如果没有分代,那所有的对象都在一块,就如同把一个学校的人都关在一个教室。GC的时候要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而很多对象都是朝生夕死的,如果分代的话,把新创建的对象放到某一地方,当GC 的时候先把这块存储“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来。

为什么有TLAB(Thread Local Allocation Buffer)?

在这里插入图片描述

什么是TLAB?

从内存模型而不是垃圾收集的角度,对Eden区域继续进行划分,JVM为每个线程分配了一个私有缓存区域,它包含在Eden空间内。
在这里插入图片描述
选项“-XX:+/-UseTLAB”设置是否开启TLAB空间。

方法区

栈 堆 方法区
在这里插入图片描述
在jdk7及以前,习惯上把方法区,称为永久代。jdk8开始,使用元空间取代了永久代。元空间与永久代最大的区别在于:元空间不在虚拟机设置的内存中,而是使用本地内存。

方法区jvm参数设置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

方法区存了什么

在这里插入图片描述
注意运行时常量池:
在这里插入图片描述

为什么要用元空间替代永久代?

1)为永久代设置空间大小是很难确定的。
2)对永久代进行调优是很困难的。

StringTable为什么要调整?

jdk7中将StringTable放到了堆空间中。因为永久代的回收效率很低,在full gc的时候才会触发。而full gc是老年代的空间不足、永久代不足时才会触发。
这就导致StringTable回收效率不高。而我们开发中会有大量的字符串被创建,回收效率低,导致永久代内存不足。放到堆里,能及时回收内存。

方法区的垃圾收集

主要回收两部分内容:常量池中废弃的常量和不再使用的类型。

在这里插入图片描述
在大量使用反射、动态代理、CGLib等字节码框架,动态生成JSP以及OSGi这类频繁自定义类加载器的场景中,通常都需要Java虚拟机具备类型卸载的能力,以保证不会对方法区造成过大的内存压力。

直接内存

在这里插入图片描述

StringTable

1.通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
2.字符串常量池中是不会存储相同内容的字符串的。

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

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

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

相关文章

Tableau数据可视化与仪表盘搭建-安装教程

下载 tableau.com/zh-cn/support/releases 滚动到最下方的下载 在下载的同时 我们点击登录,去注册一个tableau的账号 下面点击我们下载好的tableau安装程序 不要自定义安装,会有路径问题 点击试用14天 点击激活 激活学生 tableau.com/zh-cn/academic…

GitHub的简单操作

引言 今天开始就要开始做项目了,上午是要把git搭好。搭的过程中遇到好多好多的问题。下面就说一下git的简单操作流程。我们是使用的GitHub,下面也就以这个为例了 一、GitHub账号的登录注册 https://github.com/ 通过这个网址可以来到GitHub首页 点击中间绿色的S…

【2025最新计算机毕业设计】基于Spring Boot+Vue影院购票系统(高质量源码,提供文档,免费部署到本地)

作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

数据安全防护

数据安全防护有几个层面 边界安全 网络防火墙负责的部分 认证 kerberos负责的部分 授权 识别用户是否有访问某个模块的权限 认证是kerberos负责的事情 1. 客户端请求认证服务器,希望得到访问服务端票据的票据 2.客户端拿到访问服务端票据的票据后,去…

Cursor连接腾讯云Cloud Studio开发环境

文章目录 环境准备Cloud StudioCursor Cursor连接Cloud Studio开发环境 环境 腾讯云Cloud Studio语言模板All In One实例Windows 11Firefox 133.0.3 (64 位)Cursor 0.44.9 准备 Cloud Studio 在腾讯云Cloud Studio( https://ide.cloud.tencent.com/ &#xff09…

【工具整理】WIN换MAC机器使用工具整理

最近公司电脑升级,研发同学统一更换了 Mac Book Pro 笔记版电脑,整理一下安装了那些软件以及出处,分享记录下~ 知识库工具 1、语雀 网址:语雀,为每一个人提供优秀的文档和知识库工具 语雀 个人花园&…

面试题解,Java中的“对象”剖析

一、说一说JVM中对象的内存布局?new一个对象到底占多大内存? 话不多说,看下图,对象的内存布局图 一个对象的内存布局主要由三部分组成:对象头(Object Header)、实例数据(Instance D…

大白话拆解——多线程中关于死锁的一切(七)(已完结)

前言: 25年初,这个时候好多小伙伴都在备战期末 小编明天还有一科考试,日更一篇,今天这篇一定会对小白非常有用的!!! 因为我们会把案例到用代码实现的全过程思路呈现出来!&#xff…

家教老师预约平台小程序系统开发方案

家教老师预约平台小程序系统将连接学生/家长与家教老师,提供一站式的家教服务预约体验。 一、用户需求分析1、家教老师:希望获得更多的学生资源,通过平台展示自己的教学特长和经验,管理个人日程,接收并确认预约请求&a…

windows 图形基础架构简介

背景 本文尝试对Windows系统中的一些Graphic相关的概念进行介绍和厘清。 windows图形基础架构简介 Windows 为图形提供了多个 API,下图显示了这些 API。 上图出自微软官方https://learn.microsoft.com/en-us/windows/win32/learnwin32/overview-of-the-windows-…

QML使用Popup实现弹出Message

方案一:popup import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15ApplicationWindow {visible: truewidth: 640height: 480title: qsTr("Top Message Popup Example")ColumnLayout {anchors.centerIn: parentspacing: 10Butt…

Ⅱ.INTRODUCTION TO CUDA C

前言 上一节环境配置好了,我们开始吧! 一、A First Program 1. Hello, World! 我们先写一个C语言的 Hello, World! 作为对比 int main(void){printf("Hello, World!\n");return 0; }大家应该知道这个代码运行在CPU上吧,我们CP…

如何轻松关闭 iPhone 上的 HEIC [HEIC 图像技巧]

您是否正在为关闭 iPhone 上的 HEIC 而烦恼?你不是一个人; Apple 的首选图像文件格式仍可能存在一些兼容性问题。当您与某人共享照片或尝试在Windows计算机上打开图像时,就会出现此问题。幸运的是,Apple 使关闭 HEIC iPhone 变得更加容易。 …

Postgresql 命令还原数据库

因为PgAdmin打不开,但是数据库已经安装成功了,这里借助Pg命令来还原数据库 C:\Program Files\PostgreSQL\15\bin\psql.exe #链接数据库 psql -U postgres -p 5432#创建数据库 CREATE DATABASE "数据库名称"WITHOWNER postgresENCODING UTF8…

docker中使用Volume完成数据共享

情景概述 在一个docker中,部署两个MySQL容器,假如它们的数据都存储在自己容器内部的data目录中。这样的存储方式会有以下问题: 1.无法保证两个MySQL容器中的数据同步。 2.容器删除后,数据就会丢失。 基于以上问题,容…

vue——滑块验证

1. 介绍 1.1 简介 基于滑动式的验证码,免于字母验证码的繁琐输入 用于网页注册或者登录 1.2 来源说明 vue使用滑块验证功能,是基于vue-monoplasty-slide-verify这样的一个开源项目,进行实现的,这是这个开源项目的网址传送阵&#…

如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?

如何很快将文件转换成另外一种编码格式? 利用VS Code右下角的"选择编码"功能,选择"通过编码保存"可以很方便将文件转换成另外一种编码格式。尤其,在测试w/ BOM或w/o BOM, 或者ANSI编码和UTF编码转换,特别方便。VS文件另…

Unity3D仿星露谷物语开发16之角色拾取道具

1、目标 当角色经过道具时会拾取道具放到库存列表中,此时道具消失并打印库存信息。 2、创建新的Enum 在Assets -> Scripts -> Enums -> Enum.cs中添加库存位置相关的信息。 public enum InventoryLocation {player, // 在角色手中chest, // 在箱子里co…

UE4_用户控件_3_用户控件输入数据的方法

祝愿大美兰陵越来越好! 一、效果展示: 二、先制作一个角色 1、新建个父类为pawn的蓝图类。更名为BP_Image_Character。 2、这个角色只是用于观察场景,并与场景中的物体相碰撞用的,所以不需要骨骼网格体, 3、但是我们…

文献阅读 | B. S. Carmo 2010

目录 一、文献名称二、原文地址三、ABSTRACT主要发现详细观察分岔分析雷诺数依赖性比较见解意义结论 四、IINTRODUCTION历史研究回顾计算研究近期研究进展研究空白与目的论文结构 一、文献名称 二、原文地址 研究目的:研究串列排列双圆柱体周围流场中的次级不稳定性…