深入理解Java虚拟机阅读心得(一)】的更多相关文章

JVM(Java Virtual Machine) 即Java虚拟机,是一种用于计算设备的规范,用于运行Java程序编译后得到的字节码文件(Class文件) 一.JVM的内存区域 1.程序计数器(Programing Counter Register) 用于选取需要JVM执行的字节码指令,最简单的一种方法就是通过修改程序计数器的值来达到选取下一条需要执行的字节码指令的目的. 如在多线程中CPU时间片切换时,可以通过线程私有的程序计数器来知道这次应当执行的是哪一条字节码指令. 每个线程都会有一个独…
垃圾收集 程序计数器.虚拟机栈.本地方法栈三个区域随线程而生,随线程而灭:这几个区域的内存分配和回收都具备稳定性,不需要过多的考虑回收的问题.而Java堆和方法区则不一样. Java堆中存储了几乎所有的对象实例,垃圾收集器进行对堆的回收之前,需要判断这些对象是否还存活 一.判断对象是否存活 判断对象是否还活着,主要有两种方法 1.引用计数法 给对象添加一个引用计数器,每当一个地方引用时,计数器值加1: 每当一个引用失效时,计数器减1: 任何计数器为0的对象为不可能被使用的对象. 优点:实现简单,…
Java中提倡的自动内存管理最终可以归结为自动化的解决两个问题: 给对象分配内存 回收分配给对象的内存 先说说回收这一方面的两个主要知识点 一.垃圾收集算法 1.标记-清理算法 首先标记出所有需要回收的对象,然后在标记完成后统一回收所有被标记的对象(适用老年代) 两个缺陷:(1)效率问题,标记和清除两个过程效率都不高 (2)空间问题,标记清除算法会产生大量不连续的内存空间碎片,导致无法分配较大对象 2.复制算法 将可用内存按容量划分为等大小的两块,每次只使用其中的一块.清理时将还存活着的对象复制…
1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2.虚拟机栈 占用空间:依据栈空间设定 作用:java 方法执行的内存模型. 作用详情:每个方法执行时都会创建栈桢.用于储存局部变量表.栈操作数.动态链接.方法出口等信息.每个方法从调用到执行完成就对应一个栈帧在虚拟机栈中入栈到出栈的过程 特点:线程私有 3.本地方法栈 本地方法栈(Native Met…
垃圾收集器与内存分配策略 一.判断对象是否已死 1.垃圾收集器在对堆进行回收前,要先判断对象是否已死.而判断的算法有引用计数算法和可达性分析算法: 2.引用计数算法是给对象添加引用计数器,有地方引用就加1,当引用失效就减1,任何时刻计数器为0的对象就是不可能再被引用的.但是它很难解决对象之间相互循环引用.所以在主流的Java虚拟机里没有用引用计数算法来管理内存. 3.可达性分析算法是通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Refer…
Java内存区域 一.java运行时数据区域 1. 程序计数器:程序计数器占据的内存空间较小,是当前运行线程执行的字节码的计数:分支.循环.跳转.异常处理.线程恢复等都要依赖技术器来对执行的字节码进行执行位置的计算来实现的.程序计数器的内存空间是每条线程独有的,也称之为“线程私有”的内存:计数器记录的是正在运行的字节码指令的地址,而如果是Native方法(本地方法),则计数器的值为空(Undefined).此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况…
虚拟机把描述类的Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言中,类型的加载.连接和初始化过程都是在程序运行期间完成的. 一.类的生命周期: 类从加载到内存,直至从内存中卸载.整个生命周期如下图: 其中,加载.验证.准备.初始化.和卸载这5个阶段的顺序是确定的. 二.类加载的时机: Java并没有规定什么时候对类进行加载,但是规定了有且只有5中情况,要对类进行加载: new实例化对象时.读取或者…
一.Java内存区域 1.程序计数器 线程私有. 当前线程所执行的字节码的行号指示器.由于JAVA是多线程的,因此每个线程都独立的程序计数器. 异常:没有规定任何OutOfMemeryError情况的区域. 2. Java虚拟机栈 线程私有. 描述Java方法的内存模型——栈帧(局部变量表.操作数栈.动态链接.方法出口).每个方法从调用到执行完成,对应一个栈帧入栈到出栈的过程. 异常:StackOverflowError和OutOfMemoryError异常 3.本地方法栈 线程私有. 本地方法…
java虚拟机所管理的内存区域主要分为方法区.堆:虚拟机栈.本地方法栈.程序计数器,如图: 1.程序计数器是当前线程所执行的字节码行号指示器,用以记录当前指令执行的位置.程序计数器是线程私有的,每个线程都有一个独立的线程计数器. 2.Java虚拟机栈是一种Java方法执行的内存模型:方法执行时会创建一个栈帧用来存储局部变量表.操作数栈.动态链接.方法出口等信息.方法调用到执行完成的过程就是一个栈帧在虚拟机栈从入栈到出栈的过程.经常有人将java内存分为堆内存和栈内存,其中的栈就是指虚拟机栈,更具…
线程安全:如果一个对象可以安全的被多个线程同时使用,那它就是线程安全的. 一.Java中的线程安全 1.不可变 不可变的对象一定是线程安全的.String.枚举类型.java.lang.Number的部分子类如Long和Double等数值包装类型,BigInteger和BigDecimal等大数据类型. AtomicInteger和AtomicLong并非是不可变的. 2.绝对线程安全 如Vector类是线程安全的,但是如果多个线程同时对Vector数据进行增加或者减少,那么Vector线程不是…
一.垃圾收集器总览 新生代:Serial. ParNew. Parallel Scavenge 老年代:CMS.Serial Old. Parallel Old 最新的:G1 并行和并发的区别: 并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态. 并发:指用户线程和垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户线程在继续执行,而垃圾收集程序运行于另一个CPU上. 二.收集器 1. Serial收集器 单线程收集器.“Stop The World”(必须停止其他工作…
线程私有的程序计数器.虚拟机栈和本地方法栈随线程而生,随线程而灭.栈中的栈帧随方法的进入和退出有条不紊的入栈和出栈. 而Java堆和方法区因为需要多大内存.创建多少对象都是不确定的,因此这两个区域是垃圾回收的重点对象. 一.如何判断对象是否存活 1. 引用计数法 给每个对象添加一个引用计数器,有一个地方引用就+1,引用失效就-1.计数器为0,即该对象无法被访问. 优点:实现简单,判断效率高. 缺点:难以解决对象之间的循环引用问题. 2. 可达性分析法 通过一系列“GC Roots”的对象作为起始…
垃圾收集器 手机算法是内存回收的方法论,垃圾收集器是内存回收的具体实现. 并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态 并发:值用户线程与垃圾收集线程同时执行(但并不一定是并行的),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上. Serial收集器 单线程收集器,也就是说是必须停止所有的工作线程,知道垃圾收集完毕.对于单CPU来说更加高效.所以适合运行于Client模式下的虚拟机. 新生代采用复制算法.老年代采用标记整理算法. ParNew收集器 是Serial的多…
Java内存模型是定义线程共享的变量的访问规则(实例字段.静态字段和构成数组对象的元素),但不包括线程私有的局部变量和方法参数. 1.主内存与工作内存 Java内存模型规定,所有的变量都必须存储在主内存中. 线程使用到的变量保存在线程工作内存中,其实主内存的副本拷贝. 2. 内存间的交互操作 lock : 作用于主内存中的变量,将变量标识为线程独占的. unlock :作用于主内存中的变量,将线程独占的变量解锁. read :作用于主内存中的变量,将一个变量值从主内存传输到工作内存. load…
xl_echo编辑整理.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! --- > 以下内容摘抄自<_深入理解Java虚拟机_JVM高级特性与最佳实践 第2版_220_>,博主完全尊重书籍原创,只是学习笔记摘抄部分,由于不是原创,不支持转载.如有侵权请联系博主(微信号:t2421499075). #### Java能够被广泛认可的优点: - 结构严谨 - 面向对象编程的思想 - 跨平台的便利…
xl_echo编辑整理.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! --- > 以下内容摘抄自<_深入理解Java虚拟机_JVM高级特性与最佳实践 第2版_220_>,博主完全尊重书籍原创,只是学习笔记摘抄部分,由于不是原创,不支持转载.如有侵权请联系博主(微信号:t2421499075). > Java是一门面向对象的编程语言,在程序运行过程中每时每刻都有对象被创建,我们在写代码的…
文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上一张图 这张图主要列出了Java虚拟机管理的内存的几个区域. 常有人把Java内存区分为堆内存(Heap)和栈内存(Stack).这样的分法比較粗糙,Java内存区域的划分实际上远比这复杂.从上图就能够看出了. 堆栈分法中所指的"栈"实际上仅仅是虚拟机栈,或者说是虚拟机栈中的局部变量表部分…
<深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位java程序员,你是否也曾经想深入理解java虚拟机,但是却被它的复杂和深奥拒之门外?没关系,<深入理解java虚拟机:jvm高级特性与最佳实践>极尽化繁为简之妙,能带领你在轻松中领略java虚拟机的奥秘.<深入理解java虚拟机:jvm高级特性与最佳实践>是近年来国内出版的唯一一本与…
Java一个重要的优势就是通过垃圾管理器GC (Garbage Collection)自动管理和回收内存,程序员无需通过调用方法来释放内存.也因此很好多的程序员可能会认为Java程序不会出现内存泄漏的问题,这种想法是不对的,当我们对内存使用不当的时候仍然可能会出现内存泄漏,并且问题相对与c++来说更隐秘,问题的根源排查起来也比较困难.不过,当我们了解了Java虚拟机内存区域,Java垃圾收集器之后,对于解决内存泄漏的问题也就不是什么困难的事情了. 相关阅读 1.深入理解java虚拟机之java内…
目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1.8 属性表集 1.8.1 Code属性 1.8.2 Exception属性 1.8.3 LineNumberTable属性 1.8.4 LocalVariableTable属性 1.8.5 SourceFile属性 1.8.6 ConstantValue属性 1.8.7 InnerClass属性…
0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有领会到的心得和踩过的坑,将会对这些文章进行更新. 另外,人脑更喜欢图胜过文字,有些流程先用文字码在那儿,后面有时间再画图. 1.「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势 2.「深入理解Java虚拟机」学习笔记(2)- JVM内存区域 3.[Java]「深入理解Java虚拟机…
类加载机制 谈起类加载机制,在这里说个题外话,当初本人在学了两三个月的Java后,只了解了一些皮毛知识,就屁颠屁颠得去附近学校的招聘会去蹭蹭面试经验,和HR聊了一会后开始了技术面试,前抛出了两个简单的小问题铺垫了一下,然后接下来的问题就是简单的说一下类加载机制,听到这个问题,我脑子里面想到这个问题我看过,在<深入理解Java虚拟机>这本书上看到过这个原理,但是只是很浅显的翻看了一下,并没有下功夫去了解其中的原理.然后就大脑一片空白,什么也想不到了,支支吾吾没有回答上来,这就gg了,当时羞愧得想…
郑重声明:本片博客是学习<深入理解java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为"热点代码",为了提高热点代码的执行效率,在运行时, 虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器,即时编译器编译性能的好坏. 代码优化程度的高低却是衡量一款商用虚拟机优秀与否的最关键的指标…
深入理解Java虚拟机(字节码执行引擎) 本文首发于微信公众号:BaronTalk 执行引擎是 Java 虚拟机最核心的组成部分之一.「虚拟机」是相对于「物理机」的概念,这两种机器都有代码执行的能力,区别是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上的,而虚拟机执行引擎是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式. 在 Java 虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,这个概念模型成为各种虚拟机执行引擎的统…
谈起<深入理解java虚拟机>这本书,让我印象深刻的就是换工作跳槽面试的时候,当时刚进入java开发这个行业的时候,平时只是做一些对数据库的增删改查等功能,当自己技术增长一些的时候,就开始对java底层jvm开始研究,当时自己喜欢看一些博客啊,公众号等等,大部分的大牛们推荐看<深入理解java虚拟机>这本书.我就从当当网上买了这本书,当时特别的清晰.一开始看这本书的时候其实有点不太理解,因为平时没有接触这些东西.有一次我印象特别深,当时我所在线上的项目出现了OutOfMemory,…
深入理解java虚拟机JVM(下) 链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w 提取码:uwak 复制这段内容后打开百度网盘手机App,操作更方便哦 4. JVM的垃圾收集器 4.1 垃圾收集器类型概述 新生代可用GC策略: 串行GC(Serial Copying); 并行回收GC(Parallel Scavenge): 并行GC(ParNew): 老年代可用GC策略: 串行GC(Serial MSC): 并行GC(Parallel MS…
深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_PRIVATE.各种字节码指令等等许多概念听起来都是云山雾罩.一知半解,原因就在于对类文件结构和类加载机制不够了解.直到后来细读了<深入理解 Java 虚拟机>中虚拟机执行子系统的相关内容,才建立了清晰的认知.如果你也和我一样,不了解类结构和类加载,但是工作中又涉及到字节码相关内容,相信后面两篇文章…
文章首发于公众号:BaronTalk 书籍真的是常读常新,古人说「书读百遍其义自见」还是很有道理的.周志明老师的这本<深入理解 Java 虚拟机>我细读了不下三遍,每一次阅读都有新的收获,每一次阅读对 Java 虚拟机的理解就更进一步.因而萌生了将读书笔记整理成文的想法,一是想检验下自己的学习成果,对学习内容进行一次系统性的复盘:二是给还没接触过这部好作品的同学推荐下,在阅读这部佳作之前能通过我的文章一窥书中的精华. 原想着一篇文章就够了,但写着写着就发现篇幅大大超出了预期.看来还是功力不够,…
前言 本文中部分内容引用至<深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)>第12章,如果有兴趣可自行深入阅读,文末放有书籍PDF版本连接. 一.物理机中的并发 物理机遇到的并发问题其实与虚拟机中的情况有很多相似之处,所以物理机对并发的处理方案对于虚拟机的实现也有比较大的参考意义     "充分的利用计算机效能"和"让计算机并发运行多个任务"之间的关系,看上去是紧密相连的,但是实际上并没有想象中的那么简单,这其中有一个重要的原因在于计算机的大…
这是why技术的第34篇原创文章 本周还是在家办公的一周,上面的图就是我在家的工位,和上周<Dubbo Cluster集群那点你不知道的事>这篇文章里面的第一张图片比起来,升级了显示器支撑臂,如果短还可以加长:用上了机械键盘,让指尖享受那一点点来自红轴的美妙反馈...... 还是那句话:工欲善其事,必先利其器.在家办公,我是认真的. 图中显示器下面的两本书分别是<深入理解Java虚拟机>的第2版和第3版.也就是本文的主角. 你的手边有第2版吗? 来,翻到第57页.这里面有个“坑”,…