![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 80
夹毛局的程序员
这个作者很懒,什么都没留下…
展开
-
33.GC日志分析
GC日志分析针对HotSpot VM实现,GC按照回收区域分为两大种类,一种是部分收集(Partial GC),另一种是整堆收集(Full GC)部分收集 不完整收集整个java堆垃圾收集新生代收集(Minor GC / Young GC) 只收集新生代Eden S0 S1 的垃圾收集老年代收集(Major GC / Old GC) 只收集老年代目前只有CMS会有单独收集老年代的行为注意很多时候 Major GC 和 FullGC混淆使用 需要具体分辨是老年代收集还是整堆收集混合原创 2021-03-04 16:06:13 · 210 阅读 · 1 评论 -
32.常用的JVM参数汇总
JVM的参数分类标准参数 属于JVM的标准参数 如常用的-version -help -server等-X类型参数 如-Xms -Xmx -Xss等也对应有-XX的参数-XX类型参数 容易产生变化的参数也是功能最多的参数 又可以细分布尔型和赋值性 如-XX:+PrintGCDetails intGCDetails 或者 -XX:NewRatio=2常用的JVM参数JDK8 的JVM参数官网https://docs.oracle.com/javase/8/docs/technot原创 2021-03-04 16:01:47 · 234 阅读 · 1 评论 -
31.arthas工具的使用
ArthasArthas是阿里开源的诊断工具当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!是否有一个全局视角来查看系统的运行状况?有什么办法可以监控到JVM的实时运行状态?怎么快速定位应用的热点原创 2021-03-04 15:41:26 · 287 阅读 · 1 评论 -
30.jvm命令行监控工具
jps查看java进程信息jps [-q] [-mlvV] []-q 静默模式 只输出pid-m 查看运行java命令带的参数 如 main 方法的args参数-l 显示类的全名-v 显示程序配置的jvm参数 如-xms2g-V 输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件jinfo查看java进程的JVM参数可选的option-flag 打印某一个jvm的参数值 如 jinfo -flag MaxHeapSize原创 2021-03-04 15:31:15 · 190 阅读 · 1 评论 -
29.字节码指令集与解析
字节码指令集与解析概述java字节码对于虚拟机好像汇编语言对于计算机,属于基础执行指令java虚拟机的指令由一个字节长度代表某种特定操作含义的数字(操作码Opcode)以及跟随其后的零至多个代表次操作所需参数(操作数 Operands)构成,由于java虚拟机采用面向操作数栈而不是寄存器结构,所以大多数指令都不包含操作数,只有一个操作码由于限制java虚拟机操作码的长度为一个字节(0~255),这意味着指令集的操作码总数不能超过256条官方文档 https://docs.oracle.com/j原创 2021-01-29 15:12:05 · 332 阅读 · 0 评论 -
28.Class文件结构
Class文件结构字节码的跨平台性Java本身具有跨平台性 write once, run anywhere当java源代码成功编译成字节码后,如果想在不同平台上运行,则无需再次编译跨平台已经不是那么吸引人了.Python PHP Ruby Perl List等强大的解释器本身已经跨平台跨平台已经快成为一门语言的标配Java虚拟机是跨语言的平台 任何如何JVM规范的class文件都可以运行在JVM上Java虚拟机不合包括java在内的任何语言绑定,只跟class文件这种特定的二进制文件绑定原创 2021-01-27 16:57:54 · 300 阅读 · 0 评论 -
27.GC日志分析
GC日志分析通过阅读GC日志,我们可以了解java虚拟机内存分配回收策略,内存分配与垃圾回收的参数列表-XX:+PrintGC 输出GC日志 类似-verbose:gc-XX:+PrintGCDetails 输出GC详细日志-XX:+PrintGCTimestamps 输出GC时间戳 (以基准时间的形式)-XX:+PrintGCDatestamps 输出GC日期时间戳 (以日期的形式,如2013-05-04T21:53:59.234+0800)-XX:+PrintHeapAtGC 在进行GC前原创 2021-01-27 16:57:03 · 214 阅读 · 0 评论 -
26.垃圾回收器
垃圾回收器垃圾收集器没有JVM规范中明确定义,不同厂商不同版本的JVM具体实现JDK每次迭代的时候都会对GC进行优化java不同版本新特性语法层面: Lambda表达式 switch 自动装拆箱 enumAPI层面: Stream LocalDate Optional String Collectors底层优化: JVM优化 GC优化 元空间 静态与 字符串常量池位置变化垃圾收集器分类按线程数分串行垃圾回收器和并行垃圾回收器串行回收器在同一时间段只允许一个CPU执行垃圾回原创 2021-01-26 17:29:53 · 272 阅读 · 0 评论 -
25.垃圾回收相关概念
System.gc()的理解默认情况下,通过System.gc()或者Runtime.getRuntime().gc()调用,会显示触发FullGC,同时对新生代和老年代进行回收,尝试释放丢失对象占用的内存System#gc有一条免责声明,无法保证对垃圾收集器的调用,不一定保证立即生效JVM实现者可以通过System#gc调用来决定JVM的GC行为.一般情况下垃圾回收是自动进行的,无须手动触发.一些特殊情况下,如性能测试基准之前可以显示调用一下gcpublic class Syste原创 2021-01-26 17:11:59 · 117 阅读 · 0 评论 -
24.垃圾回收相关算法
垃圾回收相关算法标记阶段 概述在堆里存放几乎所有的java对象实例,在GC执行之前,首先需要区分内存中哪些是存活对象,哪些是已经死亡的对象,只有被标记为已经死亡的对象,GC才会执行垃圾回收,释放其占用的内存空间,因此这个过程我们成为垃圾标记阶段判断对象存活一般有两种方式:引用计数算法 和 可达性分析算法引用计数算法 Reference Counting比较简单,堆每个对象保存一个整型的引用计数器属性.用于记录对象被引用的情况对于一个对象A,只要有任何一个对象引用了A,那么A的引用计数器+1原创 2021-01-26 16:30:11 · 110 阅读 · 0 评论 -
23.垃圾回收概述
前言垃圾收集,很多语言都存在垃圾收集技术,也成为后来高级语言的主流.让开发者不在关系底层的内存申请回收,聚焦业务功能的实现垃圾回收的三大经验问题那些内存需要回收? 什么是垃圾? 对应垃圾的标记阶段和标记算法什么时候回收? 对应垃圾回收算法如何回收? 对应垃圾的回收算法什么是垃圾?垃圾是指在运行程序中没有任何指针指向的对象,该对象就是需要被回收的垃圾如果不及时堆内存中的垃圾进行清理,那么这些垃圾会一直保留到程序进程结束,被保留的内存空间也无法被其他对象使用,甚至导致内存溢出原创 2021-01-26 16:27:45 · 90 阅读 · 0 评论 -
22.StringTable
方法1耗费的时间:4005ms,方法2消耗时间:7msString的基本特征String: 字符串一般用""来表示String s1 = “hello”; // 字面量定义方式String s2 = new String(“haha”); // 对象方式String声明为final 不能继承String 实现了Serializable Comparable 接口JDK8以前内部定义了final char[] value数组来存储字符串数据,JDK9之后改用byte[]JDK9为什么改原创 2021-01-22 15:22:10 · 98 阅读 · 0 评论 -
21.执行引擎概述
执行引擎概述执行引擎处于JVM下层,包括了解释器,即时编译器JIT,垃圾回收器GC执行引擎是JVM核心组成部分之一. 虚拟机是相对于物理机的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器,缓存,指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约定制指令集与执行引擎的结构体系,能够执行那么不被硬件支持的指令集格式JVM的主要任务是负责装载字节码,但字节码并不能直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,他内部包含原创 2021-01-22 14:52:00 · 250 阅读 · 0 评论 -
20.直接内存
直接内存 Direct Memory不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域直接内存是在java堆之外,直接向操作系统申请的内存来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存通常,访问直接内存性能速度会由于java堆.读写性能高因此出于性能考虑,读写频繁的场合,可能会参考直接直接内存javaNIO库允许java程序直接使用本地内存,可以用于数据缓冲区NIO中的BufferByteBuffer buff原创 2021-01-22 14:50:08 · 108 阅读 · 0 评论 -
19.对象实例化内存布局与访问定位
对象实例化步骤对象创建的方式new: 最常见的方式,包括单例中的getInstance静态方法或者XXFactory方法Class的newInstance方法: 反射的模式 JDK9标记为过时的方法,因为只有调用空参构造器Constructor的newInstance方法: 反射模式 可以调用带参构造器使用clone(): 不调用构造器,实现Cloneable接口中的clone接口使用序列化: 一般用于网络 文件等传输第三方库: Objenesis创建对象的步骤判断对象对应的类是原创 2021-01-22 14:36:02 · 101 阅读 · 0 评论 -
18.方法区常见面试题
常见面试题百度 三面:说一下JVM内存模型吧,有哪些区?分别干什么的?Java虚拟机栈: 每个线程独有,主要用于控制程序运行,保存局部变量 动态链接堆空间: 主要存储类的实例对象数据方法区: 主要存放类的类型信息 域信息 运行时常量池 方法信息本地方法区: 主要用于非java实现方法的调用程序计数器: 保存当前程序指令地址蚂蚁金服: Java8的内存分代改进 JVM内存分哪几个区,每个区的作用是什么? 一面:JVM内存分布/内存结构?栈和堆的区别?堆的结构?为什么两个survivor区?原创 2021-01-21 20:51:23 · 116 阅读 · 0 评论 -
17.常量池与运行时常量池
常量池一个有效的字节码文件中除了包含的版本信息,字段,方法以及接口等描述符等信息外,还包含常量池表Constant Poll Table,包括各种字面量和对类,域,方法符号引用为什么需要常量池一个java源文件中的类,接口,编译后产生一个字节码文件.而java中的字节码需要数据支持,通常这种数据会很大以至于不能直接存在字节码中,换另一种方式,可以存在常量池,这些字节码包含了指向常量池的引用.在动态链接的时候会使用到运行时常量池public class SimpleClass { publi原创 2021-01-21 20:32:45 · 1598 阅读 · 1 评论 -
16.方法区概述
方法区概述方法区是属于运行时数据区的一部分从线程共享的角度来看,方法区依然被所有线程所共享栈 堆 方法区的交互关系Person.class 通过类加载子系统加载到JVM中Person的类信息保存在方法区中new Person() 实际的对象数据保存在堆中Person p = new Person(); p变量保存在java虚拟栈中占一个slot 指向了堆空间中实际的实例数据堆空间中的实例数据中也保存了方法区中对象类型信息方法区理解在Java虚拟机规范中说明,尽管所有方原创 2021-01-13 17:40:45 · 527 阅读 · 0 评论 -
15.堆的逃逸分析 栈上分配 锁消除 标量替换
逃逸分析在《深入理解Java虚拟机》中关于java堆内存有这段一段描述随着JIT编译器的发展与逃逸分析技术的逐渐成熟,站上分配,标量替换优化技术会导致一些微妙的变化,所有的对象都分配到堆上渐渐变得不那么绝对了在JVM中,对象是在堆中分配内存,这是一个普遍尝试.但是也有一种特殊情况,那就是如果经过逃逸分析(Escape Analysis)后发现,一个对象没有逃逸出方法的话,那么可能被优化成栈上分配.这样就无需在堆上分配内存,也无须进行垃圾回收了,这也是最常见的对外存储技术.此外,阿里基于OpenJDK原创 2021-01-13 17:33:19 · 154 阅读 · 0 评论 -
14.堆JVM常用参数汇总
堆空间常用参数设置-XX:+PrintGCDetails 打印详细GC执行信息打印简要GC信息 -XX: +PrintGC 或者 -verbose:gc-XX:+PrintFlagsInitial 查看当前JVM所有参数的默认值-XX:+PrintFlagsFinal 查看当前JVM所有参数的最终值(因为可能通过-XX修改过,在修改之后的参数之前会有一个冒号:)-Xms: 初始堆空间大小 默认物理内存的1/64-Xxx: 最大堆空间大小 默认物理你内存1/4-原创 2021-01-13 17:27:43 · 130 阅读 · 0 评论 -
13.堆的TLAB
TLABThread Local Allocation Buffer 为每一个线程在堆空间单独分配一个缓冲区因为存在TLAB的存在,堆空间并不是所有空间都是共享的为什么有TLAB?堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的为避免多个线程操作同一个地址,需要使用加锁机制,进而影响到分配速度什么是TLAB从内存模型上而不是垃圾收集的角度,对Eden区继续进行划分,JVM为原创 2021-01-13 17:14:19 · 164 阅读 · 1 评论 -
12.GC汇总
GC总结Minor GC Major GC FullGCMinor GC 新生代GCMajor GC 老年代GCFull GC 整堆收集,收集整个java堆和方法区的所有垃圾因为STW问题的存在,尽量避免垃圾回收Major GC 和Full GC出现STW的时间往往是Minor GC的10倍以上 所以尽量避免出现Major GC和Full GC的调用JVM在进行GC时,并非每次都对上面三个内存区域一起回收,大部门时间回收是在新生代.针对HotSpot虚拟机,他里面的GC按照回收原创 2021-01-13 16:57:30 · 159 阅读 · 0 评论 -
11.堆
堆堆针对一个JVM进程来说是唯一的,一个进程只有一个JVM,但是一个进程包含多个线程,他们共享同一个堆空间JVM实例只存在一个堆内存,堆也是java内存管理的核心区域Java堆去在JVM启动的时候即可被创建,其空间大小已经确定了,是JVM管理的最大一块内存空间堆内存大小是可以调节的堆可以处于物理上不连续的内存空间中,但逻辑上他们被视为连续的所有线程共享堆空间,堆里面也有划分的线程私有的缓冲区 Thread Local Allocation Buffer TLAB-Xm原创 2021-01-13 16:39:44 · 88 阅读 · 0 评论 -
10.本地方法栈
本地方法接口Native Method是一个java调用非java代码的接口.A native method is a Java method whose implementation is provided by non-java code定义本地方法不提供实现提类似接口,其实现由非java语言实现需要注意的是:标识符native可以与其它java标识符连用,但是abstract除外public class IhaveNatives { public native voi原创 2021-01-11 17:35:28 · 62 阅读 · 0 评论 -
9.虚拟机栈面试题
方法调用 解析与分配JVM中,将符号引用转换为调用方法的直接引用于方法绑定的机制相关链接静态链接当一个字节码文件被装载到JVM内部时,如果调用的目标方法在编译时期已经确定,并且运行时期保持不变,这种情况下调用方法的引用转换为直接引用的过程叫静态链接动态链接如果被调用的方法在编译期无法确定,只能在程序运行时候才能将方法的引用转换为直接引用的过程叫动态链接,比如多态 只有在运行时候才能确定到底调用的是哪个子类的方法绑定机制对应的方法绑定机制为 早期绑定 Early原创 2021-01-11 15:54:58 · 80 阅读 · 0 评论 -
8.虚拟机栈-动态链接和方法返回地址
操作数栈 Operand Stack每一个独立的栈帧除了包含局部变量表之外,还包含一个FIFO的操作数栈,也成为表达式栈Expression Stack操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即Push Pop某一些字节码指令将值压入操作数栈,某些字节码指令取出值,使用他们之后再压入比如 复制 交换 求和等操作操作数栈,主要用于保存计算过程中的中间结果,同时计算过程中的变量临时存储空间操作数栈是JVM执行引擎的一个工作区,当一个方法刚开始执行的时候,一个新的原创 2021-01-11 15:45:19 · 249 阅读 · 0 评论 -
7.虚拟机栈-操作数栈
操作数栈 Operand Stack每一个独立的栈帧除了包含局部变量表之外,还包含一个FIFO的操作数栈,也成为表达式栈Expression Stack操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即Push Pop某一些字节码指令将值压入操作数栈,某些字节码指令取出值,使用他们之后再压入比如 复制 交换 求成等操作操作数栈,主要用于保存计算过程中的中间结果,同时计算过程中的变量临时存储空间操作数栈是JVM执行引擎的一个工作区,当一个方法刚开始执行的时候,一个新的原创 2021-01-11 15:39:29 · 129 阅读 · 0 评论 -
6.虚拟机栈-局部变量表
局部变量表Local Variables 局部变量表或者本地 变量表定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量包括基本数据类型和对象引用refrence 和 方法返回地址 returnAddress类型局部变量表是建立在线程栈之上,线程私有,不存在线程安全问题局部变量表所需的容量大小在编译期已经确定下来了,并保存在方法的Code属性maximum local varivables 数据项中,在方法运行期间是不会改变局部变量表的大小方法嵌套调用的次数由栈大原创 2021-01-11 15:33:49 · 242 阅读 · 0 评论 -
5.虚拟机栈
虚拟机栈由于跨平台设计,java指令都是根据栈来设计的,不同平台的CPU架构不同,所以不能基于寄存器,基于栈设计有点在于跨平台,指令集小,编译器容易实现,缺点在于性能下降,实现同样的功能需要更多的指令栈是运行时单位,堆是存储单位栈解决程序的运行问题,程序如何执行或者说如何处理数据堆解决数据存储问题,数据怎么放,放哪里java虚拟机栈 Java Virtual Machine Stack 早期叫JAVA栈 每个线程在创建的时候会创建一个虚拟机栈,其内部保存了一个个栈帧Stack Fr原创 2021-01-11 15:29:07 · 73 阅读 · 0 评论 -
4.运行时数据区和PC寄存器
运行时数据区JVM定义了若干程序运行时会使用运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出销毁。有一些则是与线程绑定,与线程对应的数据区会随着线程的生命周期每个线程共有的有Heap 和Method Area 私有的每个线程一份的有PC register,Virtual Machine Stack , Native Method Stack后台系统线程在Hot Spot虚拟机中主要有以下几个虚拟机线程 线程操作的是需要JVM达到安全点才会出现.这些操作必须在不同的线程中发生的原因原创 2021-01-11 15:24:28 · 132 阅读 · 0 评论 -
3.类加载过程详解
类加载过程详解概述在java中数据类型分为基本数据类型和引用数据类型.基本数据类型由虚拟机预先定义,引用数据类型则需要进行类加载按照Java虚拟机规范,从Class文件加载到内存中的类,到类卸载出内存位置,整个生命周期包括如下七个阶段加载Loading -> 链接Linking(验证Verification -> 准备Preparation -> 解析Resolution) ->初始化Initiallzation -> 使用Using ->其中验证 准备 解析 和原创 2020-12-18 11:48:06 · 199 阅读 · 0 评论 -
2.类加载子系统
类加载子系统类加载子系统负责从文件系统或网络中加载class文件,所有的class文件在文件开头会有特定魔术因子 ClassLoader只负责加载class文件,至于他只有运行由Execution Engine决定加载的类信息存在在方法区中,除了类的信息,方法区还存放运行时常量池信息,可能还包括字符串字面量和数字常量class文件加载到JVM中 被称为DNS元数据模板,放在方法区执行流程Loading-> 【Verification -> Preparation -原创 2020-12-14 17:00:20 · 66 阅读 · 0 评论 -
1.JVM体系结构
写在最前 JVM所有参数官方列表 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html资料参考 尚硅谷宋红康老师B站视频教程笔记整理 与 <<深入理解java虚拟机>>JVM和Java体系结构JVM运行于操作系统之上,没有和硬件的直接交互,一次编译到处运行方法区和堆在所有线程共享内存区域java栈,本地方法栈和程序计数器是线程私有的内存区域方法区在JDK8中成为元空间Met原创 2020-12-14 16:56:21 · 97 阅读 · 0 评论