一起学Java虚拟机(一),学习SpringBoot

本文详细介绍了Java堆、方法区、直接内存的内存管理,对象的创建、内存布局和访问定位,以及垃圾收集的原理(引用计数、可达性分析和各种算法)。此外,还提到了Java开发的学习资源和面试准备策略。
摘要由CSDN通过智能技术生成

Java堆

  • 是虚拟机所管理的内存中最大的一块
  • 所有的对象实例以及数组都应当在堆上分配
  • Java堆是被所有线程共享的一块内存区域
  • 所有线程共享的Java堆中可以划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)Java堆内存是线程共享的!面试官:你确定吗?
  • Java堆既可以被实现成固定大小的,也可以是可扩展的,不过当前主流的Java虚拟机都是按照可扩展来实现的(通过参数-Xmx和-Xms设定)。如果在Java堆中没有内存完成实例分配,并且堆也无法再扩展时,Java虚拟机将会抛出OutOfMemoryError异常。

方法区

  • 与Java堆一样,是各个线程共享的内存区域
  • 它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据
  • 在JDK 8完全废弃了永久代的概念,改用元空间来代替。
  • 运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中
  • 运行期间也可以将新的常量放入池:比如String类的intern()方法
  • 如果方法区无法满足新的内存分配需求时,将抛出OutOfMemoryError异常。

直接内存

  • 并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域
  • 在JDK 1.4中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。
  • 会受到本机总内存(包括物理内存、SWAP分区或者分页文件)大小以及处理器寻址空间的限制,而导致动态扩展时出现OutOfMemoryError异常

Hotspot虚拟机对象

对象的创建

  1. 当Java虚拟机遇到一条字节码new指令时,检查是否类已加载、解析、初始化,如果没有,则进行类加载
  2. 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。
  3. 线程安全解决方案:1、CAS+失败重试保证更新操作的原子性 2、TLAB把内存分配的动作按照线程划分在不同的空间进行
  4. 内存分配完成之后,虚拟机必须将分配到的内存空间(但不包括对象头)都初始化为零值
  5. 接下来,Java虚拟机还要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码(实际上对象的哈希码会延后到真正调用Object::hashCode()方法时才计算)、对象的GC分代年龄等信息。这些信息存放在对象的对象头(Object Header)之中。根据虚拟机当前运行状态的不同,如是否启用偏向锁等,对象头会有不同的设置方式。
  6. new指令之后会接着执行()方法,按照程序员的意愿对对象进行初始化,这样一个真正可用的对象才算完全被构造出来

对象的内存布局

  • 在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)
  • 对象头包括:对象自身的运行时数据(Mark Word),所属类类指针,数组长度(如果是数组对象)

image.png

对象的访问定位

  • Java程序会通过栈上的reference数据来操作堆上的具体对象。
  • 对象访问方式也是由虚拟机实现而定的,主流的访问方式主要有使用句柄和直接指针两种

垃圾收集(GC)

对象的死亡

引用计数法
  • 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。
  • 互相循环引用的对象无法被回收

image.png

可达性分析法
  • 通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连,或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的

image.png

  • 可作为GC Roots的对象
  1. 虚拟机栈(栈帧中的本地变量表)中引用的对象
  2. 在方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 在本地方法栈中JNI(即通常所说的Native方法)引用的对象
  5. Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如NullPointExcepiton、OutOfMemoryError)等,还有系统类加载器
  6. 所有被同步锁(synchronized关键字)持有的对象
  7. 反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等
四种引用
  • 强引用(Strongly Re-ference):无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象
  • 软引用(Soft Reference):只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常
  • 弱引用(Weak Reference):当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉只被弱引用关联的对象
  • 虚引用(Phantom Reference):为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知( 虚引用必须与ReferenceQueue一起使用,当GC准备回收一个对象,如果发现它还有虚引用,就会在回收之前,把这个虚引用加入到与之关联的ReferenceQueue中)
宣告对象死亡
  • 要真正宣告一个对象死亡,至少要经历两次标记过程
  • 首先对象不可达,它将会被第一次标记,随后进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。
  • 如果这个对象被判定为确有必要执行finalize()方法,那么该对象将会被放置在一个名为F-Queue的队列之中,并在稍后由一条由虚拟机自动建立的、低调度优先级的Finalizer线程去执行它们的finalize()方法。
  • 如果对象要在finalize()中成功拯救自己——只要重新与引用链上的任何一个对象建立关联即可
  • 如果第二次标记时对象没有逃脱,那基本上它就真的要被回收了

垃圾收集算法

标记-清除算法(Mark-Sweep)
  • 首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。
  • 缺点:1、执行效率不稳定 2、 是内存空间的碎片化问题

image.png

标记-复制算法(Semispace Copying)
  • 将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。解决内存碎片化问题。
  • 缺点:空间浪费

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

img
img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
img

难道这样就够了吗?不,远远不够!

提前多熟悉阿里往年的面试题肯定是对面试有很大的帮助的,但是作为技术性职业,手里有实打实的技术才是你面对面试官最有用的利器,这是从内在散发出来的自信。

备战阿里时我花的最多的时间就是在学习技术上,占了我所有学习计划中的百分之70,这是一些我学习期间觉得还是很不错的一些学习笔记

我为什么要写这篇文章呢,其实我觉得学习是不能停下脚步的,在网络上和大家一起分享,一起讨论,不单单可以遇到更多一样的人,还可以扩大自己的眼界,学习到更多的技术,我还会在csdn、博客、掘金等网站上分享技术,这也是一种学习的方法。

今天就分享到这里了,谢谢大家的关注,以后会分享更多的干货给大家!

阿里一面就落马,恶补完这份“阿里面试宝典”后,上岸蚂蚁金服

阿里一面就落马,恶补完这份“阿里面试宝典”后,上岸蚂蚁金服

image.png

的干货给大家!

[外链图片转存中…(img-TMbRH2hW-1711601727608)]

[外链图片转存中…(img-QWf0uek3-1711601727608)]

[外链图片转存中…(img-AsmduCy1-1711601727608)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值