首页 > 系统相关 >JVM原理(GC,内存),JAVA底层

JVM原理(GC,内存),JAVA底层

时间:2024-03-13 15:01:25浏览次数:24  
标签:线程 Java 对象 虚拟机 GC 内存 JVM JAVA 加载

1. JVM 内存模型

线程独占:栈,本地方法栈,程序计数器
线程共享:堆,方法区

2. 什么是栈

又称方法栈,线程私有的,线程执行方法是都会创建一个栈阵,用来存储局部变量表,操作栈,动
态链接,方法出口等信息.调用方法时执行入栈,方法返回式执行出栈.

3. 什么是本地方法栈

与栈类似,也是用来保存执行方法的信息.执行 Java 方法是使用栈,执行 Native 方法时使用本
地方法栈.

4. 什么是程序计数器

保存着当前线程执行的字节码位置,每个线程工作时都有独立的计数器,只为执行Java方法服
务,执行 Native 方法时,程序计数器为空.

5. 什么是堆

JVM 内存管理最大的一块,对被线程共享,目的是存放对象的实例,几乎所欲的对象实例都会
放在这里,当堆没有可用空间时,会抛出 OOM 异常.根据对象的存活周期不同,JVM 把对象进行
分代管理,由垃圾回收器进行垃圾的回收管理

6. 什么是方法区

又称非堆区,用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器优化后的代码等
数据.1.7 的永久代和 1.8 的元空间都是方法区的一种实现

7. 什么是 JVM 内存可见性

JMM 是定义程序中变量的访问规则,线程对于变量的操作只能在自己的工作内存中进行,而
不能直接对主内存操作.由于指令重排序,读写的顺序会被打乱,因此 JMM 需要提供原子性,可
见性,有序性保证.

8. 类加载与卸载

加载过程
其中验证,准备,解析合称链接加载通过类的完全限定名,查找此类字节码文件,利用字节码文
件创建 Class 对象.
验证确保 Class 文件符合当前虚拟机的要求,不会危害到虚拟机自身安全.
准备进行内存分配,为 static 修饰的类变量分配内存,并设置初始值(0 或 null).不包含 final 修饰
的静态变量,因为 final 变量在编译时分配.
解析将常量池中的符号引用替换为直接引用的过程.直接引用为直接指向目标的指针或者相
对偏移量等.
初始化主要完成静态块执行以及静态变量的赋值.先初始化父类,再初始化当前类.只有对类
主动使用时才会初始化.
触发条件包括,创建类的实例时,访问类的静态方法或静态变量的时候,使用 Class.forName 反
射类的时候,或者某个子类初始化的时候.
Java 自带的加载器加载的类,在虚拟机的生命周期中是不会被卸载的,只有用戶自定义的加载
器加载的类才可以被卸.
1、加载机制-双亲委派模式
双亲委派模式,即加载器加载类时先把请求委托给自己的父类加载器执行,直到顶层的启动类
加载器.父类加载器能够完成加载则成功返回,不能则子类加载器才自己尝试加载.*
优点:

  1. 避免类的重复加载
  2. 避免 Java 的核心 API 被篡改

9. 分代回收

分代回收基于两个事实:大部分对象很快就不使用了,还有一部分不会立即无用,但也不会持
续很长时间.
年轻代->标记-复制
老年代->标记-清除

10. 回收算法

a、G1 算法
1.9 后默认的垃圾回收算法,特点保持高回收率的同时减少停顿.采用每次只清理一部分,而不
是清理全部的增量式清理,以保证停顿时间不会过 其取消了年轻代与老年代的物理划分,但
仍属于分代收集器,算法将堆分为若干个逻辑区域(region),一部分用作年轻代,一部分用作老
年代,还有用来存储巨型对象的分区.
同 CMS 相同,会遍历所有对象,标记引用情况,清除对象后会对区域进行复制移动,以整合碎片
空间.
年轻代回收:
并行复制采用复制算法,并行收集,会 StopTheWorld.
老年代回收:
会对年轻代一并回收
初始标记完成堆 root 对象的标记,会 StopTheWorld.
并发标记 GC 线程和应用线程并发执行.
最终标记完成三色标记周期,会 StopTheWorld.
复制/清楚会优先对可回收空间加大的区域进行回收
b、ZGC 算法
前面提供的高效垃圾回收算法,针对大堆内存设计,可以处理TB级别的堆,可以做到10ms以下
的回收停顿时间.
着色指针
读屏障
并发处理
基于 region
内存压缩(整理)
roots 标记:标记 root 对象,会 StopTheWorld.
并发标记:利用读屏障与应用线程一起运行标记,可能会发生 StopTheWorld.
清除会清理标记为不可用的对象.
roots 重定位:是对存活的对象进行移动,以腾出大块内存空间,减少碎片产生.重定位最开始
会 StopTheWorld,却决于重定位集与对象总活动集的比例.并发重定位与并发标记类似.

