随笔 - 203
文章 - 0
评论 - 18
阅读 -
24万
随笔分类 - jvm
【JVM系列 中篇 】4.再谈类加载器
摘要:1. 概述 类加载器是JVM执行类加载机制的前提。 ClassLoader的作用: ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java
阅读全文
【JVM系列 中篇 】3.类的加载过程(类的生命周期)
摘要:1. 概述 在 Java 中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。 按照 Java 虚拟机规范,从 class 文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下 7 个阶段: 其中,验证、准备、解析 3 个部分统称为
阅读全文
【JVM系列 中篇 】2.字节码指令集
摘要:1. 概述 2. 加载与存储指令 2.1. 局部变量压栈指令 iload 从局部变量中装载int类型值 lload 从局部变量中装载long类型值 fload 从局部变量中装载float类型值 dload 从局部变量中装载double类型值 aload 从局部变量中装载引用类型值(refernce)
阅读全文
【JVM系列 中篇 】1.class 文件字节码结构
摘要:1. Class文件结构 1.1. Class字节码文件结构 类型名称说明长度数量 魔数 u4 magic 魔数,识别Class文件格式 4个字节 1 版本号 u2 minor_version 副版本号(小版本) 2个字节 1 u2 major_version 主版本号(大版本) 2个字节 1 常量
阅读全文
【JVM系列 下篇 】补充:浅堆深堆与内存泄露
摘要:补充:浅堆深堆与内存泄露 1. 浅堆(Shallow Heap) 浅堆是指一个对象所消耗的内存。在 32 位系统中,一个对象引用会占据 4 个字节,一个 int 类型会占据 4 个字节,long 型变量会占据 8 个字节,每个对象头需要占用 8 个字节。根据堆快照格式不同,对象的大小可能会同 8 字
阅读全文
【JVM系列 下篇 】5.分析GC日志
摘要:1-GC日志参数 -verbose:gc 输出gc日志信息,默认输出到标准输出 -XX:+PrintGC 输出GC日志。类似:-verbose:gc -XX:+PrintGCDetails 在发生垃圾回收时打印内存回收相处的日志, 并在进程退出时输出当前内存各区域分配情况 -XX:+PrintGCT
阅读全文
【JVM系列 下篇 】4.JVM运行时参数
摘要:01-JVM参数选项 官网地址:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html 类型一:标准参数选项 特点 比较稳定,后续版本基本不会变化 以-开头 各种选项 直接在DOS窗口中运行java或者java
阅读全文
【JVM系列 下篇 】3.JVM监控及诊断工具-GUI篇
摘要:3. JVM 监控及诊断工具-GUI 篇 3.1. 工具概述 使用上一章命令行工具或组合能帮您获取目标 Java 应用性能相关的基础信息,但它们存在下列局限: 1.无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要)。 2.要求用户登录到目标
阅读全文
【JVM系列 下篇 】2.JVM监控及诊断工具-命令行篇
摘要:概述 性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。 Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络 I/O、
阅读全文
【JVM系列 下篇 】1.概述篇
摘要:概述篇: 1、大厂面试题: 支付宝: 支付宝三面:JVM 性能调优都做了什么? 小米: 有做过 JVM 内存优化吗? 从 SQL、JVM、架构、数据库四个方面讲讲优化思路 蚂蚁金服: JVM 的编译优化 jvm 性能调优都做了什么 JVM 诊断调优工具用过哪些? 二面:jvm 怎样调优,堆内存、栈空
阅读全文
【JVM系列 上篇 】17.垃圾回收器
摘要:垃圾回收器 GC分类与性能指标 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器,可以将GC分为不同的类型。 Java不同版本新特性 语法层面:Lambda表
阅读全文
【JVM系列 上篇 】16.垃圾回收概述
摘要:垃圾回收相关概念 System.gc() 的理解 在默认情况下,通过System.gc() 者Runtime.getRuntime() .gc() 的调用,会显式触发FullGC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。 然而System.gc() 调用附带一个免责声明,无法保证
阅读全文
【JVM系列 上篇 】15.垃圾回收相关算法
摘要:垃圾回收相关算法 标记阶段:引用计数算法 在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。 那么在JVM中究
阅读全文
【JVM系列 上篇 】14.垃圾回收概述
摘要:垃圾回收概述 概念 这次我们主要关注的是黄色部分,内存的分配与回收 什么是垃圾 在提到什么是垃圾之前,我们先看下面一张图 从上图我们可以很明确的知道,Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我们手动的收集。 垃圾收集,不是Java语言的伴生产物
阅读全文
【JVM系列 上篇 】13.StringTable
摘要:StringTable String的基本特性 String:字符串,使用一对 ”” 引起来表示 String s1 = "mogublog" ; // 字面量的定义方式 String s2 = new String("moxi"); String声明为final的,不可被继承 String实现了S
阅读全文
【JVM系列 上篇 】12.执行引擎
摘要:执行引擎 执行引擎概述 执行引擎属于JVM的下层,里面包括 解释器、及时编译器、垃圾回收器 执行引擎是Java虚拟机核心的组成部分之一。 “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎
阅读全文
【JVM系列 上篇 】11.直接内存
摘要:直接内存 Direct Memory 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存是在Java堆外的、直接向系统申请的内存区间。 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 通常,访问直接内存的速度会优于Java堆。即
阅读全文
【JVM系列 上篇 】10.对象实例化内存布局与访问定位
摘要:对象实例化内存布局与访问定位 对象实例化 面试题 对象在JVM中是怎么存储的? 对象头信息里面有哪些东西? Java对象头有什么? 从对象创建的方式 和 步骤开始说 对象创建方式 new:最常见的方式、单例类中调用getInstance的静态类方法,XXXFactory的静态方法 Class的new
阅读全文
【JVM系列 上篇 】9.方法区
摘要:方法区 前言 这次所讲述的是运行时数据区的最后一个部分 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理 栈、堆、方法区的交互关系 下面就涉及了对象的访问定位 Person:存放在元空间,也可以说方法区 person:存
阅读全文
【JVM系列 上篇 】8.堆
摘要:堆 堆的核心概念 堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的。 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。 Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。 堆内存
阅读全文