![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
深入理解java虚拟机
文章平均质量分 73
从《深入理解java虚拟机》学习得到的知识。需要详细知识还的去看这本书,我只是知识的搬运工,开个分栏加强自己的理解
木木夕木目心.HDS
脚踏实地,仰望星空
做一只快乐的笨鸟
展开
-
垃圾回收概述
1.什么是垃圾垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。关于垃圾收集有三个经典问题:➢哪些内存需要回收?➢什么时候回收?➢如何回收?垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点。垃圾是指在运行程序中没有任.原创 2021-04-13 21:48:15 · 183 阅读 · 1 评论 -
StringTable
1.String的基本特性String:字符串使用一对""引起来表示。 String声明为final的,不可被继承 String实现了Serializable接口:表示字符串是支持序列化的。 实现了Comparable接口:表示String可以比较大小 String在jdk8及以前内部定义了final char[] value用 于存储字符串数据。jdk9时改为byte[]结论: String 再也不用char[] 来存储啦,改成了byte[] 加上编码标记,节约了一些空间。Str原创 2021-03-19 22:49:44 · 128 阅读 · 0 评论 -
JVM-执行引擎
然后说为什么有些JVM会选择不总是做JIT编译,而是选择用解释器+JIT编译器的混合执行引擎?1. 编译的时间开销解释器的执行,抽象的看是这样的:输入的代码 -> [ 解释器 解释执行 ] -> 执行结果而要JIT编译然后再执行的话,抽象的看则是:输入的代码 -> [ 编译器 编译 ] -> 编译后的代码 -> [ 执行 ] -> 执行结果说JIT比解释快,其实说的是“执行编译后的代码”比“解释器解释执行”要快,并不是说“编译”这个动作比“解释.原创 2021-03-14 15:08:42 · 156 阅读 · 2 评论 -
直接内存
1.直接内存概述不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存是在Java堆外的、直接向系统申请的内存区间。 来源于NIO,通过存在堆中的Di rectByteBuffer操作Native内存 通常,访问直接内存的速度会优于Java堆。即读写性能高。➢因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。➢Java的NIO库允许Java程序使用直接内存,用于数据缓冲区读写文件,需要与磁盘交互,需要由用户态切换到内核态。在内核态时,需要内存如原创 2021-03-13 11:33:55 · 116 阅读 · 0 评论 -
对象的实例化、内存布局与访问定位
1.对象的实例化1.1 创建对象的方式new Class的newInstance() Constructor的newInstance(xxx) 使用clone() 使用反序列化 第三方库objenesis1.2创建对象的步骤1.3对象头由于Java面向对象的思想,在JVM中需要大量存储对象,存储时为了实现一些额外的功能,需要在对象中添加一些标记字段用于增强对象功能,这些标记字段组成了对象头。对象头形式1.3.1.普通对象Class pointer <=原创 2021-03-09 22:05:09 · 72 阅读 · 0 评论 -
jvm-方法区
1. 栈、堆、方法区的交互关系1.2 从线程共享与否的角度来看1.2 栈、堆、方法区的交互关系2. 方法区的理解方法区看作是一块独立于Java堆的内存空间。方法区(Method Area) 与Java堆一样,是各个线程共享的内存区域。 方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。 方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,原创 2021-03-07 16:04:01 · 160 阅读 · 0 评论 -
JVM-堆
1.堆(Heap)的核心概述一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。 Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存的大小是可以调节的。 《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(ThreadLocal Allocation Buffer, TLAB) 。 数组和对象可能永远不会存储在栈上,因为栈.原创 2021-02-28 13:12:43 · 932 阅读 · 2 评论 -
本地方法接口和本地方法栈
什么是本地方法?简单地讲,一个Native Method就是一个Java调用非Java代码的接口。一个Native Method是这样 一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C" 告知C++编译器去调用一个c的函数。 标识符native可以与所有其它的java标识符连用,但是abstract除外。为什么要使用Native Method ?Java使用起来非常方便,..原创 2021-02-25 16:08:09 · 96 阅读 · 0 评论 -
jvm-栈
虚拟机栈概述由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。.问题:有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java栈(stack)?为什么?栈是运行时的单位,而堆是存储的单位。即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、原创 2021-02-18 22:35:11 · 131 阅读 · 0 评论 -
java虚拟机的程序计数器(PC寄存器)
PC Register 介绍JVM中的程序计数寄存器(Program Counter Register) 中,Register 的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行.这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。作用PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。原创 2021-02-08 23:42:35 · 190 阅读 · 0 评论 -
虚拟机的线程
线程是一个程序里的运行单元。JVM允许一个应用有多个线程并行的执行。 在Hotspot JVM里, 每个线程都与操作系统的本地线程直接映射。 当一个Java线程准备好执行以后,此时一个操作系统的本地线程也同时创建。Java线程执行终止后,本地线程也会回收。 操作系统负责所有线程的安排调度到任何一个可用的CPU上。一旦本地线程初始化成功,它就会调用Java线程中的run()方法。 如果你使用jconsole或者是任何一个调试工具,都能看到在后台有许多线程在运行。这些后台线程不包括调用public .原创 2021-02-08 23:21:18 · 801 阅读 · 0 评论 -
类的主动使用和被动使用
Java程序对类的使用方式分为:主动使用和被动使用。主动使用,又分为七种情况:创建类的实例. 访问某个类或接口的静态变量,或者对该静态变量赋值 调用类的静态方法 反射(比如: Class.forName("com.atguigu.Test")) 初始化一个类的子类 Java虛拟机启动时被标明为启动类的类 JDK 7开始提供的动态语言支持:java.lang.invoke.MethodHandle实例的解析结果REF_getStatic、REF_putStatic、REF_invokeSt.原创 2021-02-04 22:47:46 · 288 阅读 · 0 评论 -
两个class对象是否为同一个类
在JVM中表示两个class对象是否为同一个类存在两个必要条件:类的完整类名必须一致, 包括包名。 加载这个类的ClassLoader (指ClassLoader实例对象)必须相同。换句话说,在JVM中,即使这两个类对象(class对象)来源同一个Class文件,被同一个虚拟机所加载,但只要加载它们的ClassLoader实例对象不同,那么这两个类对象也是不相等的。...原创 2021-02-04 22:39:24 · 663 阅读 · 0 评论 -
双亲委派机制和沙箱安全机制
Java虛拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一.种任务委派模式。工作原理如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行; 如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归, 请求最终将到达项层的启动类加载器; 如果父类加载器可以完成类加载任务,就成.原创 2021-02-04 22:33:31 · 78 阅读 · 0 评论 -
类加载器与类的加载过程
java虚拟机运行流程类加载器子系统作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件的加载,至于它是否可以运行,则由ExecutionEngine决定。 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)类加载器ClassLoader角色1. cl..原创 2021-02-02 22:07:19 · 161 阅读 · 0 评论 -
java虚拟机简单介绍
虚拟机所谓虚拟机(Virtual Machine), 就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。大名鼎鼎的Visual Box, VMware就属 于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虛拟机中执行的指令我们称为Java字节码指令。java虚拟机Java虚拟机是一台执行Java字节码的虚拟计原创 2021-02-01 22:05:44 · 320 阅读 · 1 评论 -
java内存区域与内存溢出异常-HotSpot虚拟机对象探秘
1.对象创建关于对象的创建过程一般是从new指令(我说的是JVM的层面)开始的(具体请看图1),JVM首先对符号引用进行解析,如果找不到对应的符号引用,那么这个类还没有被加载,因此JVM便会进行类加载过程。符号引用解析完毕之后,JVM会为对象在堆中分配内存,HotSpot虚拟机实现的JAVA对象包括三个部分:对象头、实例字段和对齐填充字段,其中要注意的是,实例字段包括自身定义的和从父类继承下来的(即使父类的实例字段被子类覆盖或者被private修饰,都照样为其分配内存)。相信很多人在刚接触面向对象语言时原创 2021-01-25 22:01:46 · 117 阅读 · 0 评论 -
java内存区域与内存溢出异常-运行时数据区域
java虚拟机在执行java程序的过程中,会把内存划分为若干个不同的数据区域。每个区域都有各自的用途,创建和销毁时间,按照《java虚拟机规范(Java SE 7 版)》的规定,虚拟机运行时数据区域主要有以下几种:1.程序计数器程序计数器是很小的一块内存区域,可以看做是当前线程所执行字节码的行号指示器。在虚拟机的概念模型中,字节码解释器工作时就是通过改变程序计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能均依赖于程序计数器。在多线程中,每个线程都有一个独原创 2021-01-24 22:28:27 · 102 阅读 · 0 评论