JVM对象创建与内存回收机制

对象的创建过程有如下步骤:
在这里插入图片描述
1.类加载检查:
        虚拟机遇到一个new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过,如果没有,那么必须先执行相应的类加载过程
        new指令对应到语言层面上讲是,new关键词、对象克隆、对象序列化等。
2.分配内存
        对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。这个步骤有两个问题:

  1. 如何划分内存
  2. 在并发情况下,可能出现在给对象A分配内存,指针还没来得及修改,对象B又同时使用了原来的指针来分配内存的情况。
    划分内存的方法:
            “指针碰撞”(默认)(Bump the Pointer):
            如果Java堆中的内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是吧那个指针向空闲空间那边挪动一段与对象大小相等的距离。
            “空闲类表”(Free List)
            如果Java堆中的内存并不是规整的,已使用的内存和空闲内存相互交错,那就没有办法简单的进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存快是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录
            解决并发问题的方法:
            1.CAS(Compare and swap)
            虚拟机采用CAS配上失败重试的方式保证更新操作的原子性来分配内存空间的动作进行同步处理。
            2.本地线程分配缓冲(Thread Local Allocation Bufffer, TLAB)
            把内存分配的动作按照线程划分在不同的空间中进行,即每个线程在Java堆中预先分配一小块内存。通过-XX:+/-UseTLAB参数来设定迅即是否使用TLAB(JVM会默认开启-XX:+UseTLAB),- XX:TLABSize指定TLAB大小。

3.初始化
        内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),如果使用TLAB,这一工作过程也可以提前至TLAB分配时进行。这一步操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。
