JVM学习笔记
文章平均质量分 91
JVM学习笔记
Zhang_960110
写博客的初衷:记录自己学习、思考、总结的过程;建立自己知识库,分类汇总保留。
展开
-
JVM_24_JVM运行时参数
文章目录1.JVM参数选项类型1.1 类型一:标准参数选项1.2 类型二:-X参数选项1.3 类型三:-XX参数选项2.添加JVM参数选项3.常用的JVM参数选项3.1 打印设置的XX选项及值3.2 堆、栈、方法区等内存大小设置3.3 OutOfMemory相关的选项3.4 垃圾收集器相关选项3.5 GC日志相关选项3.6 其他参数4.通过Java代码获取JVM参数1.JVM参数选项类型官网地址:https://docs.oracle.com/javase/8/docs/technotes/tools/原创 2022-02-27 15:46:19 · 275 阅读 · 0 评论 -
JVM_23_JVM监控及诊断工具-命令行篇
文章目录1.概述2.jps:查看正在运行的Java进程3.jstat:查看JVM统计信息4.jinfo:实时查看和修改JVM配置参数5.jmap:导出内存映像文件&内存使用情况1.概述Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。使用数据说明问题,使用知识分析问题,使用工具处理问题。无监控、不调优!2.jp原创 2022-02-26 22:14:08 · 230 阅读 · 0 评论 -
JVM_22_性能监控与调优概述
文章目录背景说明调优概述性能优化的步骤性能监控(发现问题)性能分析(排查问题)性能调优(解决问题)性能评价/测试指标停顿时间(或响应时间)吞吐量并发数内存占用相互间的关系背景说明生产环境中的问题生产环境发生了内存溢出该如何处理?生产环境应该给服务器分配多少内存合适?如何对垃圾回收器的性能进行调优?生产环境CPU负载飙高该如何处理?生产环境应该给应用分配多少线程合适?不加log,如何确定请求是否执行了某一行代码?不加log,如何实时查看某个方法的入参与返回值?为什么要调优防止出现O原创 2022-02-25 22:06:58 · 121 阅读 · 0 评论 -
JVM_21_再谈类的加载器
文章目录1.概述1.1 类的加载分类(显式加载VS隐式加载)1.2 类加载器的必要性1.3 命名空间1.4 类加载机制的基本特征2.类的加载器分类2.1 引导类加载器(Bootstrap ClassLoader)2.2 扩展类加载器(Extension ClassLoader)2.3 系统类加载器(AppClassLoader)2.4 用户自定义类加载器3.ClassLoader源码解析1.概述类加载器是JVM执行类加载机制的前提。ClassLoader的作用:ClassLoader是Java的核心原创 2022-02-24 21:45:49 · 185 阅读 · 0 评论 -
JVM_20_类的加载过程(类的生命周期)详解
文章目录1.概述2.过程一:Loading(加载)阶段2.1 加载完成的操作2.2 二进制流的获取方式2.3 类模型与Class实例的位置2.4 数组类的加载3.过程二:Linking(链接)阶段3.1 环节1:链接阶段之Verification(验证)3.2 环节2:链接阶段之Preparation(准备)3.3 环节3:链接阶段之Resolution(解析)4.过程三:Initialization(初始化)阶段4.1 chu1.概述在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型原创 2022-02-22 21:31:03 · 438 阅读 · 0 评论 -
JVM_19_字节码指令集与解析举例
文章目录1.概述1.1 执行模型1.2 字节码与数据类型1.3 指令分类2.加载与存储指令2.1 作用2.2 常用指令2.3 再谈操作数栈与局部变量表2.4 局部变量压栈指令1.概述Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令。Java虚拟机的指令由 一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由于Java虚拟机采用面向操作数栈而不是面向寄存器的结构,所以大多数的指令都原创 2022-02-20 23:50:43 · 241 阅读 · 0 评论 -
JVM_18_虚拟机的基石:Class文件
文章目录原创 2022-02-19 15:19:03 · 249 阅读 · 0 评论 -
JVM_17_Class文件结构概述
文章目录回顾字节码文件的跨平台性Class字节码的规范性Java的前端编译器透过字节码指令看代码执行细节回顾JVM基本组成字节码文件的跨平台性Java语言:跨平台的语言(write once,run anywhere)当Java源代码成功编译成字节码之后,如果想在不同的平台上运行,不需要再次编译。这个优势不是很吸引人了,因为Python、PHP、Perl、Ruby、Lisp等语言都有强大的解释器跨平台已经几乎称为一门语言的必选特性Java 虚拟机:跨语言的平台Java虚拟机不和包原创 2022-02-17 18:31:50 · 714 阅读 · 0 评论 -
JVM_16_垃圾回收器
文章目录1.GC分类与性能指标1.1 垃圾回收器概述1.2 垃圾收集器分类1.2.1 按线程数分1.2.2 按工作模式分1.2.3 按碎片处理方式分1.2.4 按工作的内存区间分1.3 评估 GC 的性能指标1.3.1 评估 GC 的性能指标:吞吐量(Throughput)1.3.2 评估 GC 的性能指标:暂停时间(pause time)1.3.3 吞吐量 vs 暂停时间2.不同的垃圾回收器概述2.1 垃圾回收器发展史2.2 七款经典的垃圾收集器2.3 七款经典收集器与垃圾分代之间的关系2.4 垃圾收集器原创 2022-02-15 23:31:49 · 202 阅读 · 0 评论 -
JVM_15_垃圾回收相关概念
文章目录1.System.gc()的理解2.内存溢出与内存泄露2.1 内存溢出(OOM)2.2 内存泄漏(Memory Leak)3.Stop The World4.垃圾回收的并行与并发4.1 程序中的并行与并发4.1.1 并发(Concurrent)4.1.2 并行(Parallel)4.1.3 并发 vs 并行4.2 垃圾回收的并发与并行5.安全点与安全区域5.1 安全点5.2 安全区域6.引用概述1.System.gc()的理解在默认情况下,通过 System.gc() 者 Runtime.ge原创 2022-02-13 19:35:09 · 138 阅读 · 0 评论 -
JVM_14_垃圾回收相关算法
文章目录1.标记阶段:引用计数算法1.1 对象存活判断1.2 引用计数算法1.3 小结2.标记阶段:可达性分析算法2.1 可达性分析算法(根搜索算法、追踪性垃圾收集)2.2 基本思路2.3 GC Roots3.对象的finalization机制3.1 生存还是死亡?3.2 具体过程4.MAT与JProfiler的GC Roots溯源4.1 MAT是什么?4.2 获取dump文件方式一:命令行使用 jmap方式二:使用JVisualVM导出使用MAT打开Dump文件4.3 JProfiler的GC Roots原创 2022-02-12 19:31:09 · 126 阅读 · 0 评论 -
JVM_13_垃圾回收概述
文章目录1.什么是垃圾1.1 常见问题1.2 什么是垃圾2.为什么需要GC3.早期垃圾回收4.Java垃圾回收机制1.什么是垃圾垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。关于垃圾收集有三个经典问题:哪些内存需要回收?什么时候回收?如何回收?垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、原创 2022-02-11 21:17:35 · 147 阅读 · 0 评论 -
JVM_12_StringTable
文章目录1.String的基本特性1.1 String在jdk9中存储结构变更1.2 String的基本特性2.String的内存分配3.String的基本操作4.字符串拼接操作5.intern()的使用5.1 常见问题5.2 intern的使用:JDK6 vs JDK7/85.2.1 练习(对JDK不同版本intern的进一步理解)5.3 intern的效率测试:空间角度6.StringTable的垃圾回收7.G1中的String去重操作1.String的基本特性String:字符串,使用一对" "原创 2022-02-11 00:40:46 · 144 阅读 · 0 评论 -
JVM_11_执行引擎
文章目录原创 2022-02-08 23:56:19 · 534 阅读 · 0 评论 -
JVM_10_直接内存(Direct Memory)
文章目录直接内存概述非直接缓存区直接缓存区直接内存与OOM直接内存概述不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存。通常,访问直接内存的速度会优于Java堆,即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区/** * IO:阻塞式原创 2022-02-07 23:11:32 · 331 阅读 · 0 评论 -
JVM_09_对象的实例化内存布局与访问定位
文章目录1.对象的实例化1.1 创建对象的方式1.2 创建对象的步骤1.2.1 判断对象对应的类是否加载、链接、初始化1.2.2 为对象分配内存1.2.3 处理并发安全问题1.2.4 初始化分配到的空间1.2.5 设置对象的对象头1.2.6 执行init方法进行初始化2.对象的内存布局2.1 对象头2.2 实例数据(Instance Data)2.3 对齐填充2.4 总结3.对象的访问定位3.1 句柄访问3.2 直接指针(HotSpot采用)1.对象的实例化1.1 创建对象的方式new:最常见的方原创 2022-02-07 22:30:00 · 116 阅读 · 0 评论 -
JVM_08_方法区
文章目录1.栈、堆、方法区的交互关系2.方法区的理解2.1 方法区在哪里?2.2 方法区的基本理解2.3 HotSpot中方法区的演进3.设置方法区大小与OOM3.1 jdk7及以前3.2 jdk8及以后3.3 方法区OOM举例3.4 如何解决OOM4.方法区的内部结构4.1 类型信息4.2 域(Field)信息4.3 方法(Method)信息1.栈、堆、方法区的交互关系从线程共享与否的角度看栈、堆、方法区的交互关系Person 类的 .class 信息存放在方法区中person 变量存放原创 2022-02-06 17:26:33 · 126 阅读 · 0 评论 -
JVM_07_堆
文章目录1.堆(Heap)的核心概述1.1 堆内存细分2.设置堆内存大小与OOM2.1 堆空间大小的设置1.堆(Heap)的核心概述一个java程序对应一个进程一个进程对应一个JVM实例一个JVM实例中只有一个运行时数据区一个运行时数据区只有一个方法区和堆一个进程中的多个线程需要共享同一个方法区和堆空间每个线程拥有独立的一套程序计数器、本地方法栈、虚拟机栈一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确原创 2022-02-04 23:12:54 · 451 阅读 · 0 评论 -
JVM_06_本地方法栈
文章目录本地方法栈Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。本地方法栈,也是线程私有的。允许被实现成固定或者是可动态扩展的内存大小(在内存溢出方面和虚拟机栈相同)如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverflowError 异常。如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么Java虚拟机将会抛出一个Ou原创 2022-02-03 19:11:04 · 108 阅读 · 0 评论 -
JVM_05_本地方法接口
文章目录本地方法介绍简单地讲,一个Native Method是一个Java调用非Java代码的接囗。一个Native Method是这样的一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern “C” 告知C++编译器去调用一个C的函数。“A native method is a Java method whose implementation is provided by non原创 2022-02-03 17:46:09 · 97 阅读 · 0 评论 -
JVM_04_虚拟机栈
虚拟机栈原创 2022-02-03 14:59:17 · 128 阅读 · 0 评论 -
JVM_03_程序计数器(PC寄存器)
文章目录PC寄存器介绍PC寄存器的作用举例说明常见问题CPU时间片PC寄存器介绍JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。它是一块很小的内存空间,几原创 2022-02-02 15:16:30 · 101 阅读 · 0 评论 -
JVM_02_运行时数据区概述及线程
文章目录概述线程JVM系统线程概述本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区比如大厨做饭,我们把大厨后面的东西(切好的菜、刀、调料)比作是运行时数据区。而厨师可以类比于执行引擎,将通过准备的东西制作成精美的菜品。运行时数据区与内存内存是非常重要的系统资源,是硬盘和CPU的中间原创 2022-02-02 13:45:57 · 100 阅读 · 0 评论 -
JVM_01_类加载子系统
类加载子系统原创 2022-02-01 22:01:08 · 933 阅读 · 0 评论