JVM

图来自JavaGuide
pPqDK1I.png

程序计数器

  • 程序计数器是线程私有的,每个线程一份,是线程安全的;
  • 内部保存的字节码的行号,用于记录正在执行的字节码指令的地址。

java堆

  • java堆是线程共享的区域(线程不安全),主要用来保存对象实例、数组等,内存不够会抛出OutOfMemoryError异常

  • 一个JVM只有一个堆内存,堆内存大小可以调节

  • 组成:年轻代+老年代

    • 年轻代分为三部分:Eden区和两个大小严格相同的Survivor区(8:1:1)
    • 老年代主要保存一些生命周期长的对象。
  • JDK1.7 和1.8 的区别

    • 1.7 堆中有一个永久代,存储类信息、静态变量、常量、编译后的代码,不存在垃圾回收,关闭虚拟机就会释放这个区域的内存
    • 1.8中堆中移除了永久代,把数据存储到了本地内存的元空间中,防止内存溢出。

字符串常量池的变化:

  • 1.6 在方法区
  • 1.7在堆区
  • 1.8 在元空间(1.8方法区变成了本地内存)

方法区是所有线程共享的内存,在java8以前是放在JVM内存中的,由永久代实现,受JVM内存大小参数的限制,在java8中移除了永久代的内容,方法区由元空间(Meta Space)实现,并直接放到了本地内存中,不受JVM参数的限制(当然,如果物理内存被占满了,方法区也会报OOM),并且将原来放在方法区的字符串常量池和静态变量都转移到了Java堆中。

所有的对象都是在Eden区new出来

OOM解决方法:

  • 扩大堆内存
  • 分析内存,看哪里出现问题

永久代逻辑上存在,物理上不存在

堆内存调优

-Xms 1m 设置初始化内存分配大小 默认本机内存1/64

-Xmx 1m 设置最大分配内存 默认本机内存1/4

-XX:+PrintGCDetails 打印GC垃圾回收信息

-XX:+HeapDumpOnOutOfMemoryError: 导出OOM异常文件

虚拟机栈

  • 每个线程运行时所需要的内存,称为虚拟机栈,先进后出
  • 每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占的内存
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
  • 8大基本类型、对象引用、实例方法

正在执行的方法一定在栈的顶部

运行时栈帧包含的结构:局部变量表、操作数栈、动态连接、返回地址、附加信息

垃圾回收是否涉及栈内存

不涉及,垃圾回收主要指堆内存,当栈帧弹栈后,内存就会释放

栈内存分配越大越好吗?

  • 未必,默认栈内存1024k,栈帧过大会导致线程数变少

方法内的局部变量是否线程安全

  • 若方法内局部变量没有逃离方法的作用范围,它是线程安全的;
  • 若局部变量引用了对象并逃离方法的作用范围,需要考虑线程安全

什么情况下会导致堆内存溢出(StackOverflow)

  • 栈帧过多,典型问题:递归调用
  • 栈帧过大

堆、栈的区别

  • 栈内存一般用来存储局部变量和方法调用,堆内存用来存储java对象和数组。堆会GC垃圾回收,而栈不会。
  • 栈内存是线程私有的,堆内存是线程共有的
  • 两者异常错误不同,但如果栈内存或堆内存不足都会抛出异常。

方法区

  • 方法区是各个线程共享的内存区域
  • 主要存储静态变量、变量、类的信息、运行时常量池
  • 虚拟机启动的时候创建,关闭虚拟机时释放。
  • 若方法区中的内存无法满足分配请求,则会抛出OutOfMemoryError:Metaspace

运行时常量池

  • 常量池可以看做一张表,虚拟机指令根据这张表找到要执行的类名、方法名、参数类型等信息
  • 当类被加载时,它的常量池信息会放入运行时常量池,并将里面的符号地址变为真实地址。

直接内存

  • 直接内存并不属于JVM的内存结构,不由JVM进行管理。是虚拟机的系统内存。
  • 常见于NIO操作,用于数据缓冲区。读写性能高 ,不受JVM内存回收管理

GC垃圾回收

发生在堆。

垃圾回收算法

标记-清除算法

首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。

缺点:

  • 效率不高
  • 产生大量不连续的内存碎片
复制算法

内存分为大小相同的两块,每次使用其中的一块,当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。

作用于新生代的Survivor区

缺点:

  • 可用内存变小,缩小为原来的一半
  • 不适用于老年代
标记整理算法

标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。

