自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(11)
  • 问答 (2)
  • 收藏
  • 关注

原创 对象的实例化、内存布局与访问定位、直接内存

对象的实例化(1)对象的创建方式:①new ②反序列化 ③clone() ④反射机制 ⑤第三方库(2)创建对象的步骤:①判断对象对应的类是否加载、链接、初始化。虚拟机遇到一条new指令,首先去检查这个指令的参数能否在元空间的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化。如果没有,那么在双亲委派机制模式下,使用当前类加载器以ClassLoader+包名+类名为key查找对应的.class文件。如果找到文件就进行类加载,并生成对应的Class

2021-02-27 16:57:47 136 1

原创 运行时数据区(8)——方法区

堆、栈、方法区之间的交互关系从线程共享是否角度:栈、堆、方法区的交互关系:对方法区的理解(1)方法区看做是一块独立于堆的空间(2)方法区、堆都是线程共享的内存区域(3)方法区在JVM进程启动时创建,它的实际物理内存空间和堆一样可以不连续(4)方法区和堆区一样可以固定不变或可扩展(5)方法区的大小决定了系统可以保存多少个类,如果定义了太多的类,导致方法区溢出,同样会有OOM错误:java.lang.OutOfMemoryError : Metaspace(6)关闭JVM会释放方法区内存

2021-02-25 17:06:38 136

原创 运行时数据区(7)——TLAB和逃逸分析

为对象分配内存——TLAB(1)为什么会有TLAB?堆区是线程共享区,对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的。(2)什么是TLAB?从内存模型而非垃圾回收的角度,对Eden区继续进行划分,JVM为每个线程分配了一个私有的缓冲区,它位于Eden区。因此,堆空间不一定都是线程共享的,因为TLAB是线程私有的。优点:避免了线程安全问题;提升内存分配的吞吐量(3)JVM将TLAB作为内存分配的首选为对象分配内存,但不是所有的对象都在TLAB分配成功(4)

2021-02-24 13:34:11 167

原创 运行时数据区(6)——堆内存细分详解

年轻代和老年代(1)存储在JVM中的Java对象可以分为两大类:第一类是生命周期较短的顺势对象,其创建和消亡都非常迅速;第二类是生命周期较长,甚至可以与JVM生命周期保持一致的对象。(2)JVM堆区内存进一步细分:年轻代、老年代年轻代又可以分为:伊甸园区(Eden区)、幸存者0区(Survivor0、s0)、幸存者1区(Survivor1、s1)。s0和s1中有一个是from,另一个是to。to内存中没有存放对象(3)s0和s1区内存大小相同(如果开启了自适应模式,则可能会不同)(4)默认情况

2021-02-23 15:36:56 628

原创 运行时数据区(5)——堆内存细分和堆内存大小的设置

堆内存细分现代垃圾回收器大部分是基于分代收集理论设计,堆空间可以细分为:JDK8之前:新生代+养老区+永久区JDK8及以后:新生代+养老区+元空间其中,新生区又可以划分为:伊甸园区、幸存者0区、幸存者1区设置堆内存大小(1)-Xms:设置初始状态堆内存大小,等价于-XX:InitialHeapSize-Xmx:设置最大堆内存大小等价于-XX:maxHeapSize-Xmx和-Xms只能设置新生区+养老区内存大小,不能设置永久代的大小(2)默认情况下,初始堆内存大小为物理电脑内存的64分

2021-02-18 20:54:05 280

原创 运行时数据区(4)——方法返回地址及本地方法栈、堆概述

方法返回地址(1)方法返回地址存放调用该方法的PC寄存器的值(2)方法结束有两种方式:正常退出和抛异常退出。方法正常退出时,调用者的PC计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址方法异常退出时不会给他的上层调用者产生任何返回值虚拟机栈相关面试题(1)举例说明栈溢出的情况?(StackOverflowError)死递归一定会发生栈溢出,无论栈的大小时固定的或是动态扩展的,因为死递归会不断将方法压栈却不会往外弹栈,因此一定会发生栈溢出错误(2)调整栈的大小就能保证不会出现栈溢出吗