11. JVM 内存模型简介

JVM 定义了不同运行时数据区,他们是用来执行应用程序的。某些区域随着 JVM 启动及销
毁,另外一些区域的数据是线程性独立的,随着线程创建和销毁。
JVM 在执行 Java 程序时,会把它管理的内存划分为若干个的区域,每个区域都有自己的用
途和创建销毁时间。可以分为两大部分,线程私有区和共享区。
(JVM 内存分为线程私有区和线程共享区)

12. 线程私有区

1、程序计数器
当同时进行的线程数超过 CPU 数或其内核数时,就要通过时间片轮询分派 CPU 的时间资源,
不免发生线程切换。这时,每个线程就需要一个属于自己的计数器来记录下一条要运行的指
令。如果执行的是 JAVA 方法,计数器记录正在执行的 java 字节码地址,如果执行的是 native
方法,则计数器为空。
2、虚拟机栈
线程私有的,与线程在同一时间创建。管理 JAVA 方法执行的内存模型。每个方法执行时都
会创建一个桢栈来存储方法的的变量表、操作数栈、动态链接方法、返回值、返回地址等信
息。栈的大小决定了方法调用的可达深度(递归多少层次,或嵌套调用多少层其他方法,-Xss
参数可以设置虚拟机栈大小)。栈的大小可以是固定的,或者是动态扩展的。如果请求的栈
深度大于最大可用深度,则抛出 stackOverflowError;如果栈是可动态扩展的,但没有内存
空间支持扩展,则抛出 OutofMemoryError。
3、本地方法栈
与虚拟机栈作用相似。但它不是为 Java 方法服务的,而是本地方法(C 语言)。由于规范对
这块没有强制要求,不同虚拟机实现方法不同。

13. 线程共享区

1、方法区
线程共享的,用于存放被虚拟机加载的类的元数据信息,如常量、静态变量和即时编译器编
译后的代码。若要分代,算是永久代(老年代),以前类大多“static”的,很少被卸载或收
集,现回收废弃常量和无用的类。其中运行时常量池存放编译生成的各种常量。 (如果 hotspot
虚拟机确定一个类的定义信息不会被使用,也会将其回收。回收的基本条件至少有:所有该
类的实例被回收,而且装载该类的 ClassLoader 被回收)
2、堆
存放对象实例和数组,是垃圾回收的主要区域,分为新生代和老年代。刚创建的对象在新生
代的 Eden 区中,经过 GC 后进入新生代的 S0 区中,再经过 GC 进入新生代的 S1 区中,15
次 GC 后仍存在就进入老年代。这是按照一种回收机制进行划分的,不是固定的。若堆的空
间不够实例分配,则 OutOfMemoryError。

14. 堆和栈的区别

5、堆和栈的区别
栈是运行时单位,代表着逻辑,内含基本数据类型和堆中对象引用,所在区域连续,没有碎
片;堆是存储单位,代表着数据,可被多个栈共享(包括成员中基本数据类型、引用和引用
对象),所在区域不连续,会有碎片。
1、功能不同
栈内存用来存储局部变量和方法调用,而堆内存用来存储 Java 中的对象。无论是成员变量,
局部变量,还是类变量,它们指向的对象都存储在堆内存中。
2、共享性不同
栈内存是线程私有的。
堆内存是所有线程共有的。
3、异常错误不同
如果栈内存或者堆内存不足都会抛出异常。
栈空间不足:java.lang.StackOverFlowError。
堆空间不足:java.lang.OutOfMemoryError。
4、空间大小
栈的空间大小远远小于堆的。

15. 什么时候会触发 FullGC

除直接调用 System.gc 外,触发 Full GC 执行的情况有如下四种。

  1. 旧生代空间不足
  2. Permanet Generation 空间满
  3. CMS GC 时出现 promotion failed 和 concurrent mode failure
  4. 统计得到的 Minor GC 晋升到旧生代的平均大小大于旧生代的剩余空间

