202108-08 Java JVM运行时数据区(Run-Time Data Areas) 目录1、官网概括2、图例和思维导图3、方法区(MethodArea)4、堆(Heap)5、Java虚拟机栈6、栈帧(StackFrame)7、程序计数器(ThepcRegister)8、本地方法栈(NativeMethodStacks)1、官网概括引用官网说法:TheJavaVirtualMachinedefinesvariousrun-timedataareasthatareusedduringexecutionofaprogram.SomeofthesedataareasarecreatedonJavaVirtualMachinestart-upandaredestroyedonly... 继续阅读 >
202108-06 详解JVM中的GC调优 目录那些GC的默认值GC的选择GC的最大线程个数初始化heapsize最大的heapsize分层编译技术我们到底要什么最大暂停时间吞吐率那些GC的默认值其实GC或者说JVM的参数非常非常的多,有控制内存使用的:有控制JIT的:有控制分代比例的,也有控制GC并发的:当然,大部分的参数其实并不需要我们自行去调整,JVM会很好的动态帮我们设置这些变量的值。如果我们不去设置这些值,那么对GC性能比较有影响的参数和他们的默认值有哪些呢?GC的选择... 继续阅读 >
202108-06 浅谈JVM之使用JFR解决内存泄露 目录简介一个内存泄露的例子使用JFR和JMC来分析内存泄露OldObjectSample简介虽然java有自动化的GC,但是还会有内存泄露的情况。当然java中的内存泄露跟C++中的泄露不同。在C++中所有被分配的内存对象都需要要程序员手动释放。但是在java中并不需要这个过程,一切都是由GC来自动完成的。那么是不是java中就没有内存泄露了呢?要回答这个问题我们首先需要界定一下什么是内存泄露。如果说有时候我们不再使用的对象却不能被GC释放的话... 继续阅读 >
202108-06 浅谈JVM系列之从汇编角度分析NullCheck 目录一个普通的virtualcall普通方法中的nullcheck反优化的例子一个普通的virtualcall我们来分析一下在方法中调用list.add方法的例子:publicclassTestNull{publicstaticvoidmain(String[]args)throwsInterruptedException{List<String>list=newArrayList();list.add("www.flydean.com");for(inti=0;i<10000;i++){testMethod(list);}Thread.... 继续阅读 >
202108-06 浅谈JVM系列之JIT中的Virtual Call 目录VirtualCall和它的本质VirtualCall和classiccallVirtualCall优化单实现方法的例子VirtualCall优化多实现方法的例子总结VirtualCall和它的本质有用过PrintAssembly的朋友,可能会在反编译的汇编代码中发现有些方法调用的说明是invokevirtual,实际上这个invokevirtual就是VirtualCall。VirtualCall是什么呢?面向对象的编程语言基本上都支持方法的重写,我们考虑下面的情况:privatestaticclassCustObj{publicv... 继续阅读 >
202108-06 浅谈JVM之类的加载链接和初始化 目录加载运行时常量池类加载器链接验证准备解析初始化总结加载JVM可以分为三大部分,五大空间和三大引擎,要讲起来也不是特别复杂,先看下面的总体的JVM架构图。从上面的图中,我们可以看到JVM中有三大部分,分别是类加载系统,运行时数据区域和ExecutionEngine。加载就是根据特定名称查找类或者接口的二进制表示,并根据此二进制表示来创建类和接口的过程。运行时常量池我们知道JVM中有一个方法区的区域,在JDK8中,方法区的实现... 继续阅读 >
202108-06 详解JVM系列之对象的锁状态和同步 目录java对象头java中锁状态的变化偏向锁biasedlocking轻量级锁thinlock重量级锁三种锁状态的不同java对象头Java的锁状态其实可以分为三种,分别是偏向锁,轻量级锁和重量级锁。在JavaHotSpotVM中,每个对象前面都有一个class指针和一个MarkWord。MarkWord存储了哈希值以及分代年龄和标记位等,通过这些值的变化,JVM可以实现对java对象的不同程度的锁定。还记得我们之前分享java对象的那张图吗?javaObject对象的对象头大... 继续阅读 >
202108-06 详解JVM之运行时常量池 目录class文件中的常量池运行时常量池静态常量详解符号引用详解StringPool字符串常量池总结class文件中的常量池之前我们在讲class文件的结构时,提到了每个class文件都有一个常量池,常量池中存了些什么东西呢?字符串常量,类和接口名字,字段名,和其他一些在class中引用的常量。运行时常量池但是只有class文件中的常量池肯定是不够的,因为我们需要在JVM中运行起来。这时候就需要一个运行时常量池,为JVM的运行服务。运行时常... 继续阅读 >
202108-06 浅谈JVM之java class文件的密码本 目录简介一个简单的classClassFile的二进制文件class文件的密码本magicversion常量池描述符access_flagsthis_class和super_classfields_count和fields[]methods_count和methods[]attributes_count和attributes[]总结简介机器可以读,人为什么不能读?只要我们掌握javaclass文件的密码表,我们可以把二进制转成十六进制,将十六进制和我们的密码表进行对比,就可以轻松的解密了。下面,让我们开始这个激动人心的过程吧。一个简单的... 继续阅读 >
202108-06 浅谈JVM中的JOL 目录JOL简介使用JOL分析VM信息使用JOL分析String使用JOL分析数组使用JOL分析自动装箱使用JOL分析引用关系总结JOL简介JOL的全称是JavaObjectLayout。是一个用来分析JVM中Object布局的小工具。包括Object在内存中的占用情况,实例对象的引用情况等等。JOL可以在代码中使用,也可以独立的以命令行中运行。命令行的我这里就不具体介绍了,今天主要讲解怎么在代码中使用JOL。使用JOL需要添加maven依赖:<dependency><groupId>org.... 继续阅读 >
202107-04 深度分析java dump文件 目录JVMdump获取JVMdump文件dump文件分析结构详解文件头java一个类的成员变量有两种类型内容块块头gcroot类对象基本信息说明实例对象基本类型数组基本信息说明对象数组内存分配内存回收规则分析工具简介浏览器打开http:/127.0.0.1:7000点击页面的堆内存统计点击其中认为内存消耗太多的类名查看类详情点击referencessummarybytypeJVMdumpjava内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内... 继续阅读 >
202106-22 JVM中ClassLoader类加载器的深入理解 JVM的体系结构图先来看一下JVM的体系结构,如下图:JVM的位置JVM的位置,如下图:JVM是运行在操作系统之上的,与硬件没有直接的交互,但是可以调用底层的硬件,用JIN(Java本地接口调用底层硬件)JVM结构图中的classfiles文件classfiles文件,是保存在我们电脑本地的字节码文件,.java文件经过编译之后,就会生成一个.class文件,这个文件就是classfiles所对应的字节码文件,如下图:JVM结构图中的类加载器ClassLoader的解释&nb... 继续阅读 >
202103-19 浅谈JVM垃圾回收之哪些对象可以被回收 1.背景Java语言相比于C和C++,一个最大的特点就是不需要程序员自己手动去申请和释放内存,这一切交由JVM来完成。在Java中,运行时的数据区域分为程序计数器、Java虚拟机栈、本地方法栈、方法区和堆。其中,程序计数器、虚拟机栈和本地方法栈是线程私有的,线程销毁后自动释放。垃圾回收的行为发生在堆和方法区,主要是堆,而堆中存储的主要是对象。那么自然而然地就会有这么几个问题,哪些对象可以被回收?通过什么方式回收?本文... 继续阅读 >
202103-09 详解jvm对象的创建和分配 对象的创建创建方式1、new 关键字直接创建。newObjectName()。2、通过Class 反射对象的newInstance() 方法。ObjectName obj = ObjectName.class.newInstance()。3、通过Class 反射对象获取Constructor 类,再调用其newInstance() 方法。ObjectNameobj=ObjectName.class.getConstructor.newInstance()。4、在类实现Cloneable 接口的前提下,使用对象的clone()&... 继续阅读 >
202103-05 详解JVM 中的StringTable 是什么字符串常量池是JVM中的一个重要结构,用于存储JVM运行时产生的字符串。在JDK7之前在方法区中,存储的是字符串常量。而字符串常量池在JDK7开始移入堆中,随之而来的是除了存储字符串常量外,还可以存储字符串引用(因为在堆中,引用堆中的字符串常量很方便,所以可以存储引用)。这使得很多字符串的操作在JDK7中和在之前的版本中执行是不同的结果。这也是为什么字符串相关的问题是如此具有迷惑性的原因之一。底层String:... 继续阅读 >
202103-02 java jvm两种存储区的类型知识点讲解 我们知道在jvm中存放了不少数据,那么存放数据的地方叫做存储区。想必大家还不知道存储区是分为两种类型的,常量缓冲池和方法区。相信很多人还没有接触到这个概念,本篇对java中jvm的存储区进行的内容的整理,下面一起来看看这两种存储取的概念和区别吧。1、分类JVM有两种类型的存储区:常量缓冲池和方法区。常量缓冲池用于存储类名、方法名和字段名以及字符串常量。方法区用于存储Java方法的字节码。JVM规范中没有规定这两个存储区... 继续阅读 >