![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM笔记
文章平均质量分 53
魔幻音
如果世界上真的有奇迹,那只是努力的另一个代名词。
展开
-
常见垃圾回收器解析
垃圾回收器基础分类 按线程数分类: ①串行垃圾回收器: 指同一时间段只有一个线程在进行垃圾回收工作,此时用户线程将因STW停止,等垃圾回收结束后恢复。 在单核或较小应用内存场合下比较合适。 ②并行回收器: 指可以运用多个CPU同时执行垃圾回收工作,能提升应用的吞吐量。 在多核CPU机器上,并行回收器性能更好(工作期间同样有STW) 按工作模式分: ①并发式回收器: 并发式回收器和用户线程交替执行,尽可能减少STW引起的停顿 ②独占式回收器: 一旦独占工作,停止所有用户线程,直到垃圾回收结束。 按碎片处理方式原创 2022-04-13 23:22:01 · 509 阅读 · 0 评论 -
JVM垃圾回收
垃圾回收: 概念: 发生场地:①堆(主要) ②方法区 **触发条件:**内存不足 ①新生代满->Minor GC ②老年代满->Full GC GC判断对象存活状态: ①引用计数算法: 给对象添加一个引用计数器,当被引用时,计数器数值+1,引用失效时-1。所以当计数器为0,不再被引用。 优点:方便,快,实现简单 缺点:对象互相引用时难以判断回收 ②可达性分析:基本思路就是从GC Roots的对象为起点,从这些节点向下搜索,走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连,证明原创 2022-04-04 19:23:53 · 347 阅读 · 0 评论 -
JVM运行时数据区:堆
堆的概述: ①堆是java内存管理核心区,一个JVM实例对应一个堆 ②JVM启动时即创堆,大小确定(可调节) ③堆在逻辑视为连续,物理上不连续 ④可以划分为线程私有部分(TLAB) ⑤(几乎)所有对象实例及数组运行时,分配在堆上 ⑥方法结束后,堆中对象不释放,仅在GC时释放 堆内存: 内存划分: JAVA7及之前: 新生区、养老区、永久代 JAVA8及之后: 新生区、养老区、元空间 年轻代又分:Eden、S0、S1(实际S0与S1同时只有一个在起作用) 老年代与年轻代都在堆内,而永久代、元空间在方法区内。原创 2021-10-23 19:37:45 · 110 阅读 · 0 评论 -
JVM运行时数据区:虚拟机栈(栈)
虚拟机栈 栈是线程独立的,在线程中对应方法的调用:一个方法对应一个栈帧、一个线程对应一个栈;栈的生命周期同线程。 其作用可以和堆进行对比,堆是存储单位,而栈是运行时单位。 虚拟机栈运用的栈结构导致它不用GC,因为只会对栈顶元素进行操作;但会出现OOM即内存溢出(栈过大) 栈的异常根据其大小确定形式而不同: 栈大小可动态、可固定。 固定栈大小:会出现SOF、StackOverFlowError错误(因为一个方法对应一个栈帧,在递归等方法过量执行的情况下会出现此错误)(固定大小可以通过-Xss指令进行规定) 动原创 2021-08-13 18:28:11 · 188 阅读 · 0 评论 -
JVM运行时数据区:程序计数器解析
程序计数器又称PC寄存器(寄存器名称是对计算机内寄存器一种抽象模拟,并不是实际寄存器硬件),是数据区内最快、最小的空间。 作用:存指向下一条指令的地址,并交由执行引擎读(若为native方法,则为undefined)。 程序计数器是线程私有的,其生命周期与线程一致。 程序计数器没有GC、没有OOM(不会有多余垃圾空间和空间溢出情况发生) 实际用处:在多线程环境下,线程切换时需要记录正在执行的线程的继续执行位置,这也是程序计数器线程独立的原因。 ...原创 2021-08-13 17:10:02 · 96 阅读 · 0 评论 -
JVM运行时数据区整体概念
运行时数据区共分五个部分。 线程共享:方法区、堆 线程独享:程序计数器、本地方法栈、虚拟机栈 虚拟机栈组成: 由栈帧作为基础单位加入栈,每个栈帧由:局部变量表、操作数栈、动态链接、方法返回址组成 堆组成: 堆由年轻代:Eden、S0、S1 和老年代组成 方法区(非堆空间):常量池、方法元信息、类元信息(元数据) + JIT编译产物 一个JVM对应一个Runtime(即运行时数据区) ...原创 2021-08-13 17:03:37 · 85 阅读 · 0 评论 -
JVM整体过程及发展历程
首先日常编写的代码都是高级代码,机器无法识别,高级代码都需要先编译成汇编代码,再编译为机器代码供计算机运行。 在JAVA中,就是先将边写的.java文件编译成.class文件,再借助JVM解释运行。 Java作为跨平台语言,是因为JVM只关注字节码文件,从此反推JVM也可以解释其他语言编译出的字节码文件(只要字节码文件符合规范,如开头cafebabe)就可以通过一个JVM运行多种代码。 整体流程: 先借助前端编译器将.java文件编译成.class文件(即字节码文件),交由类加载器子系统(将class加入内原创 2021-08-10 16:00:27 · 154 阅读 · 0 评论 -
类加载器概念、过程、双亲委派机制、类的主动、被动使用
类加载器作用: 将.class文件加载进内存,但类加载器只进行加载,并不对其可运行性进行判断。 整体过程概述: 加载---->链接---->初始化 整体类加载是为了将.class文件作为类的模板加入内存,作为元数据模板,为后续类的实例化提供模板。 加载: ①通过类的全限定名获取自定义类的二进制字节流(类信息从物理存入内存采用流的形式) ②将该流代表的静态存储结构存入方法区内的运行时数据结构 ③针对加载的.class在内存中产生代表该类的java.lang.class对象 链接: 链接分三步:验证原创 2021-08-12 10:41:00 · 326 阅读 · 0 评论