16. 什么是 Java 虚拟机?为什么 Java 是 被称作是 “ 平台无关

的编程语言 ” ?
Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟
机执行的字节码文件。 Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序
员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬
件平台的指令 度和其他特性。

17. Java 内存结构

方法区和对是所有线程共享的内存区域;而 java 栈、本地方法栈和程序员计数器是运行是
线程私有的内存区域。

  1. Java 堆(Heap),是 Java 虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的
    一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有
    的对象实例都在这里分配内存。
  2. 方法区(Method Area),方法区(Method Area)与 Java 堆一样,是各个线程共享的内存
    区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等
    数据。
  3. 程序计数器(Program Counter Register),程序计数器(Program Counter Register)是一块
    较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。
  4. JVM 栈(JVM Stacks),与程序计数器一样,Java 虚拟机栈(Java Virtual Machine Stacks)也
    是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是 Java 方法执行的内存模型:
    每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、
    动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在
    虚拟机栈中从入栈到出栈的过程。
  5. 本地方法栈(Native Method Stacks),本地方法栈(Native Method Stacks)与虚拟机栈所
    发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行 Java 方法(也就是字节码)
    服务,而本地方法栈则是为虚拟机使用到的 Native 方法服务。

18. 对象分配规则

对象优先分配在 Eden 区,如果 Eden 区没有足够的空间时,虚拟机执行一次 Minor GC。
大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免
在 Eden 区和两个 Survivor 区之间发生大量的内存拷 (新生代采用复制算法收集内存)。
期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了 1
次 Minor GC 那么对象会进入 Survivor 区,之后每经过一次 Minor GC 那么对象的年龄加 1,
知道达到阀值对象进入老年区。
动态判断对象的年龄。如果 Survivor 区中相同年龄的所有对象大小的总和大于 Survivor 空间
的一半,年龄大于或等于该年龄的对象可以直接进入老年代。
空间分配担保。每次进行 Minor GC 时,JVM 会计算 Survivor 区移至老年区的对象的平均大
小 , 如 果 这 个 值 大 于 老 年 区 的 剩 余 值 大 小 则 进 行 一 次 Full GC , 如 果 小 于 检 查
HandlePromotionFailure 设置,如果 true 则只进行 Monitor GC,如果 false 则进行 Full GC。

19. 描述一下 JVM 加载 class 文件的原理机制?

JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java 中的类加载器是一
个重要的 Java 运行时系统组件,它负责在运行时查找和装入类文件中的类。 由于 Java 的跨
平台性,经过编译的 Java 源程序并不是一个可执行程序,而是一个或多个类文件。当 Java
程序需要使用某个类时,JVM 会确保这个类已经被加载、连接(验证、准备和解析)和初始
化。类的加载是指把类的.class 文件中的数据读入到内存中,通常是创建一个字节数组读
入.class 文件,然后产生与所加载类对应的 Class 对象。加载完成后,Class 对象还不完整,
所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态
变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后
JVM 对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就
先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。 类的加载是由
类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加
载器(System)
和用戶自定义类加载器(java.lang.ClassLoader 的子类)。从 Java 2(JDK 1.2)开始,类加载过
程采取了父亲委托机制(PDM)。PDM 更好的保证了 Java 平台的安全性,在该机制中,JVM
自带的 Bootstrap 是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请
求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM 不会向 Java
程序提供对 Bootstrap 的引用。下面是关于几个类加载器的说明:
Bootstrap:一般用本地代码实现,负责加载 JVM 基础核心类库(rt.jar);
Extension:从 java.ext.dirs 系统属性所指定的目录中加载类库,它的父加载器是 Bootstrap;
System:又叫应用类加载器,其父类是 Extension。它是应用最广泛的类加载器。它从环境
变量 classpath 或者系统属性 java.class.path 所指定的目录中记载类,是用戶自定义加载器的
默认父加载器。

20. Java 对象创建过程

  1. JVM 遇到一条新建对象的指令时首先去检查这个指令的参数是否能在常量池中定义到一
    个类的符号引用。然后加载这个类(类加载过程在后边讲)
  2. 为对象分配内存。一种办法“指针碰撞”、一种办法“空闲列表”,最终常用的办法“本
    地线程缓冲分配(TLAB)”
  3. 将除对象头外的对象内存空间初始化为 0
  4. 对对象头进行必要设置

