JVM
文章平均质量分 83
逆流丶石头
这个作者很懒,什么都没留下…
展开
-
JVM 垃圾回收器
串行回收器: Serial、Serrial Old并行回收器: ParNew、Parallel Scavenge、Parallel Old并发回收器: CMS、G1新生代收集器: Serial、ParNew、Parallel Scavenge老年代收集器: Serial Old、Parallel Old、CMS整堆收集器: G1没有一种放之四海皆准、任何场景下都适合的完美收集器存在,更加没有万能的收集器,我们选择只是对具体应用最合适的收集器。原创 2023-05-18 13:37:13 · 788 阅读 · 0 评论 -
JVM 垃圾回收相关概念
在操作系统中,是指一个时间段有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理器上运行,并发并不是真正意义的 "同时处理",只是CPU 把一个时间段分成几个时间片段,在这几个时间段来回切换。当系统中有一个以上的 CPU时,当一个 CPU 执行一个进程时,另一个 CPU 可以执行另一个进程,两个进程互不抢占 CPU 资源,可以同时进行。设置一个中断标志,各个线程运行到 Safe Point 的时候主动轮询这个标志,如果中断标志为真,则将自己运行中断挂起。回收完,再启动程序的线程。原创 2023-05-17 13:00:22 · 293 阅读 · 0 评论 -
JVM 垃圾回收相关算法
上述现有的算法,在垃圾回收过程中,应用软件将处于一种Stop the World 的状态。在 Stop the World 状态下,应用程序所有的线程都会挂起,暂停一切正常的工作,等待垃圾回收的完成。将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用的内存中存活对象赋值到未被使用的内存块中,之后清除正在使用的内存块的所有对象,交换两个内存角色,最后完成垃圾回收。但是,因为线程切换和上下文转换的消耗,会使得垃圾回收的总体成本上升,依次反复,直到垃圾收集完成。实现简单,垃圾对象便于辨别;原创 2023-05-16 22:05:00 · 347 阅读 · 0 评论 -
JVM 垃圾回收概述
担忧:原创 2023-05-15 17:45:38 · 450 阅读 · 0 评论 -
JVM StringTable
2. 如果不是使用双引号声明的 String 对象,可以使用 String 提供的 Intern() 方法。1. 直接使用双引号声明出来的 String 对象会直接存储在常量池种。原创 2023-05-15 16:46:21 · 462 阅读 · 0 评论 -
JVM 执行引擎
是Java 虚拟机核心的组成部分之一物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行哪些不被硬件直接支持的指令集格式JVM 主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被 JVM 所识别的字节码指令、符号表,以及其他辅助信息。原创 2023-05-15 13:23:07 · 654 阅读 · 0 评论 -
JVM 直接内存(Direct Memory)
直接内存概述非直接缓冲区: 直接缓冲区:原创 2023-05-13 18:30:42 · 659 阅读 · 0 评论 -
JVM 对象的实例化内存布局和访问定位
初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量, new 指令之后会接着执行方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全创建出来。如果不规整需要维护一个列表,记录哪些内存块是可用的,再分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的内容。将对象的所属类(即类的元数据信息)、对象的 HashCode 和 对象的GC信息、锁信息等数据存储在对象的对象头中,这个过程的具体设置方式取决于 JVM 实现。3. 处理并发安全问题。原创 2023-05-13 11:17:14 · 362 阅读 · 0 评论 -
JVM 方法区
因为永久代垃圾回收效率很低,在 Full GC 的时候才会触发,而 Full GC 是老年代的空间不足,永久代不足时才会触发。而 Java 中的字节码需要数据支持,通常这种数量会很大以至于不能直接存到字节码里,换另一种方式,可以存到常量池,这个字节码包含了指向常量池的引用。在动态链接的时候会用到运行时常量池。一个有效的字节码文件中除了包含类的版本信息、字段、方法以及接口等描述信息外,还包含一项信息那就是常量池表(Constant Pool Table), 包括各种字面量和对类型、域和方法的符号引用。原创 2023-05-12 15:58:07 · 922 阅读 · 0 评论 -
JVM 堆
一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的核心区域Java 堆区在 JVM 启动的时候即被创建,其空间大小也就确定了。是 JVM 管理的最大一块内存空间堆可以处于物理上不连续的内存空间中,但是在逻辑上它应该被视为连续的所有的线程共享 Java 堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer, TLAB)所有的对象实例以及数组都应该在运行时分配在堆上。原创 2023-05-11 15:07:31 · 674 阅读 · 0 评论 -
JVM 本地方法
本地方法:为什么要使用 Native Method:原创 2023-05-10 09:51:11 · 541 阅读 · 0 评论 -
JVM 虚拟机栈
由于跨平台性的设计,Java 的指令都是根据栈来设计的。不同平台 CPU 架构不同,所以不能设计为基于寄存器的优点是跨平台, 指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令栈是运行时的单位,即程序如何执行,而堆是存储的单位,数据怎么放,放在哪儿。Java 虚拟机栈(Java Virtual Machine Stack), 早期也叫 Java 栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个栈帧(Stack Frame),对应着一次次的 Java 方法调用。原创 2023-05-09 22:55:30 · 887 阅读 · 0 评论 -
JVM 程序计数器(PC 寄存器)
JVM中的程序计数寄存器( Program Counter Register) 中,Register 的命名源于 CPU 的寄存器, 寄存器存储指令相关的现场信息。CPU 只有把数据装载到寄存器才能够运行JVM 中的 PC 寄存器是对物理 PC 寄存器的一种抽象模拟PC 寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令它是一块很小的内存空间,几乎可以忽略不计,也是运行速度最快的存储区域。原创 2023-05-08 22:58:19 · 392 阅读 · 0 评论 -
JVM 类加载子系统
粗略图:详细图:类加载器 ClassLoader 角色:类的加载过程:加载:加载 .class 文件的方式:验证(Verify):准备(Prepare):解析(Resolve):初始化:启动类加载器(引导类加载器,Bootstrap ClassLoader):扩展类加载器( Extension ClassLoader):应用程序类加载器(系统类加载器, AppClassLoader):类加载器实例代码:ClassLoader 的使用说明 为什么要自定义类的加载器:用户自定义类加载器实现步骤:原创 2023-05-08 21:53:05 · 361 阅读 · 0 评论 -
JVM 体系结构
Java 虚拟机的启动是通过引导类加载器(bootstrap class loader) 创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。Java 虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条 Java 指令,Java 虚拟机规范中都有详细定义。需要不同语言由自己编译器,生成符合 JSR-292 JVM规范的字节码文件,即可在 Java 虚拟机中运行。性能优秀和执行更高效。原创 2023-05-07 10:36:29 · 465 阅读 · 0 评论