JVM
文章平均质量分 78
JVM
Java杨永杰
Java架构师,想要学习的技术点可以在评论区哦,会更新文章的~
展开
-
Jvm-方法区介绍
在 Java 虚拟机(JVM)中,方法区是一个逻辑上的区域,用于存储类的元数据信息,包括类的结构、方法、字段、常量等。方法区是线程共享的,因此在多个线程同时使用一个类时,它们可以共享类的元数据信息。原创 2024-01-12 15:53:42 · 849 阅读 · 0 评论 -
Java-OutOfMemoryError、StackOverflowError介绍
Java的OutofMemoryError是Java虚拟机发生内存溢出的错误。当Java虚拟机的堆内存不足以分配新的对象时,就会抛出OutOfMemoryErrorStackOverflowError是Java虚拟机在栈溢出时抛出的错误。当一个线程的调用栈(即方法的调用链)过深,超过了虚拟机所允许的最大深度,就会导致栈溢出。原创 2024-01-12 14:04:38 · 977 阅读 · 0 评论 -
JVM-类加载器
JVM中存在多个类加载器,每个类加载器负责加载特定位置的类。JVM中的类加载器层次结构如下:启动类加载器(Bootstrap Class Loader):它是JVM自带的类加载器,负责加载JVM运行时需要的核心类库,如java.lang包中的类。扩展类加载器(Extension Class Loader):它是由启动类加载器的子类加载器,负责加载JVM的扩展类库,如javax包中的类。原创 2024-01-11 14:32:26 · 857 阅读 · 0 评论 -
JVM垃圾回收算法
Java虚拟机(JVM)垃圾回收算法是一种自动内存管理机制,用于自动回收不再使用的Java对象的内存。以下是常见的JVM垃圾回收算法:标记清除算法(Mark and Sweep):遍历堆中的所有对象,标记存活对象,然后清除未被标记的对象。缺点是会产生内存碎片,导致效率低下。复制算法(Copying):将堆分为两个等大小的区域,只使用其中一个区域。当需要回收垃圾时,将存活对象复制到另一个区域,然后清除原区域中的所有对象。缺点是需要额外的空间,同时还不能处理大量存活对象的情况。原创 2023-12-09 14:16:54 · 943 阅读 · 0 评论 -
JVM内存结构
JVM的内存结构包括以下几个主要部分:程序计数器(Program Counter Register):用于存储当前线程正在执行的字节码指令的地址。Java虚拟机栈(Java Virtual Machine Stack):用于存储方法调用的局部变量、操作数栈、动态链接、方法出口等信息,每个线程都有自己的栈。本地方法栈(Native Method Stack):用于存储本地方法的信息。Java堆(Java Heap):用于存储对象实例,是JVM所管理的内存中最大的一块。原创 2023-12-09 14:08:40 · 873 阅读 · 0 评论 -
Java中四种引用类型(对象的强、软、弱和虚引用)
强引用:最常见的引用类型。如果一个对象有强引用,那么它就不会被垃圾回收器回收。软引用:如果一个对象只被软引用持有,那么当内存不足时,垃圾回收器会尽可能地回收这些对象。弱引用:如果一个对象只被弱引用持有,那么当垃圾回收器扫描到这个对象时,无论内存是否充足,都会回收该对象。虚引用:也称为幽灵引用或者幽灵参照。虚引用主要用于检测对象是否已经被垃圾回收器标记为即将回收的状态。如果一个对象只有虚引用,那么它和没有引用一样,随时可能被回收掉。原创 2023-12-02 16:17:37 · 860 阅读 · 0 评论 -
常用的 JVM 调优的参数都有哪些?
这些参数可以通过在启动命令行中添加对应的参数来进行 JVM 调优。原创 2023-11-30 15:10:13 · 497 阅读 · 0 评论 -
JVM对象如何分配内存 ?
指针碰撞:如果Java堆的内存是规整,即所有用过的内存放在一边,而空闲的的 放在另一边。分配内存时将位于中间的指针指示器向空闲的内存移动一段与对象大小 相等的距离,这样便完成分配内存工作。空闲列表:如果Java堆的内存不是规整的,则需要由虚拟机维护一个列表来记录 那些内存是可用的,这样在分配的时候可以从列表中查询到足够大的内存分配给对 象,并在分配后更新列表记录。选择哪种分配方式是由 Java 堆是否规整来决定的,而 Java 堆是否规整又由所 采用的垃圾收集器是否带有压缩整理功能决定。原创 2023-11-30 15:05:12 · 335 阅读 · 0 评论 -
JVM如何实现一个堆内存溢出
3.递归调用:递归调用会在每次调用时将一些数据压入堆栈中,如果递归调用的次数过多,就会导致堆栈溢出,从而导致堆内存溢出。需要注意的是,实现堆内存溢出可能会导致程序崩溃或者产生不可预知的结果,因此应该谨慎使用。1.创建大量的对象:在程序中创建大量的对象,并且保留对这些对象的引用,以便防止垃圾回收器回收,从而导致堆内存溢出。2.设置堆内存大小:可以通过在启动时设置堆内存大小限制,来限制堆内存的容量,从而导致堆内存溢出。堆内存溢出是指在程序运行时,当堆内存中的对象数量超过了堆的容量限制时,就会发生堆内存溢出。原创 2023-11-30 07:20:11 · 411 阅读 · 0 评论 -
JVM内存结构-直接内存
输出: 在进行10000000次分配操作时,堆内存 分配耗时:12ms 在进行10000000次分配操作时,直接内存 分配耗时:8233ms 在进行1000000000次读写操作时,非直接内存读写耗时:4055ms 在进行1000000000次读写操作时,直接内存读写耗时:745ms。非直接内存作用链: 本地IO –>直接内存–>非直接内存–>直接内存–>本地IO 直接内存作用链: 本地IO–>直接内存–>本地IO。直接内存IO读写的性能要优于普通的堆内存,在多次读写操作的情况下差异明显。原创 2023-11-29 14:46:52 · 397 阅读 · 0 评论 -
JDK1.8为什么要增加元空间,带来什么好处?
类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢 出,太大则容易导致老年代溢出。,如果发现某个加载器不再存货了,会把相关的空间整个回收。、字符串存在永久代中,容易出现性能问题和内存溢出。JDK 1.8 在1.7的基础上新增元空间。带来不必要的复杂度,并且回收效率偏低。,元空间里的对象的位置是固定的。,每个加载器有专门的存储空间。,不会单独回收某个类。原创 2023-11-26 17:54:34 · 535 阅读 · 0 评论 -
JVM常量池符号引用-常量类型和结构
之间,它决定了方法句柄的类型方法句柄类型的值表示方法句柄的字节码行为。值必须是对当前常量池的有效索引,常量池在该索引处的项必须是。值必须是对常量池的有效索引,常量池在该索引处的项必须是。指向该字段或方法描述符常量项的索引。指向该字段或方法名称常量项的索引。指向声明字段的类或接口描述符。结构,表示方法名和方法描述符。值必须是对常量池的有效索引。编码的字符串占用的字符数。指向全限定名常量项的索引。指向声明方法的接口描述符。指向声明方法的类描述符。结构,表示方法的描述符。字段或方法的符号引用。原创 2023-11-26 17:38:22 · 423 阅读 · 1 评论 -
JVM类加载过程 ?(概念)
虚拟机把描述类的数据加载到内存里面,并对数据进行校验、解析和初始化,最终变成可以被虚拟机直接使用的class对象类的整个生命周期包括: 加载 (Loading) 、验证 Verification) 、准备(Preparation)、解析Resolution)、初始化(lnitialization)、使用(Using)和卸载(Unloading)7个阶段。其中准备、验证、解析3个部分统称为连接 (Linking)。原创 2023-11-26 08:57:33 · 378 阅读 · 0 评论 -
JVM常见的垃圾回收器有哪些?(概念)
它的最大特点是在进行垃圾回收时,需要对所有正在执行的线程暂停 (stop the world) ,对于有些应用是难以接受的,但是如果应用的实时性要求不是那么高,只要停顿的时间控制在N毫秒之内,大多数应用还是可以接受的,是client级别的默认GC方式。不会产生空间碎片,可以精确地控制停顿,G1将整个堆分为大小相等的多个Region (区域),G1跟踪每个区域的垃圾大小,在后台维护一个优先级列表,每次根据允许的收集时间,优先回收价值最大的区域,已达到在有限时间内获取尽可能高的回收效率;原创 2023-11-25 20:19:03 · 869 阅读 · 0 评论 -
JVM堆是线程共享的吗?(TLAB)
为了保证对象的内存分配过程中的线程安全性,HotSpot虚拟机提供了一种叫做TLAB(Thread Local AllocationBuffer)的技术。TLAB是虚拟机在堆内存的eden划分出来的一块专用空间,是线程专属的。原创 2023-11-24 09:28:33 · 375 阅读 · 0 评论 -
JVM双亲委派原则
实现双亲委派的代码都集中在Java.lang.ClassLoader的loadClass0方法之中,先检查类是否已经被加载过,若没有加载则调用父加载器的loadClass0方法,若父加载器为空则默认使用启动类加载器作为父加载器。类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载。虚拟机认可(按文件名识别,如rt.jar)的类。原创 2023-11-23 16:15:18 · 849 阅读 · 0 评论 -
JVM判断对象是否存活之引用计数法、可达性分析
前言JVM有两种算法来判断对象是否存活,分别是引用计数法和可达性分析算法,针对引用计数法STW不足、内存消耗等问题下可依赖三色标记法解决。引用计数法概念对象中添加一个计数器,每当有一个地方引用它,计数器就加 1;如果引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的。优点这个方法实现简单,效率高。缺点很难解决对象之间相互循环引用,循环引引用会导致对象无法被回收,最终会导致内存泄漏及内存溢出。可达性分析概念通过一原创 2023-11-19 09:45:55 · 497 阅读 · 0 评论