根据老年代的特点提出的一种标记算法,多了整理这一步,因此效率也不高,适合老年代这种垃圾回收频率不是很高的场景。

分代收集算法

对象的生命周期不同,故根据对象的存货周期在堆中分为新生代、老年代,根据其特点选择合适的垃圾收集算法。

  • 新生代:标记-复制算法(每次收集都有大量对象死去,只需要付出少量对象的复制成本就可以完成垃圾清除)
  • 老年代:标记-清除或标记整理算法(对象存活几率高,要清除的少)

类的加载过程

pPqcw0P.png

主要分为七个过程

pPqg8H0.png

  1. 加载

    • 通过类名,获取二进制流,
    • 解析类的二进制数据流为方法区内的数据结构(Java类模型)
    • 创建java.lang.Class类的实例,作为方法区这个类的各种数据的访问入口
  2. 验证

    验证类是否符合JVM规范

  3. 准备

    为类变量分配内存并设置初始值

    • static变量是final的基本类型,以及字符串常量,值已确定,赋值在准备阶段完成

    • static变量,分配空间在准备阶段完成(设置默认值),赋值在初始化阶段完成

    • static变量是final的引用类型,那么赋值也会在初始化阶段完成

  4. 解析

    把类中的符号引用转变为直接引用

  5. 初始化

    对类的静态变量、静态代码块进行初始化操作

    • 从上到下
    • 优先初始化父类
  6. 使用

    JVM 开始从入口方法开始执行用户的程序代码

    • 调用静态类成员信息(比如:静态字段、静态方法)
    • 使用new关键字为其创建对象实例
  7. 卸载

    程序代码执行完毕后,JVM销毁Class对象,JVM也退出内存

双亲委派机制

当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,下一级才会去加载这个类。

优点:

  • 避免某一个类被重复加载,保证唯一性。
  • 为了安全,保证类库API不会被修改

JVM调优

JVM调优主要是调整年轻代、老年代、元空间的内存大小及使用的垃圾回收器。

  • 设置堆内存的初始化、最大内存
-Xms : 设置堆的初始化内存大小
-Xmx :设置堆的最大内存大小
  • 设置年轻代中Eden区和Survivor区的大小比例(默认8:1:1)
-XXSurvivorRatio=3,表示年轻代中的分配比率survivor:survivor:eden = 1:1:3
  • 设置年轻代与老年代的大小比例(默认1:2)
-XX:newSize=n   设置年轻代的初始大小
-XX:MaxNewSize   设置年轻代的最大大小,  初始大小和最大大小两个值通常相同
  • 线程堆栈的设置

    默认1M,但128k就够用了

-Xss   对每个线程stack大小的调整,-Xss128k

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pandas进阶:20个实用的Pandas函数的基本使用

1. ExcelWriter 很多时候dataframe里面有中文,如果直接输出到csv里,中文将显示乱码。而Excel就不一样了,ExcelWriter是pandas的一个类,可以使dataframe数据框直接输出到excel文件,并可以指定sheets名称。 df1 pd.Da…

玻色量子对外合作

2023年 2023.7 首个央企量子云计算项目,中标! 2023.6 勇闯“量子电力”新领域,玻色量子与清大科越达成战略合作 2023.5 玻色量子签约移动云“五岳”量子云计算创新加速计划! 2023.3 “量子计算通信”!玻色量子与…

使用netconf配置华为设备

实验目的: 公司有一台CE12800的设备,管理地址位172.16.1.2,现在需要编写自动化脚本,通过SSH登陆到设备上配置netconf协议的用户名,密码以及netconf服务,并且通过netconf协议将设备的loopback0接口IP地址配…

小航助学题库蓝桥杯题库c++选拔赛(22年1月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号) 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)

适用于 Windows 的最佳电脑数据恢复软件是什么?

数据丢失是数字世界中令人不快的一部分,它会在某一时刻影响许多计算机用户。很容易意外删除一些重要文件,这可能会在您努力恢复它们时带来不必要的压力。幸运的是,数据恢复软件可以帮助恢复已删除的文件,即使您没有备份它们。这是…

CONTROLLING VISION-LANGUAGE MODELS FOR MULTI-TASK IMAGE RESTORATION

CONTROLLING VISION-LANGUAGE MODELS FOR MULTI-TASK IMAGE RESTORATION (Paper reading) Ziwei Luo, Uppsala University, ICLR under review(6663), Cited:None, Stars: 350, Code, Paper. 1. 前言 像CLIP这样的视觉语言模型已经显示出对零样本或无标签预测的各种下游任务…

