Java虚拟机
文章平均质量分 93
Java虚拟机,类的加载机制,运行时内存结构,垃圾回收,字节码结构,性能调优等
登峰小蚁
编程,运动,顺便把钱赚了。
展开
-
0120-分析GC日志
文章目录1. GC日志参数2. GC日志格式1. GC分类2. GC日志分类3. GC日志剖析4. MinorGC日志分析5. MajorGC日志分析3. GC日志分析工具1. GC日志参数-verbose:gc 输出gc日志信息,默认输出到标准输出-XX:+PrintGC 等同于-verbose:gc 表示打开简化的GC日志-XX:+PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配情况-XX:+PrintGCTimeStamps 输出G原创 2021-04-07 23:12:59 · 1208 阅读 · 0 评论 -
0110-JVM运行时参数
文章目录1. JVM参数选项类型1. 类型一:标准参数选项2. 类型二:-X参数选项3. 类型三:-XX参数选项2. 添加JVM参数选项1. 运行jar包2. 通过Tomcat运行war包3. 常用的JVM参数选项1. 打印设置的XX选项及值2. 堆、栈、方法区等内存大小设置3. OutofMemory相关的选项4. 垃圾收集器相关的选项5. GC日志相关选项1. JVM参数选项类型1. 类型一:标准参数选项特点比较稳定,后续版本基本不会变化以-开头选项运行java或者java -help原创 2021-04-07 22:26:36 · 1223 阅读 · 0 评论 -
0100-JVM监控及诊断工具-命令行篇
文章目录1. 监控的意义2. jps查看正在运行的java进程1. 基本情况2. 基本用法3. jstat查看jvm统计信息1. 基本情况2. 基本语法2.1 options2.2 interval2.3 count2.4 -t2.5 -h3. 补充4. jinfo实时查看和修改JVM配置参数1. 基本情况2. 基本语法3. 拓展5. jmap导出内存映像文件&内存使用情况1. 基本情况2. 基本语法3. 使用3.1 使用1-导出内存映像文件3.2 使用2-显示堆内存的相关信息3.3 其它做用4.原创 2021-04-07 21:27:41 · 1122 阅读 · 0 评论 -
0090-再谈类的加载器
文章目录1. 概述2. 复习:类的加载器分类1. 引导类加载器2. 扩展类加载器3. 系统类加载器4. 用户自定义类加载器3. 测试不同的类加载器4. ClassLoader 源码解析ClassLoader 的主要方法2. SecureClassLoader 与 URLClassLoader3. ExtClassLoader 与 AppClassLoader4. Class.forName() 与 ClassLoader.loadClass()5. 双亲委派模型1. 定义与本质2. 优势与劣势3. 破原创 2021-04-07 21:10:48 · 1138 阅读 · 0 评论 -
0080-类的加载过程详解
文章目录1. 概述2. 过程一:Loading( 加载)1. 加载完成的操作2. 二进制流的获取方式3. 类模型与 Class 实例的位置4. 数组类的加载3. 过程二:Linking( 链接) 阶段环节 1:链接阶段之 Verification ( 验证)环节 2:链接阶段之 Preparation ( 准备)环节 3:链接阶段之 Resolution ( 解析)4. 过程三:Initialization( 初始化) 阶段5. 过程四:类的 Using( 使用)6. 过程五:类的 Unloading(原创 2021-04-07 21:08:55 · 1103 阅读 · 0 评论 -
0070-字节码指令集与解析举例
文章目录1. 概述1. 执行模型2. 字节码与数据类型3. 指令分类2. 加载与存储指令1. 复习:再谈操作数栈与局部变量表2. 局部变量压栈指令3. 常量入栈指令4. 出栈装入局部变量表指令3. 算术指令1. 所有算数指令2. 比较指令的说明4. 类型转换指令1. 宽化类型转换2. 窄化类型转换5. 对象的创建与访问指令1. 创建指令2. 字段访问指令3. 数组操作指令4. 类型检查指令6. 方法调用与返回指令1. 方法调用指令2. 方法返回指令7. 操作数栈管理指令8. 控制转移指令1.原创 2021-04-07 21:07:46 · 1630 阅读 · 0 评论 -
0060-Class文件结构
文章目录1. 虚拟机的基石:Class 文件2. Class 文件结构2.1 魔数:Class2.2 Class 文件版本号2.3 常量池:存放所有常量2.4 访问标识2.5 类索引、父类索引、接口索引集合2.6 字段表集合2.7 方法表集合2.8 属性表结合3. 总结1. 虚拟机的基石:Class 文件字节码文件里是什么?源代码经过编译器编译之后便会生成一个字节码文件,字节码是一种二进制的类文件,它的内容是 JVM 的指令,而不像 C、C++ 经由编译器直接生成机器码jvm指令由执行引擎再原创 2021-04-07 21:05:49 · 1092 阅读 · 0 评论 -
0051-为什么标记的时候需要STW
文章目录1. Serial 和 ParNew 在进行垃圾回收时,为什么需要stop the world?不stop thw world 可以吗?2. CMS 进行垃圾回收的时,为什么有些阶段工作线程可以不停止?2.1 并发标记阶段2.2 并发清理阶段2.3 CMS 不停止工作线程,会有哪些问题?1. Serial 和 ParNew 在进行垃圾回收时,为什么需要stop the world?不stop thw world 可以吗?在进行标记的时候,如果工作线程不停止的话,那么肯定会有新对象生成。这些对象是原创 2021-04-07 21:01:01 · 2302 阅读 · 0 评论 -
0050-垃圾回收器
文章目录1. 基础定义1.1 按线程数分1.2 按工作模式分1.3 性能指标2. 垃圾回收器概述3. Serial-串行回收器3.1 Serial3.2 Serial Old4. ParNew-并行回收器5. Parallel-吞吐量优先回收器5.1 Parallel Scavenge5.2 Parallel Old6. CMS-低延迟回收器7. G1-区域化分代式回收器8. GC总结9. GC日志分析1. 基础定义1.1 按线程数分按线程数分,垃圾回收器可以分为串行或者并行(指的是垃圾回收的线程)原创 2020-06-29 15:31:04 · 2106 阅读 · 0 评论 -
0040-垃圾收集算法
文章目录1. 前言2. 标记算法2.1 引用计数算法2.2 可达性分析算法3. 对象的finalization机制4. 垃圾清除阶段算法4.1 标记-清除(Mark-Sweep)4.2 复制算法(Copying)4.3 标记-压缩算法(Mark-Compact)4.4 三种算法的比较5. 分代收集算法6. 补充算法6.1 增量收集算法6.2 分区算法1. 前言垃圾回收分为两个阶段,首先确认哪些对象是垃圾——标记阶段,其次是垃圾确认以后的回收——回收阶段2. 标记算法2.1 引用计数算法1. 简述原创 2020-06-29 15:28:35 · 2087 阅读 · 0 评论 -
0036-StringTable
文章目录1. String的基本特性2. String的内存分配3. String的基本操作4. 字符串拼接操作5. intern()的使用1. String的基本特性String的基本特性1. String字符串的定义方式 String s1 = "atguigu";// 字面量定义方式 String s2 = new String("hello"); 2. String声明为final的,不可被继承3. String实现了Serializable接口:表示字符串是支持原创 2020-06-03 16:15:14 · 2240 阅读 · 0 评论 -
0035-对象实例化步骤,内存布局,访问定位
文章目录1. 实例化步骤2. 内存布局3. 对象访问定位1. 实例化步骤对象创建的方式1. new2. Class的newInstance()3. Contructor的newInstance(xxx)4. 使用clone5. 使用反序列化6. 第三方库Objenesis对象的创建步骤1. 判断对象对应的类是否加载,链接,初始化,没有加载,使用双亲委派机制加载类2. 为对象分配内存 不同的垃圾收集器会导致,内存规整或不规整,不同的内存结构,会有不同的分配方原创 2020-06-03 16:14:35 · 2125 阅读 · 0 评论 -
0034-方法区
文章目录1. 栈、堆、方法区的交互关系2. 方法区的理解3. 方法区的演进4. 设置方法区大小5. 方法区的内部结构5.1 类型信息5.2 域(Field)信息5.3 方法(Method)信息5.4 类变量5.5 运行时常量池 & 常量池6. 方法区的演进细节7. 方法区的垃圾回收1. 栈、堆、方法区的交互关系线程共享的角度1. 线程共享区域:堆和方法区,两者都会有OutOfMemoryError和GC2. 线程独占区域:虚拟机栈,本地方法栈,程序计数器,两个栈会出现StackOve原创 2020-06-03 16:14:03 · 2366 阅读 · 0 评论 -
0033-堆
文章目录1. 简述2. 堆空间的设置3. 年轻代与老年代4. 对象的分配过程5. Minor GC/ Major GC/ Full GC6. 堆空间分代思想7. 对象提升规则8. TLAB(Thread Local Allocation Buffer)9. 常用参数总结10. 堆是分配对象的唯一选择吗1. 简述1. 堆是jvm管理的一块最大内存空间,且一个jvm只存在一个堆内存2. 堆空间被所有的线程共享,同时也可以划分线程私有的缓冲区(Thread Local Allocation Buffer,原创 2020-06-03 16:13:10 · 2053 阅读 · 0 评论 -
0032-虚拟机栈
文章目录1 简介2 栈配置3 栈帧3.1 局部变量表(local variables)3.2 操作数栈(Operand Stack)3.3 动态链接(Dynamic Linking)3.4 方法返回地址(Return Address)3.5 一些附加信息4. 栈的相关面试题1 简介java虚拟机栈,早期也称为java栈,每个线程在创建时,都会创建一个虚拟机栈,其内部包含一个个栈帧(Stack Frame),对应一次次的方法调用,虚拟机栈是线程私有的,没有GC,有可能会出现StackOverFlowErr原创 2020-06-03 16:12:30 · 2245 阅读 · 0 评论 -
0031-程序计数器
文章目录1 简介2 作用3 举例4 常见问题1 简介1. 存储空间很小的内存空间,运行速度最快的存储区域2. 程序计数器是线程私有的,生命周期与线程的生命周期一致3. 任何一个线程同一个时间节点都只有一个方法执行,这个方法称为当前方法,程序计数器会存储当前正在执行java方法的jvm指令地址,如果是native方法,则是未指定值(undefined)4. 它是唯一一个在java虚拟机中没有规定任何OutOfMemoryError的情况2 作用程序计数器会存储当前正在执行java方法的原创 2020-06-03 16:02:33 · 2161 阅读 · 0 评论 -
0030-内存概述
文章目录概览图1. 内存角色1.1 方法区1.2 堆区1.3 虚拟机栈1.4 程序计数器1.5 本地方法栈2. 线程共享性概览图1. 内存角色内存中主要涉及到的角色有方法区,堆,虚拟机栈,程序计数器,本地方法栈1.1 方法区方法区主要存储加载的class类元数据,包括类型信息,运行时常量池(不包含字符串常量),域信息,方法信息等1.2 堆区堆区又分为新生代和老年代,新生代又分为Eden,s0,s1区,是垃圾回收的重点区域,主要存储new出来的对象,还有几个特殊的对象,Class对象及内部的原创 2020-06-03 16:01:47 · 2103 阅读 · 0 评论 -
0020-类的加载
文章目录1. 内存结构概述2. 类的加载过程2.1 类加载器的作用2.2 类加载器角色2.3 类的加载过程1. 加载2. 链接3. 初始化3. 类加载器的分类3.1 引导类加载器(Bootstrap ClassLoader)3.2 自定义类加载器(User-Defined ClassLoader)3.2.1 扩展类加载器(Extention ClassLoader)3.2.2 应用程序类加载器(Application ClassLoader)3.2.3 自定义加载器4. ClassLoader的使用说明5.原创 2020-06-03 16:01:02 · 2074 阅读 · 0 评论