2021-02-17 18:52:04 317

原创 运行时数据区(3)——操作数栈和动态链接

1、操作数栈(1)操作数栈也被称为表达式栈(2)操作数栈在方法执行过程中,根据字节码指令,往栈中写入数据(即压栈和弹栈)(3)如果被调方法有返回值,其返回值将会被压入当前栈帧的操作数栈中,并更新PC寄存器中下一条指令的地址(4)JVM的解释引擎是基于栈的执行引擎,其中的栈指的便是操作数栈(5)操作数栈主要用于保存计算过程的中间结果,同时作为计算过程中变量临时存储空间(6)操作数栈是JVM执行引擎的一个工作区,当一个方法开始执行时会创建对应的栈帧,这个方法的操作数栈和局部变量表此时是空的(7)操

2021-02-15 15:08:43 286

原创 运行时数据区(2)——栈的存储单位和局部变量表

栈的存储单位(1)每个线程都有自己的栈,栈中的数据都以栈桢为基本单位存储(2)每个线程中每个方法都有自己的栈桢(3)栈桢是一个内存区块,是一个数据集,维系着方法执行过程中的各种数据信息(4)JVM对栈的操作只有连个:压栈和弹栈(5)栈的特点:先进后出/后进先出(6)在一个活动的线程中,在某一个具体的时间点上,只能有一个栈桢处于活动状态,这个站栈桢被称为当前栈帧,对应的方法被称为当前方法,定义该方法的类被称为当前类,也称为运行时类(7)执行引擎运行的所有字节码指令只对当前栈桢有效。(8)如果在

2021-02-13 18:58:01 258

原创 运行时数据区(1)——程序计数器和虚拟机栈概述

学完了类加载器,现在开始学习Java运行时数据区运行时数据区Java之所以能够跨平台,JVM功不可没。Java程序“一次编写到处运行”正是基于不同平台上底层JVM的不同。不同的JVM对于内存的划分方式和管理机制存在着部分差异一个JVM就是一个进程,一个Java进程对应一个运行时数据区。运行时数据区主要包括五部分:本地方法栈、虚拟机栈、方法区、堆区、程序计数器。其中,虚拟机栈、本地方法栈和程序计数器属于线程私有,一个线程对应一份,方法区和堆区是多线程共享的。线程在学习Java基础部分时已经了解过线程

2021-02-12 21:18:53 170 2

原创 类加载子系统(2)——类加载器的分类以及双亲委派机制

类加载器分类Java虚拟机中支持两种加载器:引导类加载器和自定义类加载器。这里的自定义类加载器包括了JVM内置的扩展类加载器和应用类加载器。虚拟机自带的类加载器JVM内置了三种类加载器,Java程序的绝大多数类都使用这三个类加载器完成加载。这三个类加载器分别是:启动类加载器、扩展类加载器、应用类加载器启动类加载器启动类加载器(Bottstrap ClassLoader)(1)这个类加载器使用C/C++写成,它用来夹在Java核心类库,在Java程序中是获取不到的(2)它不继承自java.lan

2021-02-11 21:57:38 757

原创 类加载子系统(1)——类的加载过程

类加载过程最近开始学习Java虚拟机,今天学习了类加载的三个过程,遂写一篇博客作为学习笔记类加载子系统概述类加载子系统作为JVM的一部分,负责将硬盘中的class字节码文件加载到JVM中。类加载器只负责将类加载到JVM中,不保证程序一定可以正确执行,决定程序是否可以正常运行的是执行引擎。类被加载后存储于方法区中。方法区中的内容除了类的相关信息之外,还包括运行时常量池、字符串字面量及数字常量等。上图的几点说明1、class存储于硬盘中2、字节码文件加载到JVM中,存放在方法区,被称为DNA元数

2021-02-09 19:52:43 145 1

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除