4.设置对象头
        对象除了成员变量之外,还有对象头,对象填充,对象在内存中存储的布局可以分为3块区域:对象头、实例数据和对齐填充
        1.Mark Word标记字段(32位占4字节,64位占8字节)自身运行时数据哈希表,GC分代年龄,锁状态标志,线程执有锁,偏向线程ID,偏向时间戳。
        2.Klass Pointer类型指针(开启压缩4字节,关闭压缩8字节)。剋的元数据指针(D。代码放在方法区,JVM使用Java头的类型指针拿到方法区的头。
        3.数组长度(4字节,只有数组对象才有)
5.执行(init)方法
        给对象真正的赋值以及执行构造方法。
对象大小与指针压缩
        启用指针压缩-XX:+UseCompressedOops(默认开启),禁止-XX:-UseCompressedOops
压缩对象地址到32位
为什么要进行指针压缩?

  1. 在64位平台的HotSpot中使用32位指针,内存使用会多出1.5倍左右,使用较大指针在主内存和缓存之间移动数据,占用较大带宽,同时GC也会承受较大压力。
  2. 为了减少64位平台下内存的消耗,启用指针压缩功能。
  3. 在JVM中,32位地址最大支持4G内存,可以通过对象指针的压缩编码、解码方式进行优化,使得JVM只用32位地址就可以支持更大的内存配置(小于等于32G)
  4. 堆内存小于4G时,不需要启用指针压缩,JVM会直接去除高32位地址,即使用低虚拟地址空间
  5. 堆内存大于32G时,压缩指针会失效,会强制使用64位堆Java对象寻址,这样会现1的问题,所以堆内存不要大于32G为好。

        -XX:+UseCompressedClassPointers默认开启的,只压缩对象头里的类型指针Klass Pointer对象内存分配。
        对象逃逸分析:比如User对象在方法执行后返回,则这个对象逃逸了,减少GC压力。
        -XX:DoEscopeAnalysis开启逃逸分析参数,JDK7后默认开启
        标量替换:一个对象如果经过逃逸分析能够确定这个对象在栈上分配,这里会做一个优化,即便栈帧里没有一整块空间放对象,也能够通过其他方法存在栈帧上。
        如果对象不逃逸,栈帧只放对象成员变量,把完整的对象打散放到栈帧上去,这几个变量都标识属于某一个对象。
        标量与聚合量:标量即不可以被进一步分解的量,而Java的基本数据类型就是标量,标量的对立就是可以被进一步分解的量,而这种量称为聚合量。而Java对象就是可以被进一步分解的聚合量。
        开启标量替换-XX:+ECiminateAllocations,JDK7后默认开启
        -Xmx 15m -Xms 15m -XX:+DoEscapeAnslysis -XX:+printGC -XX:+ElininoteAllocations.大对象直接进入老年代
        -XX:PretenurefSizeThreshold=1000000 -XX:+UseSerialGC(支持大对象ParNew)。定义大对象配置,这个参数只在Serial和ParNew两个收集器下有效
        长期存活的对象将进入老年代。当它的年龄增加到一定程度,默认为15岁,CMS收集器默认为6岁,通过-XX:maxTennringThreshold设置对象动态年龄判断。
对象动态年龄判断:
        如果S区超过50%,进入老年代,例如Survivor区域里现在有一批对象年龄1+年龄2+年龄n的多个年龄对象总和超过了Survivor区域的50%,此时会把年龄n(含)以上的对象都放入老年代,这个规则其实是希望那些可能是长期存活的对象,尽早进入老年代,对象动态年龄判断机制一般是在minor gc之后触发。把年轻代设大点(-Xmn)
老年代空间分配担保机制
在这里插入图片描述软引用、弱引用和虚引用在GC时没空间时会被回收。
finalize()方法最终判定对象是否存活。
如果你的对象实现了finalize,这个对象会做标记,不会马上回收,第二次标记,清理掉前执行该方法,finalize只会自救一次。
如何判断一个类是无用的类,方法区主要回收的是无用的类,那么如何判断一个类时无用类呢?
类在方法区,该区要被回收满足该类的实例都被回收。
        加载类的Class Loader被回收了,自定义的类加载器是有可能需要回收,比如JSP类加载器。
该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

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

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

相关文章

长城资产信息技术岗24届校招面试面经

本文介绍2024届秋招中,中国长城资产管理股份有限公司的信息技术岗岗位一面的面试基本情况、提问问题等。 10月投递了中国长城资产管理股份有限公司的信息技术岗岗位,所在部门为长城新盛信托有限责任公司。目前完成了一面,在这里记录一下一面经…

函数递归(Recursion)一篇便懂

递归的概念 在 C 语言中,递归(Recursion)是一种函数调用自身的编程技术。当一个函数在其定义中调用自身时,就称为递归函数。 了解递归思想 把⼀个大型复杂问题层层转化为⼀个与原问题相似,但规模较小的子问题来求解…

3.chrony服务器

目录 1. 简介 1.1. 重要性 1.2. Linux的两个时钟 1.3. 设置日期时间 1.3.1. timedatectl命令设置 1.3.2. date命令设置 1.4. NTP 1.5. Chrony介绍 2. 安装与配置 2.1. 安装: 2.2. Chrony配置文件分析 2.3. 同步时间服务器 2.3.1. 授时中心 2.3.2. 实验…

gin数据解析和绑定

1. Json 数据解析和绑定 客户端传参,后端接收并解析到结构体 package mainimport ("github.com/gin-gonic/gin""net/http" )// 定义接收数据的结构体 type Login struct {// binding:"required"修饰的字段,若接收为空值…

制造业中的数据治理

随着信息技术的飞速发展,数据已经成为现代制造业的核心资产。数据治理作为确保数据质量、安全性、可靠性和一致性的关键过程,对于提高生产效率和质量控制具有不可忽视的影响。本文将深入探讨制造业中数据治理的重要性、挑战和实践,以揭示其对…

董宇辉最走心的18大金句,太燃了!

真的是人间金句! 1.没带你去看过长白山皑皑的白雪,没带你感受过十月田间吹过的微风,没带你去看过沉甸甸的弯下腰,犹如智者一般的谷穗,没带你去见证过这一切,但是亲爱的,我可以让你品尝这样的大…

HCIP:不同VLAN下实现网络互相通信

配置pc1 配置pc2 配置pc3 将sw1划分到vlan3 将sw3划分到vlan3 在sw1上进行缺省 将sw1上(g0/0/1)的untagged改成 1 3 则在pc1上ping pc2可通 在sw1上进行缺省 在sw3上(e0/0/1)打标记 则在pc1上ping pc3可通(实现互通&am…

新特性Record最全用法总结---动力节点总结

目录 0、有用的新特性 一、Record 1.1、Record的介绍: 1.2、Record的声明: 1.3、Record的创建: 1.4、Record使用举例: 1.5、Record-实例方法、静态方法 1.6、Record-三类构造方法 1.6.1、紧凑型构造、定制构造方法&#…

JavaScript 库

文章目录 一、JavaScript 库二、案例三、常见问题及优缺点常见问题:优点:缺点: 四、热门文章 一、JavaScript 库 jQuery:一个快速、小巧、功能丰富的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画等操作。 Re…

服务器的组成

服务器的重要结构组成 家用电脑组成: CPU、主板、内存条、显卡、硬盘、电源、风扇、网卡、显示器、机箱、键盘鼠标等等。 CPU CPU是电脑的大脑, CPU发展史: 32 位CPU:最大的内存寻址地址2^32,大约4G的大小。 CP…

爬虫进阶之selenium模拟浏览器

爬虫进阶之selenium模拟浏览器 简介环境配置1、建议先安装conda2、创建虚拟环境并安装对应的包3、下载对应的谷歌驱动以及与驱动对应的浏览器 代码setting.py配置scrapy脚本参考中间件middlewares.py 附录:selenium教程 简介 Selenium是一个用于自动化浏览器操作的…

xpath注入漏洞靶场搭建记录

目录 漏洞简单介绍 靶场搭建 靶场测试 漏洞简单介绍 这种漏洞允许攻击者注入恶意XPath代码,从而操纵应用程序对XML数据的处理方式。 当应用程序使用用户提供的输入来查询XML数据时,如果这些输入没有经过适当的验证或清理,攻击者可以注入恶意XPath代码。这些代码可能在正…

CSS 楼梯弹弹球

<template><view class="loader"></view> </template><script></script><style>body {background-color: #212121;/* 设置背景颜色为 #212121 */}.loader {position: relative;/* 设置定位为相对定位 */width: 120px;/* 设…

Python yml配置文件实例

目录 安装 封装实例 目录结构 功能封装 运行结果 安装 pip3 install PyYaml 封装实例 目录结构 test_yml/ ├── config │ ├── config.py │ ├── config.yml │ └── __pycache__ │ └── config.cpython-38.pyc ├── lib │ ├── pathut…

38-WEB漏洞-反序列化之PHPJAVA全解(下)

WEB漏洞-反序列化之PHP&JAVA全解&#xff08;下&#xff09; 一、Java中API实现二、序列化理解三、案例演示3.1、本地3.2、Java 反序列化及命令执行代码测试3.3、WebGoat_Javaweb 靶场反序列化测试3.4、2020-网鼎杯-朱雀组-Web-think_java 真题复现 四、涉及资源 一、Java中…

springboot118共享汽车管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的共享汽车管理系统 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获…

『论文阅读|2024 WACV 多目标跟踪Deep-EloU|纯中文版』

论文题目&#xff1a; Iterative Scale-Up ExpansionIoU and Deep Features Association for Multi-Object Tracking in Sports 论文特点&#xff1a; 作者提出了一种迭代扩展的 ExpansionIoU 和深度特征关联方法Deep-EIoU&#xff0c;用于体育场景中的多目标跟踪&#xff0c;旨…

pc端vue封装高德地图实现定位 PlaceSearch搜索

首先安装 amap/amap-jsapi-loader 官网教程 mapContainer.vue <template><div class"container-map" :style"styleObj"><!-- change"changeInput" type"text" --><a-input idtipinput v-model:value"input…

C++从零开始的打怪升级之路(day20)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的是关于vector的题目 1.只出现一次的数字3 260. 只出…

基于springboot家政服务管理平台源码和论文

随着家政服务行业的不断发展&#xff0c;家政服务在现实生活中的使用和普及&#xff0c;家政服务行业成为近年内出现的一个新行业&#xff0c;并且能够成为大众广为认可和接受的行为和选择。设计家政服务管理平台的目的就是借助计算机让复杂的销售操作变简单&#xff0c;变高效…