JVM 专题一:虚拟机(一)】的更多相关文章

合集目录 JVM专题1: 类和类加载机制 Java对象的结构 在HotSpot虚拟机中, 对象在内存中存储的布局可以分为3块区域 对象头Header 实例数据Instance Data 对齐填充Padding 对象头包含的数据有 markword 用于存储对象自身的运行时数据, 如HashCode, GC分代年龄.锁状态标志.线程持有的锁.偏向线程ID.偏向时间戳等,这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为32bit和64bit, 官方称它为MarkWord klass…
合集目录 JVM专题2: JVM内存结构 Java 内存分配 JVM 内存结构 The JVM is an abstract computing machine that enables a computer to run a Java program. There are three notions of JVM: specification (where working of JVM is specified. But the implementation has been provided…
合集目录 JVM专题3: GC 垃圾回收 什么是GC? 为什么要有 GC? Garbage Collection, 用于内存回收. 简述一下 Java 垃圾回收机制? 那些内存需要回收 虚拟机中程序计数器, 本地方法区, 虚拟机栈随着线程而消亡. 栈中的栈帧随着方法调入和调出而产生和消亡, 垃圾回收主要考虑的是堆和方法区. 堆中的对象实例是主要回收的内容, 需要判断是否不再被使用, 主流的虚拟机都是通过可达性算法来实现. 通过GC Root对象为起点, 从这些节点开始搜索, 走过的路径就是引用链…
2.虚拟机栈 1. 概述 1.1 虚拟机栈出现背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令   1.2 内存中的堆与栈 栈是运行时的单位,而堆是存储的单位 | 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据.堆解决的是数据存储的问题,即数据怎么放.放在哪儿. 一般来讲,对象主要都是放在堆空间的,是运行时数据区比较大的一块 栈空间存放基…
2.1 什么是Java虚拟机? Java虚拟机是一台执行字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成. JVM平台的各种语言可以共享Java虚拟机带来的跨平台性.优秀的垃圾回收机制,以及可靠的即时编译器. Java技术的核心就是Java虚拟机,因为所有的Java程序都运行在Java虚拟机内部.   |  可以这样理解 JVM类似于一台小电脑运行在windows或者linux这些操作系统环境下.它与操作系统直接交互,不与硬件直接交互,操作系统可以帮我…
1. 虚拟机 1.1 什么是虚拟机? 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统. 所谓虚拟机,就是一台虚拟的计算机.它是一款软件,用来执行一系列虚拟计算机指令. 1.2 虚拟机可以分为两类: 系统虚拟机:它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台,比如Visual Box,VMware. 程序虚拟机:专门为执行单个计算机程序而设计,比如Java虚拟机,在Java虚拟机中执行的指令称为Java…
堆设置 -Xmx3550m:设置JVM最大堆内存 为3550M. -Xms3550m:设置JVM初始堆内存 为3550M.此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存. -Xss128k:设置每个线程的栈 大小.JDK5.0以后每个线程栈大小为1M,之前每个线程栈大小为256K.应当根据应用的线程所需内存大小进行调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右. -Xmn2g:…
虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个周期包括:加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(Using).卸载(Unloading)七个阶段.其中验证.准备.解析三个部分统称为链接(Linking),这七…
java虚拟机内存管理图如下图所示: 1.线程共享区,是所有的线程所共用的,线程共享区有一下几个组成: 1.方法区: 1.运行时常量池,已经被虚拟机加载的类信息(1.类的版本信息,2.字段,3.方法,4.接口等),常量,静态变量,即时编译器编译后的代码等数据. 2.垃圾回收器也会光顾这个区域,例如常量池. 3.HotSpot中用方法区来实现永久代.这样的做的好处就是,垃圾回收器可以像管理java堆一样管理这部分内存,省去了为方法区编写内存管理的工作,注意的是这 仅仅限于HotSpot中,其他的虚…
这篇文章解释了Java 虚拟机(JVM)的内部架构.下图显示了遵守Java SE 7 规范的典型的 JVM 核心内部组件. 上图显示的组件分两个章节解释.第一章讨论针对每个线程创建的组件,第二章节讨论了线程无关组件. 线程 JVM 系统线程 每个线程相关的 程序计数器 栈 本地栈 栈限制 栈帧 局部变量数组 操作数栈 动态链接 线程共享 堆 内存管理 非堆内存 即时编译 方法区 类文件结构 类加载器 更快的类加载 方法区在哪里 类加载器参考 运行时常量池 异常表 符号表 Interned 字符串…
JVM笔记 java代码执行分为两部分:javac编译     java执行 代码并不是由上往下执行的,会经过编译期重排序进行优化,存在依赖关系的代码不会被重排序,保证了代码最终执行结果的正确性! java虚拟机规范,运行时数据区通常包括: 程序计数器(Program Counter Register) java栈(VM  Stack) 本地方法栈(Native Method Stack) 方法区(Method  Area) 堆(Heap) * 不同的虚拟机厂商有不同的实现方式 程序计数器: 程…
一.概述 虚拟机类加载机制:虚拟机把描述类的数据从Class文件中加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型. 与那些在编译时需要进行连接工作的语言不同,在Java语言里面,类型的加载.连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类型加载时稍微增加一些性能开销,但是会为Java应用程序提供高度的灵活性,Java里天生可以动态扩展的语言特性就是依赖运行期间动态加载和动态连接这个特点实现的. 二.类加载的时机 类从被加载到虚拟机内存中开始…
一.概述 经过前面两章对于虚拟机内存分配与回收技术各方面的介绍,相信读者已经建立了一套比较完整的理论基础.理论总是作为指导实践的工具,能把这些执行应用到实际工作中才是我们的最终目的.接下来我们会从实践的角度去了解虚拟机内存管理的世界. 二.JDK的命令行工具 Java开发人员肯定都知道JDK的bin目录中的“java.exe”.“javac.exe”这两个命令行工具,对并非所有程序员都了解JDK的bin目录之中其他命令行程序的作用.每逢JDK更新版本时,bin目录下命令行工具的数量和功能都会不知…
重载与重写 在 Java 程序里,如果同一个类中出现多个名字相同,并且参数类型相同的方法,那么它无法通过编译.也就是说,在正常情况下,如果我们想要在同一个类中定义名字相同的方法,那么它们的参数类型必须不同.这些方法之间的关系,我们称之为重载. 小知识:这个限制可以通过字节码工具绕开.也就是说,在编译完成之后,我们可以再向 class 文件中添加方法名和参数类型相同,而返回类型不同的方法.当这种包括多个方法名相同.参数类型相同,而返回类型不同的方法的类,出现在 Java 编译器的用户类路径上时,它…
学习链接:https://blog.csdn.net/u010425776/article/details/51170118 博主整理的条理清晰,在这里先感谢博主分享 去年看视频学习写过一篇JVM的博客,今年已经忘得精光,归根结底是没有结合实践深入理解,为加深记忆,手打重新整理一下,一边思考,加深理解: JVM内存模型 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方…
JVM概念 虚拟机:指以软件的方式模拟具有完整硬件,VM概念 虚拟机:指以软件的方式模拟具有完整硬件系统功能.运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现.常用的虚拟机有VMWare,Visual Box,Java Virtual Machine(Java虚拟机,简称JVM). Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码.而引入Java语言虚拟机后,Java语…
前言 因为疫情的影响,现在都变成金五银六了.为了方便大家,在此开一个程序猿面试系列.总结各大公司所问的问题,希望能够帮助到大家,适合初中级java程序猿阅读. 1. Java类实例化时,JVM执行顺序? 正确的顺序如下: 1父类静态代码块 2父类静态变量 3子类静态代码块 3子类静态变量 4父类成员变量赋值 5父类构造方式开始执行 6子类成员变量赋值 7子类构造方式开始执行 需要注意的地方是静态变量和静态代码块谁在前面谁先执行. 看一段代码示例: package com.jdk.learn; /…
1.背景 在上一节中,我们掌握了垃圾收集的一些算法,也弄明白了分代回收的原理, 那么HotSpot虚拟机是如何发起内存回收的? 2.如何找到GC Roots根节点(枚举根节点) 从可达性分析中GC Roots 节点找引用链这个操作为例,可作为GC Roots 的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,现在的很多应用仅仅方法区就有数百兆,如果要逐个检查这里面的引用,那么必然会消耗很多时间. 另外,可达性分析对执行时间的敏感还体现在GC停顿上,因为这项…
前言 JDK的bin目录中有一系列的小工具,除了java.exe.javac.exe这两个编译和运行Java程序外,还有打包.部署.签名.调试.监控.运维等各种场景都会用到这些小工具. 这些工具根据软件可用性和授权的不同,可以把它们划分为三类: 商业授权工具: 主要是JMC(Java Mission Control)及它要使用到的JFR(Java Flight Recorder),JMC在个人开发环境中使用是免费的,但是在商业环境中使用它则是付费的. 正式支持工具: 这一类工具属于被长期支持的工…
4. GC日志分析 4.1 日志分析 通过阅读GC日志,我们可以了解Java虚拟机内存分配与回收策略. 内存分配与垃圾回收的参数列表-XX:+PrintGC:输出GC日志.类似-verbose: gc -XX: +PrintGCDetails输出GC的详细日志 -XX:+ PrintGCTimeStamps输出GC的时间戳(以基准时间的形式) -XX:+ PrintGCDateStamps输出GC的时间戳(以日期的形式,如2013-0504m21:53:59.234+0800) -XX: +Pr…
3. 回收器 3.1 Serial回收器:串行回收 3.1.1 概述 Serial收集器是最基本.历史最悠久的垃圾收集器了.JDK1.3之前回收新生代唯一的选择. Serial收集器作为Hotspot中Client模式下的默认新生代垃圾收集器. Serial收集器采用复制算法.串行回收和"stop-the-World"机制的方式执行内存回收. 除了年轻代之外, Serial收集器还提供用于执行老年代垃圾收集的Serial Old收集器. Serial Old收集器同样也采用了串行回收和…
1. GC分类与性能指标 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商.不同版本的JVM来实现.由于JDK的版本处于高速迭代过程中,因此Java发展至今已经产生了众多的GC版本.从不同角度分析垃圾收集器,可以将GC分为不同的类型. 1.1 GC分类 按线程数(垃圾回收的线程)分可以分为串行垃圾回收器和并行垃圾回收器. 串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束.在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越…
1. System.gc()的理解 在默认情況下,通过System.gc()或者Runtime. getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存. 然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(仅仅是提醒垃圾回收,会不会回收不一定). JVM实现者可以通过System.gc()调用来决定JVM的GC行为.而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了.在一些特殊…
1. 标记阶段 1.1 引用计数算法 1.1.1 对象存活判断 在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象.只有被标记为己经死亡的对象,GCオ会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段. 那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡. 判断对象存活一般有两种方式:引用计数算法和可达性分析算法. 1.1.2…
1. 执行引擎概述 1.1 执行引擎 1.2 概述 执行引擎是Java虚拟机的核心组成部分之一. 虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.缓存.指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式. JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,…
1. 直接内存 不是虚拟机运行时数据区的一部分,也不是<Java虚拟机规范>中定义的内存区域. 直接内存是Java堆外的.直接向系统申请的内存区间. 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存. IO:阻塞式 NIO:非阻塞式 通常,访问直接内存的速度会优于Java堆.即读写性能高 因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存 Java的NIO库允许Java程序使用直接内存,用于数据缓冲区 也可能导致OutOfMemoryError异常:OutO…
1. 对象的实例化 1.1 创建对象的方式 new 最常见的方式 变形1 : Xxx的静态方法 变形2 : XxBuilder/XxoxFactory的静态方法 Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是public Constructor的newInstance(Xxx):反射的方式,可以调用空参.带参的构造器,权限没有要求 使用clone():不调用任何构造器,当前类需要实现Cloneable接口,实现clone() 使用反序列化:从文件中.从网络中…
1. 栈.堆.方法区关系交互 运行时数据区结构图: 从线程共享与否的角度来看: 2. 方法区的理解 2.1 方法区在哪里? <Java虚拟机规范>中明确说明:“尽管所有的方法区在逻辑上属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩.”但对于HotSpotJVM而言,方法区还有一个别名叫做Non-heap(非堆),目的就是要和堆分开. 所以,方法区可以看作是一块独立于Java堆的内存空间. 2.2 方法区的基本理解 方法区(Method Area)与Java堆一样,是各个…
1. 核心概述 1.1 堆概述 一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器.本地方法栈和虚拟机栈. 一个jvm实例只存在一个堆内存,堆也是java内存管理的核心区域 |  配置jvm及查看jvm进程 Java堆区在JVM启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大一块内存空间 | 堆内存的大小是可以调节的 <Java虚拟机规范>规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的 所有的线程…
1. 本地方法栈 2. 什么是本地方法栈? Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用   本地方法栈,也是线程私有的. 允许被实现成固定或者是可动态拓展的内存大小.(在内存溢出方面是相同的) | 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverFlowError异常. | 如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么jav…