JVM
文章平均质量分 87
JFS_Study
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
展开
-
JVM 的类加载原理
一、什么是类加载器(ClassLoader)类加载器是指在系统运行过程中动态的将字节码文件加载到 JVM 中的工具,是一个类。基于这个工具的整套类加载流程,称作类加载机制。在 IDE 中编写的都是源代码文件,以后缀名为.java的文件形式存在于磁盘上,经过编译后生成后缀名为.class的字节码文件,类加载器加载的就是这些字节码文件。首先 Java 源代码(.java)文件会被 Java 编译器编译为字节码(.class)文件,然后由 JVM 中的类加载器加载各个类的字节码文件,加载完毕之后,交由 JV.原创 2021-07-29 15:21:35 · 1778 阅读 · 0 评论 -
运行时数据区(Runtime Data Area)
运行时数据区(Runtime Data Area)原创 2022-01-07 10:44:09 · 967 阅读 · 0 评论 -
Java内存溢出及解决:OutOfMemoryError 和 StackOverflowError
Java内存溢出及解决:OutOfMemoryError 和 StackOverflowError原创 2021-07-29 15:27:39 · 5661 阅读 · 0 评论 -
如何让 JVM 几乎不发生 full gc
一、业务流程简图二、问题分析1️⃣一个 4 核 8G 的订单系统,假设给 JVM 运行内存为 3 个G,根据堆内存划分比例老年代可分 2G,Eden 800M,S0/S1 各 100M。2️⃣线程运行每秒产生 60M 对象,大概运行 13 秒就会占满 Eden 区,前 12 秒产生的对象在做一个 minor gc 后被当作垃圾对象处理掉,第 13 秒产生的对象不是垃圾对象,会被放到 S0 区。3️⃣第 13 秒产生的 60M 对象由于大于 S0 区的 50% 所以会被放到老年代。为了能更好地适应原创 2022-01-13 14:18:36 · 1542 阅读 · 0 评论 -
JVM 调优
一、什么情况下GC会对程序产生影响无论 Minor GC/Young GC 还是 Full GC,都会造成一定程度的程序卡顿,即Stop The World:JVM 因为执行 GC 线程,其他工作线程被挂起。它会在任何一种 GC 算法中发生,即使采用 ParNew、CMS 或者 G1 这些更先进的垃圾回收算法,也只是在减少卡顿时间,而并不能完全消除卡顿。当stop-the-world发生时,除 GC 所需的线程外,所有的线程都进入等待状态,直到 GC 任务完成。GC 优化很多时候就是减少 stop-the原创 2022-01-13 14:19:08 · 505 阅读 · 0 评论 -
JVM的垃圾回收
GC(Garbage Collection)原创 2021-07-29 15:24:03 · 510 阅读 · 0 评论 -
关键字 volatile
一、volatile 关键字volatile 可以说是 JVM 提供的最轻量级的同步机制,当一个变量定义为 volatile 之后,它将具备两种特性:1️⃣可以保证在多线程环境下,变量的修改可见性。每个线程都会在工作内存(类似于寄存器和高速缓存)中,实例对象都存放在主内存中。在每个线程要使用的时候把主内存中的内容拷贝到线程的工作内存中。volatile 修饰的变量,保证每次修改了变量立即写回主内存中,同时通知所有的该对变量的缓存失效,保证缓存一致性,其他线程需要使用该共享变量时就要重新从主内存中获取最原创 2021-07-02 10:06:20 · 444 阅读 · 0 评论 -
Java 内存模型(Java Memory Model)
一、概述Java 内存区域和内存模型是不一样的东西,内存区域是指 JVM 运行时将数据分区域存储,强调对内存空间的划分,即运行时数据区(Runtime Data Area)。内存模型(Java Memory Model,简称 JMM)是定义了线程和主内存之间的抽象关系,即 JMM 定义了 JVM 在计算机内存(RAM)中的工作方式。二、Java 内存模型(JMM)JMM 是共享内存的并发模型,线程之间主要通过读-写共享变量(堆内存中的实例域,静态域和数组元素)来完成隐式通信。JMM 控制 Java原创 2021-07-29 15:25:08 · 22348 阅读 · 4 评论 -
JVM 包含两个子系统和两个组件
JVM 组成原创 2022-06-11 12:20:17 · 901 阅读 · 0 评论 -
缓存一致性问题和 MESI 协议
一、高速缓存高速缓存是一种存取速率远比主内存大,而容量远比主内存小的处理器存储部件。引入高速缓存之后,处理器在执行内存读、写操作的时候并不直接与主内存打交道,而是通过高速缓存进行的。变量名相当于内存地址,而变量值则相当于相应内存空间所存储的数据。高速缓存又可以分为指令缓存和数据缓存。指令缓存用来缓存程序的代码,数据缓存用来缓存程序的数据。【一级缓存(L1 Cache)】本地 core 的缓存,分成 32K 的数据缓存 L1d 和 32k 指令缓存 L1i,访问 L1 需要 3 cycles,耗时大约原创 2022-03-04 09:04:54 · 370 阅读 · 0 评论 -
Java 中的四种(强、软、弱和虚)引用
一、强引用(StrongReference)强引用很常见,其写法如下:StringBuffer buffer = new StringBuffer();上面创建了一个 StringBuffer 对象,并将这个对象的(强)引用存到变量 buffer 中。强引用最重要的就是它能够让引用变得强(Strong),这就决定了它和垃圾回收器的交互。具体来说,如果一个对象通过一串强引用链接可到达(Strongly reachable),它是不会被回收的。如果不想让正在使用的对象被回收,这正是所需要的。但是强引用原创 2022-02-21 16:55:16 · 4560 阅读 · 0 评论 -
JVM 内存划分的原因
Java 内存模型(Java Memory Model)一、堆区为什么要分为新生代和老年代因为有的对象寿命长,有的对象寿命短。应该将寿命长的对象放在一个区,寿命短的对象放在一个区。不同的区采用不同的垃圾收集算法。寿命短的区清理频次高一点,寿命长的区清理频次低一点。提高效率。1️⃣为什么要有 Survivor 区如果没有 Survivor 区,那么 Eden 每次满了清理垃圾,存活的对象被迁移到老年区,老年区满了,就会触发Full GC,Full GC是非常耗时的,解决办法:①增加老年代内存,那么原创 2022-02-21 16:48:11 · 1417 阅读 · 0 评论 -
当User user = new User()时,JVM 做了什么
Java程序的初始化顺序一、对象的访问Java 中,操作一个对象是通过指向这个对象的引用。对象存在堆中,这个引用存在虚拟机栈中。那么引用通过什么方式去定位堆中对象的位置呢?1️⃣直接指针法(HotSpot 实现):引用中直接存储的就是堆中对象的地址。好处就是一次定位速度快,缺点是对象移动(GC 时对象移动)引用本身需要修改。2️⃣句柄法:Java 堆中划分出一部分作为句柄池,引用存储的是对象的句柄地址,而句柄中包括了对象实例和类型的具体位置信息。好处是对象移动只会改变句柄中的实例数据指针,缺点是两次原创 2022-02-21 16:35:38 · 617 阅读 · 0 评论 -
Java程序的初始化顺序
一、使用场景在Java程序中,当实例化对象时,对象的所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。二、原则1️⃣变量优先于块、静态优先于非静态。2️⃣父类优先于派生类初始化。3️⃣按照成员变量定义的顺序来进行初始化,即使变量定义散布于方法定义之中,它们仍然在任何方法(包括构造器)被调用前初始化。三、初始化顺序先父后子,变量优于块,静态优于非静态父类静态变量父类静态代码块子类静态变量子类静态代码块父类非静态变量父类非静态代原创 2022-01-20 09:45:22 · 1453 阅读 · 2 评论