随笔分类 -  Java虚拟机

1
摘要:## 编译器 编译器的作用就是将高级编程语言翻译为机器代码。 编译器工作过程一般分为: - 词法分析:将高级语言解析成 Token 集合; - 语法分析:将 Token 集合构建成语法树,在这个过程可以判断出语法是否有误,比如 `while` 后面是否 `{` 等等; - 语义分析:判断语法树是否有 阅读全文
posted @ 2023-08-02 14:53 JMCui 阅读(104) 评论(0) 推荐(0) 编辑
摘要:## 1. 垃圾回收的简单回顾 关于垃圾回收算法,基本就是那么几种:标记-清除、标记-复制、标记-整理。在此基础上可以增加分代(新生代/老年代),每代采取不同的回收算法,以提高整体的分配和回收效率。 无论使用哪种算法,标记总是必要的一步。这是理算当然的,你不先找到垃圾,怎么进行回收? 垃圾回收器的工 阅读全文
posted @ 2020-12-20 22:10 JMCui 阅读(5194) 评论(0) 推荐(4) 编辑
摘要:减少分配率 这个几乎不用解释,减少了内存的使用量,自然就减少 GC 回收时的压力,同时降低了内存碎片与 CPU 的使用量。在设计对象时,应仔细检查并问自己: 我真的需要这个对象吗? 这个字段是我需要的吗? 我能减少数组的尺寸吗? 这些对象,是否只有在极少数情况下,或者只有初始化的时候才用到? 我是否 阅读全文
posted @ 2020-11-03 14:41 JMCui 阅读(218) 评论(0) 推荐(0) 编辑
摘要:在高性能硬件上部署程序,目前主要有两种方式: 1. 通过64位JDK来使用大内存。 2. 通过若干个32位虚拟机建立逻辑集群来利用硬件资源。 32位的虚拟机和64位的虚拟机部署应用有什么区别? 1. 在32位的 Windows 平台中每个进程只能使用 2GB 内存,考虑到堆以外的内存开销,堆一般最多 阅读全文
posted @ 2020-04-20 14:46 JMCui 阅读(404) 评论(0) 推荐(0) 编辑
摘要:栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。每一个栈帧都包括了局部变量表、操作数栈、动态连接、方法返回地址和一些额外的附加信息。在编译程序代码的时候,栈帧中需要多大的局部变量表、多深的操作数栈都已经完全确定了,并且写入到 阅读全文
posted @ 2020-04-20 14:45 JMCui 阅读(712) 评论(0) 推荐(0) 编辑
摘要:一、类加载机制 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。 类的整个生命周期包括了:加载(Loading)、验证(Verification)、准备(Preparation)、解析( 阅读全文
posted @ 2020-04-15 10:11 JMCui 阅读(406) 评论(0) 推荐(0) 编辑
摘要:一、Class 文件结构 JDK 的版本号已经到 14 了,相对于语言、API 以及 Java 技术体系中其他方面的变化,Class 文件结构一直处于比较稳定的状态,Class 文件的主体结构、字节码指令的语义和数量几乎没有出现过变动。 Class 文件是一组以8位字节为基础单位的二进制流,各个数据 阅读全文
posted @ 2020-04-11 15:55 JMCui 阅读(467) 评论(0) 推荐(0) 编辑
摘要:BTrace 是什么? BTrace 是一个动态安全的 Java 追踪工具,它通过向运行中的 Java 程序植入字节码文件,来对运行中的 Java 程序热更新,方便的获取程序运行时的数据信息,并且,保证自己的消耗特别小,大部分情况下不会影响 Java 程序的性能。 BTrace 能干什么? 相信每一 阅读全文
posted @ 2020-04-11 15:54 JMCui 阅读(778) 评论(0) 推荐(1) 编辑
摘要:一、写在前面 "上一篇文章" 我们介绍了性能监控的一些命令,包括 jmap (生成堆存储快照)和 jstack(生成线程快照),事实上,在没有一些监控工具之前,我们用的最多的也是这两个命令来进行虚拟机性能的监控调优。但是这两个命令都有自己不足的地方: 使用 jmap 命令,从 Heap Dump 开 阅读全文
posted @ 2020-03-19 15:49 JMCui 阅读(1697) 评论(0) 推荐(0) 编辑
摘要:jps JVM Process Status Tool,显示指定系统内所有的 HotSpot 虚拟机进程。显示信息包括虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。 jps [-q] [-mlvV] [<hosti 阅读全文
posted @ 2020-03-15 22:41 JMCui 阅读(560) 评论(0) 推荐(0) 编辑
摘要:一、概述 即时编译器(Just In Time Compiler),也称为 JIT 编译器,它的主要工作是把热点代码编译成与本地平台相关的机器码,并进行各种层次的优化,从而提高代码执行的效率。 那么什么是热点代码呢?我们知道虚拟机通过解释器(Interpreter)来执行字节码文件,当虚拟机发现某个 阅读全文
posted @ 2020-01-17 13:03 JMCui 阅读(1614) 评论(2) 推荐(0) 编辑
摘要:一、概述 从前面 文章 中我们可以了解到,javac 的三个步骤中,程序员唯一能干预的就是注解处理器部分,注解处理器类似于编译器的插件,在这些插件里面,可以读取、修改、添加抽象语法树中的任意元素。因此,只要有足够的创意,程序员可以通过自定义插入式注解处理器来实现许多原本只能在编码中完成的事情。我们常 阅读全文
posted @ 2020-01-09 21:18 JMCui 阅读(1980) 评论(1) 推荐(1) 编辑
摘要:一、概述 如今,基于物理机、Java虚拟机或者是非 Java 的其他高级语言虚拟机(HLLVM)的语言,大多数都遵循如下现代经典编译原理的思路,在执行前先对程序源码进行词法分析和语法分析处理,把源码转化为抽象语法树。对于一门具体语言的实现来说,词法和语法分析乃至后面的优化器和目标代码生成器都可以选择 阅读全文
posted @ 2020-01-08 09:35 JMCui 阅读(1455) 评论(1) 推荐(2) 编辑
摘要:一、概要 "前面的文章" 介绍了对象的创建过程,其中第三步 —— 分配内存,只是简单的介绍了分配的方式 —— 指针碰撞、空闲列表,其实对象在堆上分配还大有文章嘞。 对象的内存分配,往大方向上讲,就是在堆上分配,对象主要分配在新生代的 Eden 区上,如果启动了本地线程分配缓冲,将按线程优先在 TLA 阅读全文
posted @ 2019-12-22 15:59 JMCui 阅读(960) 评论(0) 推荐(0) 编辑
摘要:一、概述 1. 哪些内存需要回收 上篇文章 我们介绍了 Java 内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而灭,在这几个区域内就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了。 而方法区和 Java 堆是线程共享的,我们只有 阅读全文
posted @ 2019-12-17 21:05 JMCui 阅读(516) 评论(0) 推荐(1) 编辑
摘要:内存分配相关 Xms 英文释义:Initial heap size(in bytes) 中文释义:堆区初始值 使用方法: Xms2g 或 XX:InitialHeapSize=2048m Xmx 英文释义:Maximum heap size(in bytes) 中文释义:堆区最大值 使用方法: Xm 阅读全文
posted @ 2019-12-16 21:41 JMCui 阅读(2939) 评论(0) 推荐(1) 编辑
摘要:一、标记 清除算法(Mark Sweep) 这种算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。 Mark Sweep 算法是最基础的收集算法,几乎所有的收集算法都是基于这种思路并对其不足进行改进而得到。它的不足之处主要有两个: 效率问题。标记 阅读全文
posted @ 2019-12-15 15:49 JMCui 阅读(599) 评论(0) 推荐(1) 编辑
摘要:一、JVM 内存区域 堆 - Heap 线程共享,JVM中最大的一块内存,此内存的唯一目的就是存放对象实例,Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称为“GC堆”(Garbage Collected Heap),可以通过 -Xmx 和 -Xms 参数来控制该区域大小。 方法区 - M 阅读全文
posted @ 2019-12-01 16:36 JMCui 阅读(1698) 评论(0) 推荐(1) 编辑
摘要:在开发过程中,有时候我们发现 JVM 占用的CPU/内存居高不下,跟我们的预期不符,这时,CPU 在做什么呢?是什么线程让CPU/内存如此忙碌呢?我们通过如下几步,可以查看 CPU 在执行什么线程。 1、 top 命令查看CPU/内存占用过高的进程(P 按CPU占用大小排序,M 按内存占用大小排序) 阅读全文
posted @ 2019-01-12 13:07 JMCui 阅读(754) 评论(0) 推荐(0) 编辑
摘要:一、finalize() 方法 1. 为什么要有 finalize() 方法? 假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由 new 分配的内存,所以他不知道该如何释放该对象的这块“特殊”内存,为了应对这种情况,java 允许在类中定义一个 final 阅读全文
posted @ 2017-08-04 18:17 JMCui 阅读(934) 评论(0) 推荐(0) 编辑

1