JVM
文章平均质量分 80
王大磕碜
这个作者很懒,什么都没留下…
展开
-
JVM-Garbage Collection(垃圾回收)
垃圾的定义垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾GC的作用防止内存被消耗完整理出内存分配给新的对象垃圾标记阶段在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象.只有被标记为已经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称之为垃圾标记阶段对象死亡的标准当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡引用计数算法引用计数算.原创 2021-08-11 22:31:19 · 214 阅读 · 0 评论 -
JVM-String Table
String的基本特性String:字符串,使用一对""引起来表示String声明为final,不可被继承String实现了Serializable接口:表示字符串支持序列化.实现了Comparable接口:表示String可以比较大小String在JDK8及以前内部定义了final char[] value 用于存储字符串数据.JDK9时改为byte[]String:代表 不可变的字符序列.简称不可变性当字符串重新赋值时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值当对现原创 2021-07-22 11:41:17 · 75 阅读 · 0 评论 -
JVM-执行引擎
执行引擎概述执行引擎是Java虚拟机核心的组成部分之一“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能领,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机执行引擎则是由软件自由实现的,因此可以不受物理条件制约的定制指令集与执行引擎的结构体系,能够执行哪些不被硬件直接支持的指令集格式.JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节.原创 2021-07-22 11:31:36 · 96 阅读 · 0 评论 -
JVM-Native Method Stack(本地方法栈)
作用Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用线程私有允许被实现成固定或是可动态扩展的内存大小本地方法是C语言实现的具体做法是Native Method Stack中登记native方法,在Execution Engine执行时加载本地方法库并不是所有JVM都支持本地方法...原创 2021-07-13 17:27:35 · 106 阅读 · 0 评论 -
JVM-对象的实例化、内存布局与访问定位
对象的实例化创建对象的方式newClass的newInstance():反射的方式,只能调用空参构造器,权限必须是publicConstructor的newInstance():反射的方式,可以调用空参、带参的构造器,没有权限要求clone():不调用任何构造器,当前类需要实现Cloneable接口,实现clone()使用反序列化第三方库Objenesis创建对象的步骤判断对象对应的类是否加载、链接、初始化虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace原创 2021-07-13 16:35:46 · 67 阅读 · 0 评论 -
JVM- Method Area(方法区)
栈、堆、方法区的交互关系方法区的理解《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩”.但对于HotSpot JVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆区分开.方法区看作是一块独立于Java堆的内存空间方法区和堆一样,线程共享方法区在JVM启动时创建,并且实际的物理内存空间中和Java堆区一样都可以是不连续的方法区的大小决定了系统可以保存多少个类,如果类太多,同样会导致OOM.原创 2021-07-13 16:31:17 · 161 阅读 · 0 评论 -
JVM-Heap Area(堆)
JVM-Heap Area(堆)堆的核心概述一个JVM实例只存在一个堆内存,堆也是java内存管理的核心区域Java堆在JVM启动的时候即被创建,其大小也就确定了.《Java虚拟机规范》中规定,堆可以处于物理上不连续的内存空间中,但在逻辑上是被视为连续的所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上从实际的角度看,原创 2021-07-12 10:31:43 · 171 阅读 · 0 评论 -
JVM-PC Registers(程序计数器)
JVM-PC Registers(程序计数器)线程共享:堆、方法区线程不共享:程序计数器、本地方法栈、虚拟机栈PC Registers(程序计数器)JVM中的PC寄存器是对物理寄存器的一种抽象模拟PC寄存器用来存储指向下一条命令的地址,也即将要执行的指令代码.由执行引擎读取下一条指令每一个线程都有一个程序计数器,是线程私有的.生命周期和线程保持一致.使用PC寄存器存储字节码指令地址的作用因为CPU需要不停的在线程之间切换,这时候切换回来就需要知道当前方法从哪里继续执行JVM的字节码解释原创 2021-07-07 19:03:46 · 177 阅读 · 0 评论 -
JVM-Java virtual machine stack(虚拟机栈)
JVM-Java virtual machine stack(虚拟机栈)定义每个线程创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的方法调用线程私有生命周期与线程保持一致作用主管Java程序的运行,保存方法的局部变量(八种基本数据类型和对象的引用地址)、部分结果,并参与方法的调用和返回栈的特点快速有效的存储方式,访问速度仅次于pc寄存器JVM直接对Java栈的操作只有两个:入栈(压栈)、出栈不存在垃圾回收栈中可能出现的异常JVM虚拟机规原创 2021-07-07 18:58:02 · 179 阅读 · 0 评论 -
JVM-Class Loader Subsystem(类加载器子系统)
JVM-Class Loader Subsystem(类加载器子系统)Loading(加载阶段)ClassLoader只负责class文件的加载加载的类信息存放于方法区,过程通过一个类的全限定名获取定义此类的二进制字节流.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的Java.lang.Class对象,作为方法区这个类的各种数据的访问入口类加载器分类Bootstrap ClassLoader(引导类加载器/启动类原创 2021-07-01 01:07:02 · 183 阅读 · 0 评论