21. 类的生命周期

类的生命周期包括这几个部分,加载、连接、初始化、使用和卸载,其中前三部是类的加载
的过程,如下;

  1. 加载,查找并加载类的二进制数据,在 Java 堆中也创建一个 java.lang.Class 类的对象
    连接,连接又包含三块内容:验证、准备、初始化。 1)验证,文件格式、元数据、字节码、
    符号引用验证; 2)准备,为类的静态变量分配内存,并将其初始化为默认值; 3)解析,
    把类中的符号引用转换为直接引用初始化,为类的静态变量赋予正确的初始值
  2. 使用,new 出对象程序中使用
  3. 卸载,执行垃圾回收

22. 简述 Java 的对象结构

Java 对象由三个部分组成:对象头、实例数据、对齐填充。

  1. 对象头由两部分组成,第一部分存储对象自身的运行时数据:哈希码、GC 分代年龄、锁
    标识状态、线程持有的锁、偏向线程 ID(一般占 32/64 bit)。第二部分是指针类型,指向对
    象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中还有一部分用来记
    录数组长度。
  2. 实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的)
  3. 对齐填充:JVM 要求对象起始地址必须是 8 字节的整数倍(8 字节对 )

23. 如何判断对象可以被回收?

判断对象是否存活一般有两种方式:
引用计数:每个对象有一个引用计数属性,新增一个引用时计数加 1,引用释放时计数减 1,
计数为 0 时可以回收。此方法简单,无法解决对象相互循环引用的问题。
可达性分析(Reachability Analysis):从 GC Roots 开始向下搜索,搜索所走过的路径称为引
用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的,不可达
对象。

24. JVM 的永久代中会发生垃圾回收么?

垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收
(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是
为什么正确的永久代大小对避免 Full GC 是非常重要的原因。请参考下 Java8:从永久代到元
数据区 (注:Java8 中已经移除了永久代,新加了一个叫做元数据区的 native 内存区)

25. jvm 调优命令有哪些?

Sun JDK 监控和故障处理命令有 jps jstat jmap jhat jstack jinfo
jps,JVM Process Status Tool,显示指定系统内所有的 HotSpot 虚拟机进程。
jstat,JVM statistics Monitoring 是用于监视虚拟机运行时状态信息的命令,它可以显示出虚
拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据。
jmap,JVM Memory Map 命令用于生成 heap dump 文件
jhat,JVM Heap Analysis Tool 命令是与 jmap 搭配使用,用来分析 jmap 生成的 dump,jhat 内
置了一个微型的 HTTP/HTML 服务器,生成 dump 的分析结果后,可以在浏览器中查看 jstack,
用于生成 java 虚拟机当前时刻的线程快照。
jinfo,JVM Configuration info 这个命令作用是实时查看和调整虚拟机运行参数。

26. jvm 调优工具

常用调优工具分为两类,jdk 自带监控工具:jconsole 和 jvisualvm,第三方有:MAT(Memory
Analyzer Tool)、GChisto。
jconsole,Java Monitoring and Management Console 是从 java5 开始,在 JDK 中自带的 java 监
控和管理控制台,用于对 JVM 中内存,线程和类等的监控
jvisualvm,jdk 自带全能工具,可以分析内存快照、线程快照;监控内存变化、GC 变化等。
MAT,Memory Analyzer Tool,一个基于 Eclipse 的内存分析工具,是一个快速、功能丰富的 Java
heap 分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 GChisto,一款专业分析 gc
日志的工具

27. Minor GC 与 与 Full GC 分别在什么时候发生?

Minor GC:新生代内存不够用时候发生 MGC 也叫 YGC
Full GC:JVM 内存不够的时候发生 FGC

28. 你知道哪些 JVM 性能调优

  1. 设定堆内存大小
    -Xmx:堆内存最大限制。
    设定新生代大小。 新生代不宜太小,否则会有大量对象涌入老年代
    -XX:NewSize:新生代大小
    -XX:NewRatio 新生代和老生代占比
    -XX:SurvivorRatio:伊甸园空间和幸存者空间的占比
  2. 设定垃圾回收器 年轻代用 -XX:+UseParNewGC 年老代用-XX:+UseConcMarkSweepGC

29. JVM 内存分哪几个区,每个区的作用是什么?

Java 虚拟机主要分为以下几个区:
方法区:

  1. 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生 GC,在这里进
    行的 GC 主要是对方法区里的常量池和对类 型的卸载
  2. 方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后
    的代码等数据。
  3. 该区域是被线程共享的。
  4. 方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池
    具有动态性,也就是说常量并不一定是编 译时确定,运行时生成的常量也会存在这个常量
    池中。
    虚拟机栈:
  5. 虚拟机栈也就是我们平常所称的栈内存,它为 java 方法服务,每个方法在执行的时候都会
    创建一个栈帧,用于存储局部变量表、操 作数栈、动态链接和方法出口等信息。
  6. 虚拟机栈是线程私有的,它的生命周期与线程相同。
  7. 局部变量表里存储的是基本数据类型、returnAddress 类型(指向一条字节码指令的地址)
    和对象引用,这个对象引用有可能是指 向对象起始地址的一个指针,也有可能是代表对象
    的句柄或者与对象相关联的位置。局部变量所需的内存空间在编译器间确定
  8. 操作数栈的作用主要用来存储运算结果以及运算的操作数,它不同于局部变量表通过索
    引来访问,而是压栈和出栈的方式
  9. 每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了
    支持方法调用过程中的动态连接.动态链接就是将常量池中的符号引用在运行期转化为直接
    引用。
    本地方法栈
    本地方法栈和虚拟机栈类似,只不过本地方法栈为 Native 方法服务。

    Java 堆是所有线程所共享的一块内存,在虚拟机启动时创建,几乎所有的对象实例都在这里
    创建,因此该区域经常发生垃圾回收操作 。
    程序计数器
    内存空间小,字节码解释器工作时通过改变这个计数值可以选取下一条需要执行的字节码指
    令,分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成。该内存区
    域是唯一一个 java 虚拟机规范没有规定任何 OOM 情况的区域。

30. 简述 Java 垃圾回收机制?

在 Java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在
JVM 中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟
机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们
添加到要回收的集合中,进行回收。

31. 什么是类加载器,类加载器有哪些?

实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。
主要有一下四种类加载器:

  1. 启动类加载器(Bootstrap ClassLoader)用来加载 java 核心类库,无法被 java 程序直接引用。
  2. 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会
    提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
  3. 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java
    类 。 一 般 来 说 , Java 应 用 的 类 都 是 由 它 来 完 成 加 载 的 。 可 以 通 过
    ClassLoader.getSystemClassLoader()来获取它。
  4. 用戶自定义类加载器,通过继承 java.lang.ClassLoader 类的方式实现。

32. 你有没有遇到过 过OutOfMemory 问题?你是怎么来处理

这个问题的?处理的过程中有哪些收获?
常见的原因:
内存加载的数据量太大:一次性从数据库取太多数据;
集合类中有对对象的引用,使用后未清空,GC 不能进行回收;代码中存在循环产生过多的
重复对象;启动参数堆内存值小。

33. JDK 1.8之 之后 后Perm Space 有哪些变动? MetaSpace 大小默

认是无限的么? 还是你们会通过什么方式来指定大小?
JDK 1.8 后用元空间替代了 Perm Space;字符串常量存放到堆内存中。
MetaSpace 大小默认没有限制,一般根据系统内存的大小。JVM 会动态改变此值。
-XX:MetaspaceSize:分配给类元数据空间(以字节计)的初始大小(Oracle 逻辑存储上的初
始高水位,the initial high-water-mark)。此值为估计值,MetaspaceSize 的值设置的过大会延
垃圾回收时间。垃圾回收过后,引起下一次垃圾回收的类元数据空间的大小可能会变大。
-XX:MaxMetaspaceSize:分配给类元数据空间的最大值,超过此值就会触发 Full GC,此值默
认没有限制,但应取决于系统内存的大小。JVM 会动态地改变此值。

34. 解释内存中的栈(stack) 、堆(heap) 和方法区(method

area) 的用法。
通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都
使用 JVM 中的栈空间;
而通过 new 关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,
由于现在的垃圾收集器都采用分代收集算法,所以堆空间还可以细分为新生代和老生代,再
具体一点可以分为 Eden、Survivor(又可分为 From Survivor 和 To Survivor)、Tenured;
方法区和堆都是各个线程共享的内存区域,用于存储已经被 JVM 加载的类信息、常量、静
态变量、JIT 编译器编译后的代码等数据;程序中的字面量(literal)如直接书写的 100、”hello”
和常量都是放在常量池中,常量池是方法区的一部分。栈空间操作起来最快但是栈很小,通
常大量的对象都是放在堆空间,栈和堆的大小都可以通过 JVM 的启动参数来进行调整,栈
空间用光了会引发 StackOverflowError,而堆和常量池空间不足则会引发 OutOfMemoryError。

35. heap 和 和 stack 有什么区别。

栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行
处理。
堆是栈的一个组成元素

36. GC 是什么? 为什么要有 GC?

GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或
者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测
对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显
示操作方法。

小白路漫漫,让我们一起加油!!!

标签:线程,Java,对象,虚拟机,GC,内存,JVM,JAVA,加载
From: https://blog.csdn.net/weixin_52473844/article/details/136623605

相关文章

  • JAVA的多线程及并发
    1.Java中实现多线程有几种方法继承Thread类;实现Runnable接口;实现Callable接口通过FutureTask包装器来创建Thread线程;使用ExecutorService、Callable、Future实现有返回结果的多线程(也就是使用了ExecutorService来管理前面的三种方......
  • springboot/java/php/node/python小区物业管理小程序【计算机毕设】
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着城市化进程的加速,住宅小区作为城市生活的基本单元,其管理效率和服务质量直接影响着居民的生活体验。传统的物业管理方式往往依赖于人工操作,不仅耗时......
  • java面向全面发展的数计学院第二课堂与社团管理系统(ssm)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在当前的教育体系中,第一课堂(即传统的课堂教学)虽然扮演着核心角色,但随着素质教育的深入推进和学生个性化发展需求的日益增长,第二课堂和社团活动逐渐显示出......
  • java面向特定群体的健康管理平台(ssm)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在当今社会,随着科技的飞速发展和生活节奏的加快,人们对健康管理的需求日益增长。特别是对于特定群体,如老年人、慢性病患者、孕妇等,他们需要更加细致、专业......
  • springboot/java/php/node/python企业微培训小程序【计算机毕设】
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着科技的迅猛发展,移动互联网已成为企业培训的新阵地。传统的面对面培训模式因其时间、地点的限制性逐渐显得不够灵活,而小程序作为一种轻量级的应用,能够......
  • Java获取堆栈信息的3种方法
    本文分享自华为云社区《Java如何获取堆栈信息》,作者:皮牙子抓饭。在Java编程中,获取堆栈信息对于调试和故障排除非常重要。Java提供了多种方式来获取当前线程的堆栈信息,以便了解线程执行的情况。下面介绍几种常用的方法:1.使用Thread.currentThread().getStackTrace()可以通过Th......
  • 北大最新综述精读:RAG在AIGC中的前世今生,覆盖300篇论文!
    ©作者|Haoyang来源|神州问学如果你对这篇文章感兴趣,而且你想要了解更多关于AI领域的实战技巧,可以关注「神州问学」公众号。在这里,你可以看到最新最热的AIGC领域的干货文章和前沿资讯。引言:人工智能生成内容(AIGC)的不断发展得益于模型算法、可扩展的模型价格以及大规模......
  • 优秘智能开源AICMS:快速开发AIGC应用的必备,SAAS营销管理和AI的API全方位接入
    随着人工智能技术的飞速发展,AIGC(AIGeneratedContent)已经成为了当今科技领域的热门话题。为了帮助更多的企业和开发者快速开发AIGC应用,优秘智能近日开源了其强大的AICMS(AIContentManagementSystem)平台,助力开发者高效构建各类AIGC应用。一、优秘智能AICMS简介优秘智能是......
  • 基于Java+Vue+Mysql的门店管理系统(附配套文档和源码)【毕业设计分享】
          前言:门店管理系统是一个综合性的软件解决方案,旨在帮助门店高效地管理日常运营、提升服务质量、优化资源配置和增强决策能力。以下是您提到的各个管理模块的简要概述:门店管理:门店信息管理:记录门店的基本信息,如门店名称、地址、联系方式、营业时间等。门店布局管......
  • 基于Java+Vue+Mysql的WMS仓库管理系统(附配套文档和源码)【毕业设计分享】
          前言: WMS(WarehouseManagementSystem)仓库管理系统是一个用于优化仓库操作、提高效率和准确性的软件解决方案。以下是针对列出的WMS仓库管理系统的各个部分的简要描述:1.订单管理订单管理是WMS的核心功能之一,涉及处理、跟踪和完成客户订单。这包括:订单录入:......