JVM
文章平均质量分 88
~Rookie~Newbie~Noob~
这个作者很懒,什么都没留下…
展开
-
JVM监控及诊断工具(命令行)
概述性能诊断是软件工程师日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。Java作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成Java应用出现性能问题的因素非常多,例如线程控制、硬盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。简单的命令行工具在我们刚接触java学习的时候,大家肯定最先了解的两个命令就是javac、java,那么除此之外,还有没有其他的命令可以供我们使用呢?我们进原创 2021-12-14 10:03:33 · 1034 阅读 · 0 评论 -
JVM性能调优概述
相关面试题目JVM性能调优都做了什么?有做过JVM内存优化吗?从SQL、JVM、架构、数据库四个方面讲讲优化思路?JVM的编译优化?JVM诊断调优工具都有哪些?JVM怎么调优,堆内存、栈空间设置多少合适?JVM相关的分析工具有哪些?具体的性能调优步骤如何?如何进行JVM调优?有哪些方法?如何理解内存泄漏问题?有哪些情况会导致内存泄漏?如何解决?JVM如何调优、参数怎么调?每秒几十万并发的秒杀系统为什么会频繁发生GC?日均百万级交易如何优化JVM?线上生产系统OOM如何监控及定位与原创 2021-12-12 11:20:29 · 373 阅读 · 0 评论 -
类的加载器
概述类加载器是JVM执行类加载机制的前提。ClassLoader的作用:ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给Java虚拟机进行链接、初始化等操作。因此,ClassLoader在整个装载阶段,只能影响到类的加载,而无法通过ClassLoader去改变类的链接和初始化行为。至于它是否可以运原创 2021-12-12 10:28:43 · 255 阅读 · 0 评论 -
类的加载过程详解
概述在Java中数据类型分为基本数据类型和引用数据类型,基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。按照Java虚拟机规范,从Class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段:其中,验证、准备、解析3个部分统称为链接(Linking)相关面试题描述一下JVM加载Class文件的原理机制?Java 类加载的过程?Java 类加载的时机?简述 Java 类加载机制?Loading阶段加载的理解所谓的加载,简而言之就是将Java类原创 2021-12-09 11:18:09 · 117 阅读 · 0 评论 -
字节码指令集(三)
异常处理指令抛出异常指令 athrow指令在Java程序中限速抛出异常的操作(throw语句)都是由athrow指令来实现的。除了使用throw语句显示抛出异常情况之外,JVM规范还规定了许多运行时异常会在其他Java虚拟机指令检测到异常状况时自动抛出。例如,在之前介绍的整数运算时,当除数为零时,虚拟机会在idiv或ldiv指令中抛出ArithmeticException异常。正常情况下,操作数栈的压入栈和弹出栈都是一条条指令完成的。唯一的例外情况是在抛出异常时,Java虚拟机会清除操作数栈上的所有原创 2021-11-30 22:55:52 · 280 阅读 · 0 评论 -
字节码指令集(二)
对象的创建与访问指令Java是面向对象的程序设计语言,虚拟机平台从字节码层面就对面向对象做了深层次的支持。有一系列指令专门用于对象操作,可进一步细分为创建指令、字段访问指令、数组操作指令、类型检查指令。创建指令虽然类实例和数组都是对象,但是Java虚拟机对类实例和数组的创建与操作使用了不同的字节码指令:创建类实例的指令创建类实例的指令:new它接收一个操作数,为指向常量池的索引,表示要创建的类型,执行完成后,将对象的引用压入栈。创建数组的指令:创建数组的指令: newarray、a原创 2021-11-27 20:39:20 · 379 阅读 · 0 评论 -
字节码指令集(一)
概述Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令。Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由于Java虚拟机采用面向操作数栈而不是寄存器的结构,所以大多数的指令不包含操作数,只有一共操作码。由于限制了Java虚拟机操作码的长度为一个字节(0~255),这意味着指令集的操作码总数不可能超过256条。熟悉虚拟机的指令对于动态字节码生成、反编译Cl原创 2021-11-15 21:15:06 · 236 阅读 · 0 评论 -
使用javap指令解析Class文件
接卸字节码的作用通过反编译生成的字节码文件,我们可以深入的了解Java代码的工作机制。但是,自己分析类文件结构太麻烦了!除了使用第三方的jclasslib工具之外,oracle官方也提供了工具:javap。javap是jdk自带的反解析工具。它的作用就是根据class字节码文件,反解析出当前类对应的code区、局部变量表、异常表和代码行偏移量映射表、常量池等信息。通过局部变量表,我们可以产看局部变量的作用域范围、所在槽位等信息,甚至可以看到槽位复用等信息。javac -g 操作解析字节码文件得到的原创 2021-11-11 21:09:48 · 852 阅读 · 0 评论 -
Java代码二进制字节码解析
程序代码package com.example.jvm;public class SeniorDemo { private int num = 1; public final String info = "hello world"; boolean[] counts; public SeniorDemo() { } public SeniorDemo(int count) { this.counts = new boolean[c原创 2021-11-11 19:56:02 · 362 阅读 · 0 评论 -
Class文件结构(二)
访问标识(access_flag、访问标志、访问标记)访问标记在常量池后,紧跟着访问标记。该标记使用两个字节表示,用于识别一些类或者接口层次的访问信息。包括:这个Class是类还是接口;是否定义为 public 类型;是否定义为 abstract 类型;如果是类的话,是否被声明为 final 等。各种访问标记如下所示:标识名称标识值含义ACC_PUBLIC0x0001标志为public类型ACC_FINAL0x0010标识被声明为final,只有类可以设置原创 2021-11-10 21:40:59 · 158 阅读 · 0 评论 -
Class文件结构(一)
参考文档Class 类的本质任何一个Class文件都对应着唯一一个类或者接口的定义信息,但反过来说,Class文件实际上它并不一定以磁盘文件的形式存在。Class文件是一组以8位字节为基础单位的二进制流。Class文件格式Class的结构不像XML等描述语言,由于它没有任何分隔符号。所以在其中的数据项,无论是字节顺序还是数量,都是被严格限定的,哪个字节代表什么含义,长度是多少,先后顺序如何,都是不允许改变的。Class 文件结构概述Class文件的结构并不是一成不变的,随着Java虚原创 2021-11-07 22:50:41 · 288 阅读 · 0 评论 -
Class文件结构概述
Java语言规范字节码文件的跨平台性Java语言:跨平台的语言(write once,run anywhere)当java源代码成功编译成字节码后,如果想在不同的平台上面运行,则无须再次编译。Java虚拟机:跨语言的平台Java虚拟机 不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制格式的文件关联。无论使用何种语言进行软件开发,只要能将源文件编译为正确的Class文件,那么这种语言就可以在Java虚拟机上执行。可用说,统一而强大的Class文件结构,就是Java虚拟原创 2021-11-01 20:56:04 · 60 阅读 · 0 评论 -
垃圾回收器
GC分类和性能指标垃圾回收器概述垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商来实现不同版本的JVM。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。垃圾回收器的分类按线程分,可以分为串行垃圾回收器和并行垃圾回收器。串行回收指的是在同一个时间段内只允许一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。1. 在单CPU处理器或者较小的应用内存等硬件平台,即不是特别优越的原创 2021-10-31 21:14:58 · 109 阅读 · 0 评论 -
垃圾回收相关概念
System.gc()的理解在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发Full GC,同时堆老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。JVM实现者可以通过System.gc()调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则太过于麻烦了。代码1:public class SystemGCTest { public static void main(String[] a原创 2021-10-26 11:24:14 · 63 阅读 · 0 评论 -
垃圾回收相关算法
标记阶段:引用计数法标记阶段:可达性分析算法原创 2021-10-24 11:20:40 · 82 阅读 · 0 评论 -
垃圾回收概述
什么是垃圾?垃圾是指在程序运行中没有任何指针指向的对象,这个需要被回收的对象就是垃圾。如果不及时对内存的垃圾进行清理,那么这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用,甚至可能导致内存溢出。为什么需要GC?对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完。因为不断地分配内存空间而不进行回收,就好像不停地生产垃圾而不去清理。除了是否没用的对象,垃圾回收也可以清除内存里的记录碎片。碎片整理讲所占用的堆内存移动到堆的一端口,以便JVM将整理原创 2021-10-21 20:04:58 · 117 阅读 · 0 评论 -
StringTable
String的基本特性String是字符串,使用一对双引号""引起来表示。String s1 = "Hello"; // 使用字面量的定义方式String s2 = new String("Hello"); // 用构造函数的创建对象String声明为final的,不可被继承。String实现了Serializable接口,表示字符串是支持序列化的。实现了Comparable接口,表示String可以比较大小。String在JDK8之间,内部定义为final char[] value,用于存原创 2021-10-18 18:16:11 · 74 阅读 · 0 评论 -
JVM 执行引擎
执行引擎的概述执行引擎是Java虚拟机核心的组成部分之一。虚拟机是一个相对于物理机的概念,这两种机器都有代码执行的能力。其区别是物理机的执行引擎是直接建立在处理器,缓存,指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指原创 2021-10-16 21:05:43 · 174 阅读 · 0 评论 -
对象实例化(内存布局)
对象实例化创建对象的几种方式使用 new 关键字创建对象Class 的 newInstance() 放射的方式创建对象,只能用空参构造器。Constructor 的 newInstance() 方法创建对象。也是使用反射的方式创建对象,但是可以使用空参或有参构造器。没有权限要求。调用 clone() 方法创建对象。要求当前类实现Clonable接口。使用反序列化创建对象,从文件流或网络中获取一个对象的二进制流。使用第三方库创建对象Objenesis。创建对象的步骤加载类元信息。判原创 2021-10-09 12:14:06 · 151 阅读 · 0 评论 -
运行时数据区(方法区 [永久代(java7及之前)-元空间(java8及之后)])
栈、堆、方法区的关系Person person = new Person(); 这行代码的内存布局原创 2021-10-08 10:18:43 · 246 阅读 · 0 评论 -
运行时数据区(本地方法栈、堆)
本地方法栈JAVA虚拟机栈用于管理 JAVA 方法的调用,而本地方法栈用于管理本地方法的调用。本地方法栈,也是线程私有的。允许被实现成固定或者是可动态扩展的内存(在内存溢出方面是相同的)。如果线程请求分配的栈容量超过本地方法栈允许的最大容量,JAVA 虚拟机将会抛出一 StackOverflowError异常;如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么JAVA虚拟机将会抛出一个OutOfMemoryError异原创 2021-10-04 21:15:58 · 99 阅读 · 0 评论 -
运行时数据区(程序计数器、虚拟机栈)
内存是非常重要的系统资源,是硬盘和CPU的中间仓库以及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请,分配、管理的策略,保证了jvm的高效稳定运行。不同的jvm对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨一下经典的JVM内存布局。运行时数据区Java虚拟机定义了若干程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另一些则是与线程一一对应的,这些与线程对应的数据区会随着线程的开始和结束而原创 2021-10-01 23:07:10 · 124 阅读 · 0 评论 -
类加载子系统
类加载器与类加载过程类加载器类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。加载的类信息存放在一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)。类加载的过程loading阶段通过一个类的全限定名获取定义此类的.原创 2021-09-28 21:42:05 · 134 阅读 · 0 评论 -
JVM与Java体系结构
虚拟机虚拟机就是一台虚拟的计算机。它是一款软件,用来执行一系列的虚拟计算指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。大名鼎鼎的Visual Box,VMWare就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。程序虚拟机的典型代表就是JAVA虚拟机,它专门为执行单个计算机程序而设计。在java虚拟机中执行的指令我们称为Java字节码指令。无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。JAVA虚拟机介绍J原创 2021-09-28 20:23:33 · 65 阅读 · 0 评论