fastadmin 如何引入自己的js

在需要的界面中&#xff1a;如何实例说明&#xff1a; 中<script> function zhuruJs(url) { let temp document.createElement( script ); temp.setAttribute( type, text/javascript" );temp.src urL; document.head . appendChild(temp); zhuruJs(location…

智能优化算法应用:基于哈里斯鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于哈里斯鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于哈里斯鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.哈里斯鹰算法4.实验参数设定5.算法结果6.参考…

【Hydro】SG滤波器纯numpy实现

目录 说明WIKI示例滑动平均卷积系数的推导第一点和最后点的处理scipy.signal中的savgol_filter纯numpy实现的savgol_filterCPP实现的savgol_filter参考文献说明 Savitzky-Golay滤波器(S-G滤波器)是一种在时域和频域上同时进行的滤波方法,它通过局部多项式拟合来平滑信号。这…

ExoPlayer - Failed to initialize OMX.qcom.video.decoder.avc

人莫鉴于流水而鉴于止水&#xff0c;唯止能止众止 1. 背景 使用ExoPlayer&#xff0c;我不信你没遇到过这个问题&#xff1a; java.lang.IllegalArgumentException: Failed to initialize OMX.qcom.video.decoder.avc 详细内容如下图所示&#xff1a; 2. MediaCodec(解码器) …

Android控件全解手册 - 多语言切换完美解决方案(兼容7.0以上版本)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

MySQL-函数

一、统计函数 CREATE TABLE student (id INT NOT NULL DEFAULT 1,name varchar(20) not null default ,chinese float not null default 0.0,english float not null default 0.0,math float not null default 0.0 );insert into student values (1,曹操,77,89,85);insert int…

Python内置函数与标准库函数的详细解读

一、内置函数与标准库函数的区分 Python 解释器自带的函数叫做内置函数&#xff0c;这些函数可以直接使用&#xff0c;不需要导入某个模块。 Python 解释器也是一个程序&#xff0c;它给用户提供了一些常用功能&#xff0c;并给它们起了独一无二的名字&#xff0c;这些常用功能…

二叉树leetcode(求二叉树深度问题)

today我们来练习三道leetcode上的有关于二叉树的题目&#xff0c;都是一些基础的二叉树题目&#xff0c;那让我们一起来学习一下吧。 https://leetcode.cn/problems/maximum-depth-of-binary-tree/submissions/ 看题目描述是让我们来求出二叉树的深度&#xff0c;我们以第一个父…

【LeetCode刷题】--90.子集II

90.子集II class Solution {public List<List<Integer>> subsetsWithDup(int[] nums) {List<List<Integer>> ans new ArrayList<>();List<Integer> list new ArrayList<>();//排序后便于去重Arrays.sort(nums);dfs(0,nums,ans,lis…

Docker的数据持久化;Docker网络;Dockerfile编写

Docker的数据持久化&#xff1b;Docker网络&#xff1b;Dockerfile编写&#xff1b; 文章目录 Docker的数据持久化&#xff1b;Docker网络&#xff1b;Dockerfile编写&#xff1b;**Docker的数据持久化**1&#xff09;将本地目录映射到容器里2&#xff09;数据卷3&#xff09;将…

聚类分析例题 (多元统计分析期末复习)

例一 动态聚类&#xff0c;K-means法&#xff0c;随机选取凝聚点&#xff08;题目直接给出&#xff09; 已知5个样品的观测值为&#xff1a;1&#xff0c;4&#xff0c;5&#xff0c;7&#xff0c;11。试用K均值法分为两类(凝聚点分别取1&#xff0c;4与1&#xff0c;11) 解&…

JavaScript编程进阶 – Return语句

JavaScript编程进阶 – Return语句 JavaScript Programming Advanced – Return Statement By JacksonML 就像人们习惯的函数一样&#xff0c;总觉得在函数体最后需要一个return语句&#xff0c;标志着函数的结束,就像下面这个函数 theFunc() 那样。 function theFunc() { re…

【Openstack Train安装】八、placement安装

Placement 肩负着这样的历史使命&#xff0c;最早在 Newton 版本被引入到 openstack/nova repo&#xff0c;以 API 的形式进行孵化&#xff0c;所以也经常被称呼为 Placement API。它参与到 nova-scheduler 选择目标主机的调度流程中&#xff0c;负责跟踪记录 Resource Provide…

Vue diff 算法探秘:如何实现快速渲染

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…
最新文章