JVM上篇(内存与垃圾回收篇)
本环节分为四个大部分:上篇(内存与垃圾回收篇 )、中篇(字节码与类的加载篇)、下篇(性能监控与调优篇)、面试篇
所遇皆所求
这个作者很懒,什么都没留下…
展开
-
JVM_虚拟机目录
JVM_01 总体概述 JVM_02 类加载器子系统JVM_03 运行时数据区[程序计数器+本地方法栈]JVM_03 运行时数据区[虚拟机栈] JVM_03 运行时数据区[堆]JVM_03 运行时数据区[方法区]JVM_04 对象的实例化+内存布局+访问定位+直接内存JVM_04 字符串常量池JVM_05 执行引擎JVM_06 垃圾回收相关算法 [一]JVM_06 垃圾回收相关概念[二]JVM_06 垃圾收集器[三]JVM_07 Class文件结构...原创 2020-12-23 11:02:55 · 128 阅读 · 0 评论 -
JVM_01 总体概述
写在最前面:①. 什么是JVM?1.什么是JVM?①. JVM 是 java虚拟机,是用来执行java字节码(二进制的形式)的虚拟计算机②. jvm是运行在操作系统之上的,与硬件没有任何关系②. Java的跨平台及原理2.Java的跨平台及原理①. 跨平台:由Java编写的程序可以在不同的操作系统上运行:一次编写,多处运行②. 原理:编译之后的字节码文件和平台无关,需要在不同的操作系统上安装一个对应版本的虚拟机(JVM)③. JVM的分类3.JVM的分类.原创 2020-12-23 11:06:25 · 93 阅读 · 0 评论 -
JVM_02 类加载器子系统
①. 类的加载(掌握)①. 简述类的加载过程(掌握)当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载、类的链接、类的初始化这三个步骤来对类进行初始化。 如果不出现意外,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或者初始化②. 什么是类的加载(Loading)类的加载指的是将类的.class文件中的二进制数据读取到内存中,存放在运行时数据区的方法区中,并创建一个大的Java.lang.Class对象,用来封装方法区内的数据结构③. 链接(Li原创 2020-12-23 11:06:56 · 80 阅读 · 0 评论 -
JVM_03 运行时数据区 [ 程序计数器+本地方法栈 ]
①. 程序计数器①. 作用,是用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令②. 特点:①. 是线程私有的 ②. 不会存在内存溢出③. 注意:在物理上实现程序计数器是在寄存器实现的,整个cpu中最快的一个执行单元④. 它是唯一一个在java虚拟机规范中没有OOM的区域解释:⑤. 使用PC寄存器存储字节码指令地址有什么用呢?为什么使用PC寄存器记录当前线程的执行地址呢?⑥. PC寄存器为什么设定为线程私有?(为了能够准确原创 2020-12-23 11:07:28 · 87 阅读 · 0 评论 -
JVM_03 运行时数据区 [ 虚拟机栈 ]
前言:(栈并不是越大越好,越多可以防止出现StackOverflowError晚点出现,但是栈越大,也就代表着虚拟机栈是一定的,你的栈越大,别的栈就会小)①. 什么是 Java virtual machine?①. 栈的概述每创建一个线程就会创建一个Java栈,每一个Java栈中都会有很多栈帧(局部变量表 | 操作数栈 | 动态链接 | 方法返回地址 | 一些附加信息) 掌握解释:(1). 虚拟机栈(Java Virtual Machine Stacks)和线程是紧密联系的,每创建一.原创 2020-12-23 11:08:38 · 77 阅读 · 0 评论 -
JVM_03 运行时数据区[ 堆 ]
①. 堆的概述1>. 堆的概述(共享|垃圾回收)①. 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域②. Java堆区在JVM启动的时候即被创建,其空间大小也是确定的。是Jvm管理最大的一块内存空间③. 堆可以在物理上不连续的内存空间中,但在逻辑上是连续的④. 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)⑤. 在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的原创 2020-12-23 11:09:16 · 83 阅读 · 0 评论 -
JVM_03 运行时数据区 [ 方法区]
①. 方法区的概述1>. 方法区的概述①. 方法区在JVM启动的时候被创建,并且它的实际的物理内存空间和Java堆区一样都可以是不连续的 | 关闭Jvm就会释放这个区域的内存②. 方法区时逻辑上是堆的一个组成部分,但是在不同虚拟机里头实现是不一样的,最典型的就是永久代(PermGen space)和元空间(Metaspace)(注意:方法区时一种规范,而永久代和元空间是它的一种实现方式)③. 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同原创 2020-12-23 11:11:11 · 85 阅读 · 0 评论 -
JVM_04 对象的实例化+内存布局+访问定位+直接内存
前言:(1).new 最常见的方式 | 变形1 : Xxx的静态方法 | 变形2 : XxBuilder/XxoxFactory的静态方法(2).Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是public(3).Constructor的newInstance(Xxx):反射的方式,可以调用空参、带参的构造器,权限没有要求(4).使用clone() :不调用任何构造器,当前类需要实现Cloneable接口,实现clone()(5).使用反序列化:从文件中、从.原创 2020-12-23 11:11:42 · 205 阅读 · 0 评论 -
JVM_04 字符串常量池(详解intern( ))
①. String的基本特性1>.String的基本特性①. String:字符串,使用一对""引起来表示。String sl = “hello”;//字面量的定义方式String s2 = new String(“hello”)②. String声明为final的,不可被继承③. String实现了Serializable接口:表示字符串是支持序列化的。 实现了Comparable接口:表示String可以比较大小④. String在jdk8及以前内部定义了fina原创 2020-12-23 11:12:17 · 112 阅读 · 0 评论 -
JVM_05 执行引擎(Execution Engine)
总结写在最前面:①. 执行引擎概述1>. 执行引擎概述①. 执行引擎是Java虚拟机的核心组成部分之一②. JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM锁识别的字节码指令、符号表和其他辅助信息③. 那么,如果想让一个Java程序运行起来、执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器.原创 2020-12-23 11:12:47 · 119 阅读 · 0 评论