![](https://img-blog.csdnimg.cn/20210205155336312.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
jvm学习之旅
文章平均质量分 91
探索jvm中的各种技术及其实现原理
保温杯里泡代码
把握现在,未来可期
展开
-
分析GC日志
目录GC日志参数GC日志参数参数作用-verbose:gc输出gc日志信息,默认输出到标准输出-XX:+PrintGC输出GC日志。类似:-verbose:gc-XX:+PrintGCDetails在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配情况-XX:+PrintGCTimeStamps输出GC发生时的时间戳-XX:+PrintGCDateStamps输出GC发生时的时间戳(以日期的形式,如2013-05-04T21原创 2021-03-25 21:06:18 · 212 阅读 · 0 评论 -
JVM运行时参数
目录原创 2021-03-25 16:28:01 · 224 阅读 · 0 评论 -
JVM监控及诊断工具之GUI篇
目录工具概述图形化综合诊断工具jConsole基本概述启动三种连接方式Visual VM基本概述插件的安装连接方式基本使用工具概述使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但它们存在下列局限:无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要)。要求用户登录到目标Java 应用所在的宿主机上,使用起来不是很方便。分析数据通过终端输出,结果展示不够直观。为此,JDK提供了一些内存泄漏的分析工具,如jconso原创 2021-03-23 16:00:21 · 282 阅读 · 0 评论 -
JVM监控及诊断工具之命令行篇
JVM监控及诊断工具之命令行篇概述jps:查看正在运行的JAVA进程概览基本用法jstat:查看JVM统计信息基本情况interval参数count参数-t参数-h参数options参数概述性能诊断是软件工程师在日常生活中需要经常面对的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。Java作为最流行的编程语言之一,其应用的性能诊断能力一直受到业界的广泛关注。可能造成Java应用出现性能问题的因素非常多,例如线程控制,磁盘读写,数据库访问,网络I/O,垃圾收集等。想要定位这些问题,原创 2021-03-16 11:30:58 · 166 阅读 · 0 评论 -
垃圾回收器
目录垃圾回收器GC分类与性能指标垃圾收集器分类按线程数分按工作模式分按碎片处理方式分评估GC的性能指标性能指标:吞吐量性能指标:暂停时间吞吐量vs暂停时间不同的垃圾回收器概述垃圾回收器发展史7种经典的垃圾收集器7款经典收集器与垃圾分代之间的关系垃圾收集器的组合关系如何查看默认垃圾收集器Serial回收器:串行回收总结ParNew回收器:并行回收Parallel回收器:吞吐量优先参数配置CMS回收器:低延迟CMS为什么不使用标记整理算法?优点缺点设置的参数小结JDK后续版本中CMS的变化G1回收器:区域化分代原创 2021-03-01 21:27:46 · 70 阅读 · 0 评论 -
垃圾回收相关概念
目录垃圾回收相关概念System.gc()的理解手动GC来理解不可达对象的回收内存溢出内存泄漏举例Stop The World垃圾回收的并行与并发并发并行并发和并行对比垃圾回收的并行与并发安全点与安全区域安全点安全区域再谈引用再谈引用:强引用举例总结再谈引用: 软引用再谈引用:弱引用再谈引用:虚引用案例终结器引用垃圾回收相关概念System.gc()的理解在默认情况下,通过system.gc()者Runtime.getRuntime().gc() 的调用,会显式触发FullGC,同时对老年代和新生代进原创 2021-02-23 15:44:28 · 90 阅读 · 0 评论 -
垃圾回收相关算法
目录垃圾回收相关算法标记阶段:引用计数算法循环引用举例小结标记阶段:可达性分析算法概念思路GC Roots可以是哪些?总结小技巧注意对象的finalization机制注意生存还是死亡?具体过程代码演示MAT与JProfiler的GC Roots溯源MAT是什么?命令行使用 jmap使用JVIsualVM使用MAT打开Dump文件JProfiler的GC Roots溯源如何判断什么原因造成OOM清除阶段:标记-清除算法执行过程什么是清除?缺点清除阶段:复制算法背景核心思想优点缺点注意清除阶段:标记-整理算法背原创 2021-02-23 15:37:39 · 90 阅读 · 0 评论 -
垃圾回收概述
垃圾回收概述概念这次我们主要关注的是黄色部分,内存的分配与回收什么是垃圾在提到什么是垃圾之前,我们先看下面一张图从上图我们可以很明确的知道,Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我们手动的收集。垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。关于垃圾收集有三个经典问题:哪些内存需要回收?什么时候回收?如何回收?垃圾收集机制是Java的招牌能力,极大地提高了原创 2021-02-23 15:23:22 · 105 阅读 · 0 评论 -
StringTable
目录StringTableString的基本特性为什么JDK9改变了结构String的不可变性面试题注意String的内存分配为什么StringTable从永久代调整到堆中String的基本操作字符串拼接操作底层原理拼接操作和append性能对比intern()的使用intern的空间效率测试面试题new String("ab")会创建几个对象new String("a") + new String("b") 会创建几个对象intern的使用:JDK6和JDK7JDK6中JDK7中扩展总结StringTab原创 2021-02-20 21:23:53 · 91 阅读 · 0 评论 -
执行引擎
目录执行引擎执行引擎概述执行引擎的工作流程Java代码编译和执行过程什么是解释器(Interpreter)什么是IT编译器为什么Java是半编译半解释型语言机器码、指令、汇编语言机器码指令指令集汇编语言高级语言C、C++源程序执行过程字节码解释器解释器分类现状JIT编译器Java代码的执行分类问题来了HotSpot JVM执行方式案例概念解释热点探测技术方法调用计数器热点衰减回边计数器HotSpotVM 可以设置程序执行方法HotSpotVM中 JIT 分类C1 和 C2编译器不同的优化策略分层编译策略总结原创 2021-02-19 17:59:36 · 75 阅读 · 0 评论 -
直接内存 Direct Memory
目录直接内存 Direct Memory非直接缓存区和缓存区存在的问题直接内存 Direct Memory不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存通常,访问直接内存的速度会优于Java堆。即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区原创 2021-02-19 17:49:16 · 133 阅读 · 0 评论 -
对象实例化内存布局与访问定位
目录对象实例化内存布局与访问定位对象实例化面试题对象创建方式创建对象的步骤判断对象对应的类是否加载、链接、初始化为对象分配内存处理并发问题初始化分配到的内存设置对象的对象头执行init方法进行初始化对象实例化的过程对象内存布局对象头运行时元数据类型指针实例数据(Instance Data)说明小结对象的访问定位图示对象访问的两种方式句柄访问优点直接指针(HotSpot采用)对象实例化内存布局与访问定位对象实例化面试题对象在JVM中是怎么存储的?对象头信息里面有哪些东西?Java对象头有什么?原创 2021-02-19 17:45:53 · 65 阅读 · 0 评论 -
方法区
目录方法区前言栈、堆、方法区的交互关系方法区的理解HotSpot中方法区的演进设置方法区大小与OOMjdk7及以前JDK8以后如何解决这些OOM方法区的内部结构类型信息域信息方法(Method)信息non-final的类变量全局常量运行时常量池 VS 常量池常量池为什么需要常量池常量池中有什么小结运行时常量池方法区使用举例方法区的演进细节为什么永久代要被元空间替代?StringTable为什么要调整位置静态变量存放在那里?方法区的垃圾回收总结常见面试题方法区前言这次所讲述的是运行时数据区的最后一个部分原创 2021-02-16 22:45:04 · 93 阅读 · 0 评论 -
本地方法栈
目录本地方法栈本地方法栈Java虚拟机栈于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。本地方法栈,也是线程私有的。允许被实现成固定或者是可动态扩展的内存大小。(在内存溢出方面是相同的)如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个stackoverflowError 异常。如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么Java虚拟机将会抛出一个outofMem原创 2021-02-16 17:12:27 · 148 阅读 · 0 评论 -
本地方法接口
目录本地方法接口什么是本地方法为什么使用Native Method?与Java环境的交互与操作系统的交互Sun's Java现状本地方法接口什么是本地方法简单地讲,一个Native Methodt是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern “c” 告知c++编译器去调用一个c的函数。“A native metho原创 2021-02-16 17:11:24 · 107 阅读 · 0 评论 -
堆
堆堆的核心概念堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-81bo7PM1-1613223244461)(images/image-20200706195127740.png)]一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存的大小是可原创 2021-02-16 17:08:25 · 108 阅读 · 0 评论 -
虚拟机栈
目录虚拟机栈虚拟机栈概述Java虚拟机栈是什么生命周期作用栈的特点开发中遇到哪些异常?设置栈内存大小栈的存储单位栈中存储什么?栈运行原理栈帧的内部结构局部变量表关于Slot的理解Slot的重复利用静态变量与局部变量的对比操作数栈概念代码追踪栈顶缓存技术动态链接方法调用:解析与分配链接静态链接动态链接绑定机制早期绑定晚期绑定早晚期绑定的发展历史虚方法和非虚方法普通调用指令:动态调用指令:invokednamic指令动态类型语言和静态类型语言方法重写的本质Java 语言中方法重写的本质:IllegalAcces原创 2021-02-08 22:29:49 · 271 阅读 · 0 评论 -
程序计数器
目录程序计数器介绍作用代码演示使用PC寄存器存储字节码指令地址有什么用呢?PC寄存器为什么被设定为私有的?CPU时间片结语程序计数器介绍JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器原创 2021-02-08 10:50:22 · 750 阅读 · 0 评论 -
类加载子系统之内存、运行时数据区与线程概述
目录内存图类加载器子系统概述类加载器子系统作用类加载器ClassLoader角色类的加载过程加载链接初始化类加载器的分类启动类加载器(引导类加载器,Bootstrap ClassLoader)扩展类加载器(Extension ClassLoader)应用程序类加载器(系统类加载器,AppClassLoader)用户自定义类加载器获取ClassLoader的途径双亲委派机制原理优势细节补充在JVM中表示两个class对象是否为同一个类存在两个必要条件对类加载器的引用类的主动使用和被动使用运行时数据区线程结语原创 2021-02-07 19:29:11 · 187 阅读 · 2 评论 -
JVM的发展历程
目录Sun Classic VMExact VMHotSpot VMHotSpot历史HotSpot介绍BEA 的 JRockitIBM 的J9KVM和CDC/CLDC HotSpotAzul VMLiquid VMApache HarmonyMicrosoft JVMTaobaoJVMDalvik VM其他JVMGraal VMENDSun Classic VM早在1996年Java1.0版本时,Sun公司发布了一款名为Sun Classic VM的虚拟机,它是世界上第一款商用Java虚拟机,JDK1原创 2021-02-06 17:40:07 · 102 阅读 · 0 评论 -
JVM概述
JVM概述java和jvmjava和jvmjava语言是一个跨平台的语言。如下图:原创 2021-02-05 21:27:19 · 160 阅读 · 0 评论