![](https://img-blog.csdnimg.cn/20200918112159342.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
深入理解Java虚拟机(第二&三版)
深入理解Java虚拟机(第二&三版)
博_采_众_长
理论与实践并行!
展开
-
字符串常量池和运行时常量池是在堆还是在方法区?
文章目录1)方法区包含哪些内容?2)运行时常量池存在什么地方?3)取消永久代后,方法区的实现?4)字符串常量池和运行时常量池究竟去了哪里?4)元空间是什么?5)关于为什么移除永久代?5)补充 我们知道在JDK1.8中取消了永久代,区而代之使用了元空间来实现方法区。话虽如此,但是关于字符串常量池和运行时常量池的模棱两可的说法一直都是争论不休的。1)方法区包含哪些内容?方法区包含哪些内容,摘录自《java虚拟机规转载 2020-11-03 14:16:49 · 13960 阅读 · 25 评论 -
Java逃逸分析之栈上分配内存
目录 什么是逃逸分析?栈上分配内存 什么是逃逸分析? 在很早以前,Java代码从编写完毕到JVM执行至少需要两个过程: javac将Java代码编译成字节码class文件。JVM载入class文件后,由解释器来逐条将字节码指令解释翻译成本地机器码并执行。 因此,Java也被称为是一门”解释执行“的语言,由于解释执行比编译执行要慢,所以”Java程序很慢“在早期深入人心。 为了解决“解释执行”的效率问题,Java引入了JIT即时编译器,当JVM发现某段代码块运行的特别频繁时就会将这部分热点代..转载 2020-10-31 21:39:23 · 197 阅读 · 2 评论 -
JVM -- GC Roots
JVM – GC Roots在Java语言中,GC Roots 包含以下以下几类元素:虚拟机栈中引用的对象 ✔比如:各个线程被调用的方法中使用到的参数、局部变量等本地方法栈被JNI(通常的说法)引用的对象方法区中类静态属性引用的对象 ✔比如:Java类的引用类型静态变量方法区中常量引用的对象 ✔比如:字符串常量池(String Table)原创 2020-10-26 20:23:09 · 194 阅读 · 0 评论 -
JVM -- StringTable(大师,我悟了)
JVM – StringTable(大师,我悟了)一、String的基本特性String:字符串,使用一对“”引起来表示 ✔String s1 = “Hello”;//字面量的定义方式 ✔String s2 = new String(“Hello”);String声明为final的,不可被继承的String实现了Seria原创 2020-10-26 19:33:18 · 188 阅读 · 4 评论 -
JVM -- 执行引擎(一文读懂版)
JVM – 执行引擎一、概述执行引擎是Java虚拟机核心的组成部分之一“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的, 因此可以不受物理条件限制地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。 JVM的主要任务是负责装载字节码原创 2020-10-26 10:17:40 · 177 阅读 · 2 评论 -
JVM --直接内存概述
JVM --直接内存概述简单理解:java process memory = java heap + native memory不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存空间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存通常,访问直接内存的速度会优于Java堆。即读写性能高 ✔原创 2020-10-25 19:52:41 · 200 阅读 · 2 评论 -
JVM -- 对象的内存布局
JVM – 对象的内存布局内存布局1️⃣对象头(Header) 包含两部分 运行时数据区(Mark World) &nbs原创 2020-10-25 16:24:54 · 163 阅读 · 0 评论 -
JVM --方法区(超详细)
JVM --方法区(超详细)运行时数据区结构图栈、堆、方法区的交互关系方法区看作是一块独立与Java堆的内存空间方法区(Method Area)与Java堆一样,是各个线程共享的内存区域方法区在JVM启动的时候被创建,并且它的实际物理内存空间中和Java堆区一样都可以是不连续的方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:java.lang.OutOfM原创 2020-10-25 15:36:31 · 1308 阅读 · 2 评论 -
JVM -- 基于逃逸分析的代码优化技术(详解)
JVM – 基于逃逸分析的代码优化技术(详解)栈上分配 将堆分配转化为栈分配。如果一个对象在子程序中被分配,要使指向对象的指针永远不会逃逸,对象可能是栈上分配的首选,而不是堆分配。同步省略 如果一个对象被发现只能从一个线程被访问到,那么对于这个对象的操作可以不考虑同步。分离对象或标量替换 有的对象可能不需要作为一个连续的内存结构存在也可以被访问到,那么对象原创 2020-10-25 10:41:59 · 155 阅读 · 0 评论 -
JVM堆空间 -- 分配担保机制
JVM堆空间 – 分配担保机制 在发生Minor GC之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。如果大于,则此次Minor GC是安全的如果小于,则虚拟机会查看-XX:HandlePromotionFailure设置值是否允许担保失败。 ✔如果HandlePromotionFailure=true,那么会继续检查老年原创 2020-10-24 21:09:41 · 629 阅读 · 0 评论 -
测试堆空间常用的JVM参数
测试堆空间常用的JVM参数/** * 测试堆空间常用的jvm参数: * -XX:+PrintFlagsInitial : 查看所有的参数的默认初始值 * -XX:+PrintFlagsFinal :查看所有的参数的最终值(可能会存在修改,不再是初始值) * 具体查看某个参数的指令: jps:查看当前运行中的进程 * jinfo -flag SurvivorRatio 进程id * * -Xms:初始堆空间内存 (默认为物理内原创 2020-10-24 20:38:31 · 128 阅读 · 0 评论 -
Minor GC、Major GC、Full GC(详解)
Minor GC、Major GC、Full GC(详解) JVM在进行GC时,并非每次都对三个内存(新生代、老年代;方法区)区域一起回收的,大部分时候回收的都是指新生代。针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆回收(Full GC)部分收集: 不是完整收集整个Java堆的垃圾收集。其中又分为:新生代收集(Minor G原创 2020-10-24 20:15:10 · 1676 阅读 · 1 评论 -
StringTable详解
一、存储结构 jdk8及以前String底层使用char[],一个char是两个字节,jdk9开始改用byte[]加上编码标记节约空间。 jdk9官网提供的String修改说明:http://openjdk.java.net/jeps/254 修改动机: 二、不可变性 1、当对字符串重新赋值时,需要重写指定内存区域赋值 2、当对现有字符串进行连接操作时,也需要重新指定内存区...转载 2020-10-22 13:06:34 · 672 阅读 · 0 评论 -
JVM -- Garbage First收集器
JVM – Garbage First收集器 Garbage First(简称G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。到了JDK 8 Update 40的时候,G1提供并发的类卸载的支持,补 全了其计划功能的最后一块拼图。这个版本以后的G1收集器才被Oracle官方称为“全功能的垃圾收集 器”(Fully-Featured Ga原创 2020-10-21 20:55:35 · 198 阅读 · 2 评论 -
JVM -- 经典垃圾收集器(HotSpot)
JVM – 经典垃圾收集器(HotSpot) 如果说收集算法是内存回收的方法论,那垃圾收集器就是内存回收的实践者。《Java虚拟机规范》中对垃圾收集器应该如何实现并没有做出任何规定,因此不同的厂商、不同版本的虚拟机所包含 的垃圾收集器都可能会有很大差别,不同的虚拟机一般也都会提供各种参数供用户根据自己的应用特点和要求组合出各个内存分代所使用的收集器。HotSpot虚拟机的垃圾收集器 &原创 2020-10-21 20:03:51 · 336 阅读 · 1 评论 -
JVM -- 并发的可达性分析
JVM – 并发的可达性分析 前言,之前看过周志明老师的深入理解JVM虚拟机第二版,但是有很多的细节并没有在那本书中进行详细的讲解,这次拿到本书的第三版,真是开心死了,因为这本书,相对于上版纠正了很多错误,更重要的是,讲解了一些在上版中只是粗略带过的知识,现在可以说是对JVM的世界又有了更深的一层理解。 当前主流编程原创 2020-10-21 16:19:37 · 272 阅读 · 0 评论 -
JVM -- 新一代即时编译器(Graal)
Java – 新一代即时编译器 对需要长时间运行的应用来说,由于经过充分预热,热点代码会被HotSpot的探测机制准确定位捕 获,并将其编译为物理硬件可直接执行的机器码,在这类应用中Java的运行效率很大程度上取决于即时编译器所输出的代码质量。 HotSpot虚拟机中含有两个即时编译器,分别是编译耗时短但输出代码优化原创 2020-10-21 11:55:31 · 1232 阅读 · 0 评论 -
虚拟机 -- 无语言倾向
Java – 无语言倾向 如果Java有拟人化的思维,它应该从来没有惧怕过被哪一门语言所取代,Java“天下第一”的底气不 在于语法多么先进好用,而是来自它庞大的用户群和极其成熟的软件生态,这在朝夕之间难以撼动。 不过,既然有那么多新、旧编程语言的兴起躁动,说明必然有其需求动力所在,譬如互联网之于 JavaScript、人工智能之于Python,微服务风潮之于Golang等。大家都清楚不太可能有哪门语言能在每 一原创 2020-10-21 11:13:41 · 274 阅读 · 0 评论 -
Java8内存模型—永久代(PermGen)和元空间(Metaspace)
转载地址:http://www.cnblogs.com/paddix一、JVM 内存模型根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 1、虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建。栈里面存着的是一种叫“栈帧”的东西,每个方法会创建一个栈帧,栈帧中存放了局部变量表(基本数据类型和对象引用)、操作数栈、方法出口等信息。栈的大小可以固定也可以动态扩转载 2020-10-23 17:54:01 · 184 阅读 · 0 评论 -
浅谈对JIT编译器的理解
浅谈对JIT编译器的理解。 1. 什么是Just In Time编译器?Hot Spot 编译当 JVM 执行代码时,它并不立即开始编译代码。这主要有两个原因:首先,如果这段代码本身在将来只会被执行一次,那么从本质上看,编译就是在浪费精力。因为将代码翻译成 java 字节码相对于编译这段代码并执行代码来说,要快很多。当 然,如果一段代码频繁的调用方法,或是一个循环,也就是这段代码被多次执行,那么编译就非常值得了。因此,编译器具有的这种权衡能力会首先执行解释后的代 码,然后再去分辨哪些方法会转载 2020-10-16 09:09:58 · 252 阅读 · 0 评论 -
深入理解Java虚拟机-走近Java
本博客主要参考周志明老师的《深入理解Java虚拟机》第二版 读书是一种跟大神的交流。阅读《深入理解Java虚拟机》受益匪浅,对Java虚拟机有初步的认识。这里写博客主要出于以下三个目的:一方面是记录,方便日后阅读;一方面是加深对内容的理解;一方面是分享给大家,希望对大家有帮助。 《深入理解Java虚拟机》全书总结如下: 序号内容链接地址1深入理解Java虚拟机-走近Javahttps://blog.csdn.net/ThinkWon/article/details/1038043872深入理解J.转载 2020-10-10 14:49:46 · 1075 阅读 · 0 评论 -
深入理解Java虚拟机-Java内存区域与内存溢出异常
本博客主要参考周志明老师的《深入理解Java虚拟机》第二版 读书是一种跟大神的交流。阅读《深入理解Java虚拟机》受益匪浅,对Java虚拟机有初步的认识。这里写博客主要出于以下三个目的:一方面是记录,方便日后阅读;一方面是加深对内容的理解;一方面是分享给大家,希望对大家有帮助。 《深入理解Java虚拟机》全书总结如下: 序号内容链接地址1深入理解Java虚拟机-走近Javahttps://blog.csdn.net/ThinkWon/article/details/1038043872深入理解J.转载 2020-10-10 15:43:52 · 57 阅读 · 0 评论 -
深入理解Java虚拟机-垃圾回收器与内存分配策略
本博客主要参考周志明老师的《深入理解Java虚拟机》第二版 读书是一种跟大神的交流。阅读《深入理解Java虚拟机》受益匪浅,对Java虚拟机有初步的认识。这里写博客主要出于以下三个目的:一方面是记录,方便日后阅读;一方面是加深对内容的理解;一方面是分享给大家,希望对大家有帮助。 《深入理解Java虚拟机》全书总结如下: 序号内容链接地址1深入理解Java虚拟机-走近Javahttps://blog.csdn.net/ThinkWon/article/details/1038043872深入理解..转载 2020-10-10 19:07:22 · 90 阅读 · 0 评论 -
深入理解Java虚拟机-虚拟机执行子系统
本博客主要参考周志明老师的《深入理解Java虚拟机》第二版 读书是一种跟大神的交流。阅读《深入理解Java虚拟机》受益匪浅,对Java虚拟机有初步的认识。这里写博客主要出于以下三个目的:一方面是记录,方便日后阅读;一方面是加深对内容的理解;一方面是分享给大家,希望对大家有帮助。 《深入理解Java虚拟机》全书总结如下: 序号内容链接地址1深入理解Java虚拟机-走近Javahttps://blog.csdn.net/ThinkWon/article/details/1038043872深入理解..转载 2020-10-10 20:40:46 · 262 阅读 · 0 评论 -
深入理解Java虚拟机-程序编译与代码优化
本博客主要参考周志明老师的《深入理解Java虚拟机》第二版 读书是一种跟大神的交流。阅读《深入理解Java虚拟机》受益匪浅,对Java虚拟机有初步的认识。这里写博客主要出于以下三个目的:一方面是记录,方便日后阅读;一方面是加深对内容的理解;一方面是分享给大家,希望对大家有帮助。 《深入理解Java虚拟机》全书总结如下: 序号内容链接地址1深入理解Java虚拟机-走近Javahttps://blog.csdn.net/ThinkWon/article/details/1038043872深入理解..转载 2020-10-10 21:03:24 · 88 阅读 · 0 评论 -
深入理解Java虚拟机-高效并发
本博客主要参考周志明老师的《深入理解Java虚拟机》第二版 读书是一种跟大神的交流。阅读《深入理解Java虚拟机》受益匪浅,对Java虚拟机有初步的认识。这里写博客主要出于以下三个目的:一方面是记录,方便日后阅读;一方面是加深对内容的理解;一方面是分享给大家,希望对大家有帮助。 《深入理解Java虚拟机》全书总结如下: 序号内容链接地址1深入理解Java虚拟机-走近Javahttps://blog.csdn.net/ThinkWon/article/details/1038043872深入理解..转载 2020-10-10 21:13:12 · 98 阅读 · 0 评论 -
深入理解Java虚拟机 第一章 - 走进Java
深入理解Java虚拟机 第一章 - 走进Java世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本身就是一个不断追求完美的过程。1 概述Java不仅仅是一门编程语言,更是一个生态,是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境。认识技术运作的本质,是自己思考“程序这样写好不好”的基础和前提。2 Java技术体系JDK = Java程序设计语言 + Java虚拟机 + Java API (支持Java程序开发的最小环境)3原创 2020-09-18 18:09:31 · 864 阅读 · 1 评论 -
深入理解Java虚拟机 第二章 - Java内存区域与内存溢出异常
深入理解Java虚拟机 第二章 - Java内存区域与内存溢出异常Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外的人想进去,墙里面的人却想出来1 概述C/C++程序员对内存的管理拥有更高的“权限”,在获得最高权力的同时,也必须要对每块内存负责到底。而Java虚拟机自动管理内存的机制帮助程序员免受内存管理的困扰,与此同时又丧失了一部分对内存管理的权限,使得出错时很难排错。本章介绍Java虚拟机内存的各个区域,讲解这些区域的作用、服务对象以及其中可能产生的问题,这是翻越原创 2020-09-20 11:20:40 · 168 阅读 · 0 评论 -
强、软、弱、虚引用的区别和使用(The Best)
Java提供了四种级别的应用类型:强引用、软引用、弱引用及虚引用。那么这四种引用类型有什么区别呢?首先我们通过一张图来看看四种引用在Java中的表示:FinalReference由于FinalReference是包内可见,Finalizer是其唯一的扩展类。在外部是无法直接使用这两个类的,因为FinalReference引用类型是为JVM提供的,JVM会对那些实现了 Object 中 finalize() 方法的类实例化一个对应的FinalReference,提供 对象被 GC 前需要执行 fin转载 2020-10-17 21:14:59 · 142 阅读 · 0 评论 -
强引用、软引用、弱引用、虚引用总结
总结:强引用:普通new对象的引用 User user = new User(); jvm宁愿抛出OutOfMemory异常也不会去回收该对象软引用: SoftReference引用的装饰的对象,该对象的强引用应该赋值空 这里配合ReferenceQueue使用(也可以不配合),因为SoftReference本身也是new了一个对象 当他把别人的问题解决掉以后,也需要把自己的问题解决,所以当jvm把软引用 对象回收后,就会把自己的对象引用放到这个队列中,我们可以通过队列的poll() 方法查看,如果...转载 2020-10-17 20:58:20 · 66 阅读 · 0 评论 -
你不可不知的Java引用类型之——虚引用
0|1定义虚引用是使用PhantomReference创建的引用,虚引用也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个。一个对象是否有虚引用的存在,完全不会对其生命周期构成影响,也无法通过虚引用获得一个对象实例。0|1说明虚引用,正如其名,对一个对象而言,这个引用形同虚设,有和没有一样。如果一个对象与GC Roots之间仅存在虚引用,则称这个对象为虚可达(phantom reachable)对象。当试图通过虚引用的get()方法取得强引用时,总是会返回null,并且,虚引...转载 2020-10-17 11:17:29 · 112 阅读 · 0 评论 -
Java中的强引用,软引用,弱引用,虚引用有什么用?
每一种语言都有着自己操作内存元素的方式,C语言通过指针,而java就是通过引用。作为一门面向对象的语言,在java中世事万物皆对象。但是我们操作的标识符实际上是对象的一个引用(reference)。今天我们来分析一下java中的四种引用。一、引用的历史在Java中,我们的垃圾回收机制回收垃圾对象的时候就会依据对象的引用。比如说通过不同的垃圾回收算法,这里有两种:引用计数法和可达性分析法1、引用计数法:为每个对象添加一个引用计数器,每当有一个引用指向它时,计数器就加1,当引用失效时,计数器就减1,当计数器为0转载 2020-10-17 12:12:08 · 461 阅读 · 0 评论 -
Java -- 虚引用(PhantomReference)
“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。 虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时...转载 2020-10-17 10:44:04 · 521 阅读 · 0 评论 -
JVM调优总结(一)-- 一些概念
数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress引用类型包括:类类型,接口类型和数组。堆与栈 堆和栈转载 2020-10-17 10:11:34 · 83 阅读 · 0 评论 -
JVM调优总结(二)-- 一些概念(续)
Java对象的大小 基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。 在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:Object ob = new Object(); 这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte。4byte是上面转载 2020-10-17 10:29:31 · 57 阅读 · 0 评论 -
JVM调优总结(三)-- 基本垃圾回收算法
可以从不同的的角度去划分垃圾回收算法:按照基本回收策略分引用计数(Reference Counting):比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。 标记-清除(Mark-Sweep): 此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。转载 2020-10-18 12:43:33 · 79 阅读 · 1 评论 -
JVM调优总结(四)-- 垃圾回收面临的问题
如何区分垃圾 上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断。垃圾回收程序收集计数为0的对象即可。但是这种方法无法解决循环引用。所以,后来实现的垃圾判断算法中,都是从程序运行的根节点出发,遍历整个对象引用,查找存活的对象。那么在这种方式的实现中,垃圾回收从哪儿开始的呢?即,从哪儿开始查找哪些对象是正在被当前系统使用的。上面分析的堆和栈的区别,其中栈是真正进行程序执行地方,所以要获取哪些对象正在被使用,则需要从Java栈开始。同时,一个栈是与一个转载 2020-10-18 12:51:07 · 72 阅读 · 0 评论 -
JVM调优总结(五)-- 分代垃圾回收详述1
为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。 在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类对象跟业务直接挂钩,因此生命周期比较长。但是还有一些对象,主要是程序运行过程中生成的临时变量,这些对象生命周期会比较短,比如转载 2020-10-18 13:00:42 · 67 阅读 · 0 评论 -
JVM调优总结(六)-- 分代垃圾回收详述2
分代垃圾回收流程示意 选择合适的垃圾收集算法串行收集器 用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高。但是,也无法使用多处理器的优势,所以此收集器适合单处理器机器。当然,此收集器也可以用在小数据量(100M左右)情况下的多处理器机器上。可以使用-XX:+UseSerialGC打开。 并行收集器 对年轻代进行并行垃圾回收,因此可以减少垃圾回收时间。一般在多线程多处理转载 2020-10-18 13:11:19 · 84 阅读 · 0 评论 -
JVM调优总结(七)-- 典型配置举例1
以下配置主要针对分代垃圾回收算法而言。堆大小设置年轻代的设置很关键JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。典型设置:java -Xmx3550m -Xms3550m -Xmn2g –Xss128k-Xmx3550m:设置转载 2020-10-18 13:28:40 · 74 阅读 · 0 评论