百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

JDK 1.8中对象被访问的具体过程及步骤

yuyutoo 2025-03-26 18:54 9 浏览 0 评论

JDK1.8中对象被访问的过程和步骤

对象的创建与初始化

当使用new关键字创建一个Java对象时,JVM需要执行以下步骤:

  • 类加载检查:确保该类已经通过类加载器正确加载,并完成验证、准备和解析过程。
  • 内存分配:为新对象在堆内存中分配一块足够大的连续空间,用于存储所有成员变量的值。这个大小由构造方法所需的空间决定。
  • 初始化对象:调用构造函数(方法),对对象进行初始化,将成员变量设置为初始值或用户指定的值。
  • 引用赋值:将新分配的对象内存地址赋值给栈中的引用变量,供程序代码使用。

对象所在的内存区域

在JDK 1.8中,默认使用G1垃圾收集器,它将堆内存划分为多个独立的Region。对象被分配到哪个Region主要取决于其大小和存活周期:

  • Eden区:新对象首先会被分配到这里。
  • Survivor区:经历过一次GC后仍然存活的对象会移动到这里。
  • 老年代:长期存活的对象最终会被晋升到老年代。
  • Humongous区(仅G1):用于存放大对象。

对象的访问过程

当程序代码通过引用变量访问一个对象时,具体步骤如下:

  • 栈中的引用变量:在方法调用过程中,局部变量(包括对象引用)会被压入到当前线程的栈中。
  • 内存地址定位:JVM根据引用变量的内容直接找到堆内存中对应对象的位置。这一步骤非常快速和高效。

垃圾回收机制

垃圾收集器负责管理和回收不再被使用的对象:

  • 标记-清除算法:识别不再被任何强引用指向的对象,并将其标记以便后续清除。
  • 复制算法:在新生代中,将存活的对象复制到另一个Survivor区,以清理无用对象。
  • 标记-整理算法(G1):G1使用更高效的内存管理策略,通过多线程并发处理多个Region中的垃圾。

引用计数与内存泄漏

JVM使用引用计数来跟踪每个对象的存活状态。当一个对象的所有引用都被移除时,其引用计数为零,表明该对象不再被使用,可以被垃圾收集器回收。然而,如果存在循环引用或未正确管理的引用,可能会导致内存泄漏。

性能调优与JVM参数

为了优化Java程序的性能和内存使用效率,可以调整以下JVM参数:

  • 堆内存大小-Xms-Xmx 设置初始和最大堆内存。
  • 新生代与老年代比例-XX:NewRatio= 调整两代的内存分配比例。
  • 垃圾收集器类型-XX:+UseG1GC 启用G1垃圾收集器。

通过合理配置这些参数和遵循良好的编码习惯,可以显著提升应用程序的性能和稳定性

步骤

描述

1

对象的创建


当程序执行new关键字时,JVM开始为新对象分配内存。

2

类加载检查


JVM首先确保该类已经正确加载、链接和验证。

3

内存分配


在堆内存中为新对象分配足够的连续空间,大小由构造方法所需成员变量决定。

4

初始化对象


调用构造函数(方法),对对象进行初始化。

5

引用赋值


将新对象的内存地址赋值给栈中的引用变量,供程序代码使用。

6

对象进入新生代Eden区


初始分配后,新对象存放在新生代的Eden区。

7

Survivor区的使用


在Minor GC过程中,存活的对象被移动到Survivor区。

8

老年代的晋升


经过多次GC仍然存活的对象会被晋升到老年代。

9

大对象处理


如果对象大小超过阈值,直接分配到老年代以避免新生代碎片化。

10

Humongous区(仅G1)


在G1中,大对象被集中存放在Humongous区。

11

引用计数管理


JVM使用引用计数来追踪对象的存活状态。

12

垃圾收集器标记阶段(初始标记)


暂停应用程序线程,标记GC根节点(如栈中的引用)。

13

并发标记阶段


后台线程进行可达性分析,标记存活对象。

14

最终标记阶段


再次暂停应用程序线程,确保所有存活对象都被标记。

15

垃圾清除阶段


回收未被标记的对象内存空间,采用“标记-整理”算法清理Region。

16

对象的最终回收


当所有引用都被移除且无法再被访问时,对象被垃圾收集器回收,释放内存。

