
Java虚拟机
这个专栏主要记录了本人学习Java虚拟机的过程中所做的一些笔记,主体脉络是以《深入理解Java虚拟机》这本书为主的。
Alexwym
这个作者很懒,什么都没留下…
展开
-
JAVA的内存区域构成(笔记)
一、JAVA内存区域的整体构成JAVA运行时数据区构成如上图。其中灰色部分的方法区和堆属于所有线程共享的数据区,白色部分的虚拟机栈、本地方法栈和程序计数器属于线程隔离的数据区。二、各个数据区域的作用1.程序计数器程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。简单说就是指令指示器,标明正在执行的指令(这里和C++不同,C++中程序计数器指向的是当...原创 2018-08-06 16:02:41 · 340 阅读 · 0 评论 -
早期(编译期)优化(笔记)
一、概述1、三类编译过程#前端编译器:把*.java文件编程*.class文件的过程。——典型代表:Sun的javac、Eclipse JDT中的增量式编译器(ECJ)#后端运行期编译器(JIT编译器): 把字节码转变为机器码的过程。——典型代表:HotSpot VM的C1、C2编译器#静态提前编译器(AOT编译器):直接把*.java文件编译成本地机器代码的过程。——典型代表:G...原创 2018-08-31 20:09:49 · 823 阅读 · 0 评论 -
晚期(运行期)优化(笔记)
一、概述即时编译器性能的好坏、代码优化程度的高低是衡量一款商用虚拟机优秀与否的最关键指标之一。二、HotSpot虚拟机内的即时编译器1、解释器与编译器1.1.许多主流的商用虚拟机都采用解释器与编译器并存的架构。1.2.优势:当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的世界,立即执行。在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本...原创 2018-09-01 10:28:55 · 458 阅读 · 0 评论 -
调优案例与实战(笔记)——eclipse部分
一、编译时间和类加载时间的优化eclipse的使用者众多,它的编译代码我们可以认为是可靠的,不需要在加载的时候进行字节码验证,因此通过参数-Xverify:none禁止掉字节码验证过程可以作为一项优化措施。(首次添加这个参数后,类加载的时间从44.20ms降低到了23.68ms)。后续在进行其它优化后把这个参数去掉,发现类加载的时间好像没怎么受影响了。。。二、编译时间1、定义:虚拟...原创 2018-08-25 17:42:43 · 366 阅读 · 0 评论 -
Java内存模型与线程(笔记)
一、概述多任务处理的原因:计算机的运行速度与它的存储和通信子系统速度的差距太大,大量的时间都花费在磁盘I/O、网络通信或者数据库访问上。为了不让处理器大部分的时间都处于等待其他资源的状态,就可以让计算机同时处理几项任务。一个服务端同时对多个客户端提供服务:每秒事务处理数是衡量一个服务器好坏的重要指标。对于计算量相同的任务,程序线程并发协调得越有条不紊,效率自然就越高;反之,线程之间频繁阻塞...原创 2018-09-01 19:11:29 · 419 阅读 · 0 评论 -
虚拟机类加载机制(笔记)
一、概述1、类加载机制:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。2、Java语言中,类型的加载、连接和初始化过程都是在程序运行期间完成的。优点:为Java应用程序提供高度的灵活性。Java里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。例如:如果编写一个面向接口的应用程序...原创 2018-08-30 11:50:34 · 414 阅读 · 0 评论 -
线程安全与锁优化(笔记)
一、概述面向过程的编程思想:把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象和解决问题,称为面向过程的编程思想。面向对象的编程思想:站在现实世界的角度去抽象和解决问题,它把数据和行为都看做是对象的一部分。二、线程安全定义:“当多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行...原创 2018-09-02 22:05:44 · 542 阅读 · 0 评论 -
闲谈Java内存区域
前不久刚看完了Java虚拟机,看完之后觉得学到了不少东西。但是具体学到了些什么,却很难完整地把它讲述出来,总是会出现知识断层的情况。于是打算从头将其梳理一遍,争取打通任督二脉。。。首先,先来看看Java内存区域的整个知识框架Java语言的特点主要有两个:内存自动分配机制和垃圾收集机制。要想了解这两个内容,我们就要先搞清楚Java的内存区域,而Java内存区域主要就是指运行时数据区。由于...原创 2018-09-18 18:11:53 · 363 阅读 · 0 评论 -
闲谈JVM中的垃圾收集机制
前面我们已经聊过了Java的内存区域构成,今天再来看下Java的垃圾收集机制。整体的框架图如下整个垃圾收集主要分为两个部分,一个是方法论,也就是垃圾收集算法思想;一个是具体实现,也就是七个垃圾收集器。我们先来看下算法思想部分。垃圾收集是针对那些已死的对象,也就是说这一类对象以后不会再被使用。那么我们如何去判定一个对象是否是已死对象呢?一般有两种方法。一是引用计数算法。每当有一个其它对象引用...原创 2018-09-19 20:47:32 · 552 阅读 · 0 评论 -
闲谈java中的程序编译与优化技术
java中的程序编译和优化技术同其他语言一样基本都发生在编译期。java的编译期可根据不同的编译器分为三个部分,一个是前端编译器,比如javac;它的工作就是把.java文件转化为.class文件。另一个是即时编译器,比如JIT编译器;它的工作是把.class文件中的某些热点字节码转化为本地机器码,提高程序运行速度。最后一个是静态提前编译器,比如AOT静态编译器。它跳过了.class文件的生成...原创 2018-09-29 10:10:10 · 669 阅读 · 0 评论 -
字符串常量池、class文件常量池和运行时常量池
一、字符串常量池(String Pool)——位于方法区1.结构:它是一个String Table类,实质上是一个Hash表,默认长度是1009。全局字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例存到string pool中。(关于字符串常量池中存的到底是对象实例还是对象实例的引用,网上有各种说法,大家可以自行百度一下。)2.特点:A、这个Strin...原创 2018-08-21 16:07:06 · 2282 阅读 · 0 评论 -
字节码指令简介(笔记)
Java虚拟机指令的组成:操作码(Opcode,一个字节长度的、代表着某种特定操作含义的数字)+多个操作数(Operands,此操作所需的参数)。Java虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数指令都不包含操作数。字节码指令集的特点:A、指令集的操作码总数不可能超过256条;B、当数据大小超过一个字节时,Java虚拟机需要重构出具体数据的结构。(比如:将一个16位长度的无符号整数使...原创 2018-08-28 20:49:06 · 1769 阅读 · 0 评论 -
JVM使用的编码方式和Java的I/O流
一、唯一的编码JVM中是不允许多种编码方式的字符并存的。例如一个GBK2312的字符串后面跟着一个UTF-8的字符串,那么连接后的最终结果应该是什么编码呢?显然不管选什么编码都会出错。因此便规定java中字符只以一种形式存在,那就是Unicode(不选任何特定的编码,直接使用它们在字符集中的编号,这是统一 的唯一方法)。二、Unicode编码详细内容:https://www.ibm.c...原创 2018-08-07 10:05:31 · 1484 阅读 · 0 评论 -
OutOfMemoryError异常(笔记)
本节内容的目的:1.通过代码验证Java虚拟机规范中描述的各个运行时区域存储的内容;2.遇到实际的内存溢出异常时,能根据异常的信息快速判断是哪个区域的内存溢出,知道什么样的代码可能会导致这些区域内存溢出,以及出现这些异常后该如何处理。一、前期准备1.JVM参数的设置:eclipse.init中2.JVM各种参数所表示的意义:https://blog.youkuaiyun.com/hua00shao...原创 2018-08-18 15:34:34 · 404 阅读 · 0 评论 -
垃圾收集算法与内存分配策略(笔记)
一、概述1、必要性:目目前内存的动态分配与内存回收技术已经相当成熟,一切看起来都已经进入了“自动化”时代,为何我们还要去了解GC和内存分配呢?——当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集称为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”技术实施必要的监控和调节。2、垃圾收集进行的区域程序计数器、虚拟机栈和本地方法栈三个区域具有确定性:它们随线程而生,随线程而灭。当方法...原创 2018-08-22 10:33:53 · 268 阅读 · 0 评论 -
eclipse中如何查看java程序的gc日志
eclipse的gc日志配置可以在eclipse.ini中加入参数实现,不过打印的日志是整个eclipse的内存回收情况,如何实现准确的看一个java应用的gc日志呢.1. Run as -> Run configurations -> java应用名 -> arguments ->VM arguments,加入jvm参数就行2. 测试代码packag...转载 2018-08-22 16:47:53 · 2398 阅读 · 0 评论 -
理解GC日志(笔记)
Java HotSpot(TM) 64-Bit Server VM (25.91-b14) for windows-amd64 JRE (1.8.0_91-b14), built on Apr 1 2016 00:58:32 by "java_re" with MS VC++ 10.0 (VS2010)Memory: 4k page, physical 4080628k(616944k fr...原创 2018-08-22 17:24:23 · 968 阅读 · 0 评论 -
内存分配与回收策略(笔记)
Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。对象的内存分配,往大方向上讲,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓存,将按线程优先在TLAB上分配。少数情况下,也可能直接分配在老年代中。一、对象优先在Eden分配大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行...原创 2018-08-22 21:15:42 · 925 阅读 · 0 评论 -
虚拟机字节码执行引擎(笔记)
一、概述执行引擎是Java虚拟机最核心的组成部分之一。“虚拟机”和“物理机”都有代码执行的能力,其区别是物理机的执行引擎是直接建立在处理器、硬件和操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,可自行制定指令集和执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。执行引擎在执行代码的时候可能有两种选择,一种是解释执行(通过解释器执行),另一种是编译执行(通过即时编译器产...原创 2018-08-30 22:58:05 · 471 阅读 · 0 评论 -
垃圾收集算法实现与垃圾收集器(笔记)
一、HotSpot中垃圾收集的算法实现1、枚举根节点1.1、从可达性分析中从GC Roots节点找引用链这个操作为例,可作为GC Roots的节点主要在全局性的引用(例如常量和类静态属性)与执行上下文(例如栈帧中的本地变量表)中,现在很多应用仅仅方法区就有数百兆,逐个检查所有引用的话必然会消耗很多时间。1.2、可达性分析对执行时间的敏感还体现在停顿上,因为这项工作分析工作必须在一个能确...原创 2018-08-24 08:42:46 · 352 阅读 · 0 评论 -
类文件结构(笔记)
随着虚拟机的流行,越来越多的语言选择了与操作系统和机器指令集无关的、平台中立的格式作为程序编译后的存储格式。而不是直接把程序翻译成二进制本地机器码。一、无关性——“Write Once,Run Anywhere”A、平台无关性sun等公司发布了许多可以运行在不同操作系统上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码,从而实现了程序的“一次编写,到处运行”。(统一规范)...原创 2018-08-28 17:01:04 · 413 阅读 · 0 评论 -
java高分局之jstat命令使用
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]注意:使用的jdk版本是jdk8.类加载统计:C:\Users\Administrator>jstat -class 2060Loaded Bytes Unloaded Bytes Time 15756 1...转载 2018-08-24 09:09:25 · 300 阅读 · 0 评论 -
虚拟机性能监控与故障处理工具(笔记)
一、JDK的命令行工具Sun JDK监控和故障处理工具名称 主要作用 使用示例 jps jvm process status tool,显示指定系统内所有的hotspot虚拟机进程 jps -1 jstat jvm statistics monitoring tool,用于收集hotspot虚拟机各方面的运行数据 jstat -gc 276...原创 2018-08-24 23:04:37 · 335 阅读 · 0 评论