当前位置: 首页 > news >正文

JVM总结

一、对象内存布局

请添加图片描述

二、JVM内存结构

请添加图片描述

2.1 程序计数器

线程私有,是一个指针,每个命令都是有行号的,会使用程序计数器记录命令执行到多少行,记录代码执行的位置

2.2 java虚拟机栈

线程私有,开启一个线程都会开启一个虚拟机栈,默认大小为1M,加载本地方法

2.3 本地方法栈

线程私有,与虚拟机栈类似,不过加载的是native修饰的方法

2.4 堆

线程共享,存放对象

2.5 元空间

线程共享,存储class信息,类的信息,方法的定义,静态变量,常量池放在元空间内

java虚拟机中只存在一个堆,一个元空间,在JVM启动时创建,关闭时销毁
栈、本地方法栈、程序计数器,随线程创建而创建,随线程结束死亡

三、堆内存结构

请添加图片描述

四、GC垃圾回收

发现垃圾

  1. 引用计数算法,优点:快,缺点:无法检测出循环引用
  2. 根搜索算法:从节点GCROOT开始,寻找对应的引用节点,往下依次寻找对应的引用节点,所有引用节点寻找完毕后,剩余节点被当做垃圾处理

可作为GCRoot的对象:

  1. java虚拟机栈引用的对象
  2. 本地方法栈引用的对象
  3. 元空间中静态属性引用的对象
  4. 元空间中常量引用的对象

回收垃圾

  1. 标记-清除算法:标记需要回收的对象,统一清除。
    缺点:清除后会产生大量不连续的内存碎片
  2. 标记-整理算法:标记后将所有存活对象都移动到一端,移动过程中清理可回收对象
    优点:内存整理后不会产生大量不连续的内存碎片
    缺点:耗时耗力
  3. 复制算法:将可用内存按容量分成大小相等的两块,每次只使用其中一块,当这块内存使用完了,就将还存活的对象复制到另一块内存上去,然后把使用过的内存空间一次清理掉。
    缺点:可使用内存少
  4. 分代收集算法:据对象存活周期的不同将内存划分为年轻代、年老代,不同生命周期的对象可以采取不同 的回收算法,以便提高回收效率。

(1)年轻代

新生对象会放在年轻代
新生代内存按照8:1:1比例分为一个eden2区和两个Survivor区
**特殊情况:**当存放到Eden区的对象太大时,会直接存放到老年区,若老年区也满了,触发FullGC,年轻代和老年代全部回收
新生代发生的GC叫做MinorGC,发生频率较高

(2)老年代

当年轻代中经历了N次垃圾回收仍存活的对象放入老年代,默认15
内存大概是年轻代的2倍,老年代满时触发MajorGC即FullGC
FullGC发生频率低,老年代对象存活时间较长,存活率较高。

(3)元空间-持久代

存放静态文件,如Java类、方法等,存储到元数据区

五、JVM调优参数

-Xms8g:设置 JVM中堆初始大小为8g,可设置与-Xmx相同,避免垃圾回收完成重新分配内存
-Xmx8g:设置堆最大可用内存为8G
-Xmn4g:设置年轻代大小为4G
-XX:MaxMetaspaceSize=128m: 设置元空间最大为为128m ,
-XX:MetaspaceSize=128m 用于设置元空间的初始大小, 默认值约21M

相关文章:

  • Python in Excel作图分析实战!
  • JAVA入门1——理论+helloworld
  • Word导出样式模板,应用到其他所有word
  • MySQL 之索引详解
  • Chrome开发者工具如何才能看到Vue项目的源码
  • java初识
  • 【注册/登录安全分析报告:孔夫子旧书网】
  • 腾讯云SDK产品功能
  • 动态规划入门题目->使用最小费用爬楼梯
  • 【全新课程】正点原子《基于GD32 ARM32单片机项目实战入门》培训课程上线!
  • 一行代码,AI大模型训练成本再降30%,混合精度训练再升级
  • 不夸张、我就是这样考过PMP~
  • Python OpenCV精讲系列 - 计算机视觉应用深入理解(十五)
  • 宠物空气净化器希喂和352哪个好用?两大爆火机型哪款吸毛、除臭效果比较好?
  • C# winform s7.net 类读取 报错:数组不是一维数组。
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【个人向】《HTTP图解》阅后小结
  • Akka系列(七):Actor持久化之Akka persistence
  • angular学习第一篇-----环境搭建
  • Java多线程(4):使用线程池执行定时任务
  • java中具有继承关系的类及其对象初始化顺序
  • leetcode讲解--894. All Possible Full Binary Trees
  • orm2 中文文档 3.1 模型属性
  • 从0实现一个tiny react(三)生命周期
  • 从零开始的无人驾驶 1
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • ------- 计算机网络基础
  • 简单基于spring的redis配置(单机和集群模式)
  • 模型微调
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 网页视频流m3u8/ts视频下载
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 原生js练习题---第五课
  • 最简单的无缝轮播
  • python最赚钱的4个方向,你最心动的是哪个?
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #nginx配置案例
  • #Z0458. 树的中心2
  • $.ajax中的eval及dataType
  • (11)iptables-仅开放指定ip访问指定端口
  • (6)设计一个TimeMap
  • (C语言)fread与fwrite详解
  • (k8s)Kubernetes本地存储接入
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (转)Scala的“=”符号简介
  • (转载)虚函数剖析
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET技术成长路线架构图