相关推荐

苹果要求全新App开发四月起必须支持“齐刘海”

今日消息,苹果公司通过邮件告知应用程序开发者,从2018年4月起提交给AppStore的所有新应用必须支持iPhoneX的超级视网膜显示器。这意味着新应用程序的开发者必须确保它们适应“齐刘海”,并...

耗时一年多,QEMU开发者成功在电脑上模拟了初版iPhone OS

IT之家12月24日消息,用户通过黑苹果(Hackintosh)工具,已经可以在非Mac设备上运行macOS系统。但由于种种限制,至今也没有多少人能够在PC上运行iOS系统。现...

下个月的WWDC后,苹果将发布原生Watch SDK测试版本

在近日Re/code举办的CodeConference上,苹果的运营副总裁JeffWilliams称,目前有4000多个AppleWatch应用上线,而未来的苹果表开发者套件,将允许开发者直接获...

苹果再次提醒:4月起强制要求APP进行适配

点击右上角关注我们,每天给您带来最新最潮的科技资讯,让您足不出户也知道科技圈大事!软件适配对于许多厂商来说都是一个比较头疼的事,苹果在握紧AppStore审核权的情况下情况要好许多。最近他们公布了...

苹果Xcode 16首个Beta版发布,AI代码补全最少需16GB内存

IT之家6月12日消息,在苹果WWDC24开发者大会上,苹果发布了iOS18、macOS15Sequoia等最新版本系统更新。与此同时,苹果推出了Xcode16开发工具的首...

传苹果已向特定开发者开放iWatch SDK

|责编:薄志强苹果会不会在这次发布会中发布全新的智能手表产品iWatch还很难说,不少人认为由于iWatch的消息少之又少,很可能这次还是没有iWatch。不过现在又有外媒传出消息称,苹果已经选定了...

苹果发布Swift 6语言:引入新测试框架、增强C++ 互操作性

IT之家9月20日消息,科技媒体devclass昨日(9月19日)报道,苹果公司在发布iOS/iPadOS18和macOS15Sequoia系统之外,还发布了Sw...

发布Siri SDK 之前苹果还是先想想这个问题

今年的GoogleI/O大会上,在预览GoogleHome时,我们就看到了设备可以互相对话的场景是多么惊艳,苹果快点跟上吧。最近因为亚马逊Echo和谷歌GoogleHome的火热...

iOS 17.2 SDK代码确认古尔曼爆料:免开箱更新苹果iPhone系统

IT之家10月27日消息,彭博社的马克古尔曼(MarkGurman)本月早些时候发布报道,称苹果正在研发新的系统,可以让员工在不拆开包装的情况下,升级iPhone的iOS系统。根据国...

《企业应用架构模式》之事件驱动架构

事件驱动架构(Event-DrivenArchitecture,EDA)是一种强调事件流和异步通信的应用程序架构。在该架构中,应用程序被分解为多个小型、可独立部署的组件,这些组件通过事件进行通信...

k8s中常用的controller以及用途和对应机制

controller的用途ReplicaSet、Deployment、StatefulSet:用于无状态和有状态应用的副本管理。DaemonSet:确保每个节点上都运行一个副本的控制器。...

Disruptor框架源码阅读-如何不重复消费

RingBuffer如何保证数据不丢失由于ringbuffer是一个环形的队列,那么生产者和消费者在遍历这个队列的时候,如何制衡呢?1、生产快,消费慢,数据丢失?生产者速度过快,导致一个对象还没消...

C# 控制电脑睡眠,休眠,关机以及唤醒

最近碰到一个关于芯片测试过程中的问题,这颗芯片是用在笔记本端口上,笔记本客户那边会有一个压力测试,就是频繁的电脑电源状态切换,S0(正常使用的开机状态),S3(睡眠模式),S4(休眠模式)以及S5(关...

大厂防止超卖的7种实现,很受用!(大厂防止超卖的7种实现,很受用的产品)

高并发场景在现场的日常工作中很常见,特别是在互联网公司中,这篇文章就来通过秒杀商品来模拟高并发的场景。本文环境:...

臻识车牌识别配制MQTT通讯,解析车号

在物联网项目中,我们的软件与车牌识别通讯,通常使用MQTT通讯更简单。...

取消回复欢迎 发表评论: