07JVM编译原理
文章
01 Java编译原理
https://www.cnblogs.com/qingshanli/p/9281760.html 1 Java编译流程基本流程 前端编译主要指与源语言有关但与目标机无关的部分,包括词法分析、语法分析、语义分析与中间代码生成。把*.java文件转变成*.class文件 后端编译主要指与目标机有关的部分,包括代码优化和目标代码生成等。指把字节码转变成机器码 关键工具:词法分析器、语法分析器、语义分析器和代码生成器 读取源码,进行词法分析。也就是找出源码字节中的关键字,识别出合法的关键字,最后得出一些规范化的Token(中文意思是“标记“、”象征”等)流。 对Token流进行语法分析,检查关键词的组合是否符合语法,最后得到抽象的语法树(语法树是吧语言的主要此法用一个结构化的形式组合在一起) 进行语法分析,把难懂的,复杂的语法转化成更加简单的的语法(对计算机来说),最后得到一个注解过后的抽象语法树 通过字节码生成器将经过注解的抽象语法树生成字节码 2 Java前端编译java的前端编译(即javac编译)可分为解析与填充符号表、插入式注解处理器的注解处理、分析与字节码生成等...
02 Java内存区域与内存溢出
2 Java内存区域与内存溢出异常2.1 概述虚拟机提供的最大的能力:自动内存管理。不再需要用户为每一个操作去写配对的delete、free代码,不需要手动管理内存的申请和释放,不容易出现内存泄漏的问题。这也符合并奠定了Java的操作哲学,通过各种各样的运行时接管一些常规的传统语言的操作。 2.2 运行时内存区域 程序计数器:当前线程所执行的字节码的行号指示器。多线程通过线程切换、分配处理器执行,每条线程都需要一个独立的程序计数器,各线程之间计数器互不影响、独立存储,是线程私有的内存。 Java虚拟机栈:Java方法执行的内存模型。每个方法执行的时候,创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。线程私有的内存。局部变量表存放了编译器可知的各种Java虚拟机基本变量类型、对象引用、返回地址类型,局部变量表所需要的空间是在编译期间分配完成的,运行过程中,当进入一个方法时,这个方法需要再栈帧中分配多大的局部变量空间是完全确定的。 本地方法栈:本地方法的栈帧。也是线程私有的内存。 堆:用于存放对象实例。被所有线程共享的一块内存区域,是垃圾收集器管理的内存区域。可...
03 Java垃圾收集和内存分配
3 垃圾收集器与内存分配策略 https://github.com/TangBean/understanding-the-jvm/blob/master/Ch1-Java%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86%E6%9C%BA%E5%88%B6/02-%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86(GC).md 3.1 概述垃圾收集器的概念定义:在应用程序运行时,应用程序会创建许多对象,每个对象都有其生命周期。 在内存中,被其他对象引用的对象被称为live objects 。 不再由任何活动对象引用的对象被视为dead objects ,并称为garbage 。 查找和释放(也称为回收)这些对象使用的空间的过程称为garbage collection 。 范围:在Java内存运行区域中,私有内存(程序计数器、虚拟机栈、本地方法栈)都是随着线程创建或者销毁。栈中的栈帧随着方法的进入和退出进行入栈和出栈操作。每一个栈帧多少内存基本上是在类结构确定下来的时候就是已经知道地,会由及时编译器进行优化。这里讨论的垃圾回收机制,主要...
04 虚拟机性能监控与故障处理工具
生产环境如何排除和优化 JVM?https://cloud.tencent.com/developer/article/2177482 问题排查工具有哪些给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据主要包括以下几种,当运行的程序出现问题的时候,你首先也应该找到相关的数据进行分析。 异常堆栈 虚拟机运行日志 垃圾收集器日志 线程快照(threaddump文件) 堆转存快照(heapdump文件) 如果是在生产环境中直接排查 JVM 的话,最简单的做法就是使用 JDK 自带的 6 个非常实用的命令行工具来排查。它们分别是:jps、jstat、jinfo、jmap、jhat 和 jstack,它们都位于 JDK 的 bin 目录下,可以使用命令行工具直接运行,其目录如下图所示: 1. jps(虚拟机进程状况工具)jps(JVM Process Status tool,虚拟机进程状况工具)它的功能和 Linux 中的 ps 命令比较类似,用于列出正在运行的 JVM 的 LVMID(Local Virtual Machine ...
07 Java类加载机制
Java类加载机制 https://blog.csdn.net/qq_29167297/article/details/124800850 0 JVM简介JVM空间JVM内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 ClassLoader 1 加载加载阶段是将class文件从磁盘或者jar等读到JVM内存中,并为其创建一个Class对象。任何一个类被使用时候系统都会为其创建一个Class对象的。加载的同时将加载的这些数据转换成方法区中运行时数据(运行时候数据区:静态变量、静态代码块、常量池等),作为方法区数据的访问入口。 加载是类加载的第一个过程,在这个阶段,将完成以下三件事情: 通过一个类的全限定名获取该类的二进制流。 将该二进制流中的静态存储结构转化为方法去运行时数据结构。 在内存中生成该类的Class对象,作为该类的数据访问入口。 事实上,这三条限定都不是很严格,比如第一条,并没有明确指出通过全限定名从哪里得到二进制流,由此就有很多不同的实现: 在ZIP包中读取(JAR,EAR,WAR) 从网络中获取(APPLET) 运行时计算生成,这种场景使...
Java 虚拟机
Java 虚拟机 Java 虚拟机 一、运行时数据区域 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 直接内存 二、垃圾收集 判断一个对象是否可被回收 引用类型 垃圾收集算法 垃圾收集器 三、内存分配与回收策略 Minor GC 和 Full GC 内存分配策略 Full GC 的触发条件 四、类加载机制 类的生命周期 类加载过程 类初始化时机 类与类加载器 类加载器分类 双亲委派模型 自定义类加载器实现 参考资料 十四、Java 虚拟机Java 内存结构堆栈垃圾回收JVM 内存区域Java 虚拟机栈class 文件字节码指令JVM 参数调优Java 对象模型HotSpot类加载机制编译和反编译反编译工具(javap)JIT虚拟机性能监控和故障处理工具(jps、jstack、jmap、jstat、jconsole、javap)https://link.zhihu.com/?target=https%3A//www.bilibili.com/video/BV1DJ411B7cG%3Ffrom%3Dsearch%26seid%3D...
jvm gc机制说明
1 GC的方式与过程 参考文档 https://blog.51cto.com/u_14962799/2739752关键词:伊甸园区,幸存区,年轻代,年老代,持久代 JVM内存的大致结构 年轻代(young generation) 两个幸存区(survivor) 一个伊甸区(eden) 老年代(old generation) 吃就带(perm) GC的工作过程 持久代:当类加载时,我们会将.class文件中的部分信息加载到持久区中,比如类的修饰符,字段属性和方法信息等。又或者时import引入类的信息。都叫持久代了,也就说明这块区间的内存相对稳定,垃圾回收一般也就没持久代啥事儿。 伊甸园区:伊甸园区好理解,希腊神话中人类诞生的地方。因此,当我们创建对象时,比如:new String(“123”);即JVM在伊甸园区创建了一个对象,对象里面装的是String类型的数据123。 幸存区:当伊甸园区的内存占满了,而又需要创建对象时,JVM就会像伊甸园区还活着的(被引用的对象),拷贝到幸存区去。此时其实会调用一此Minor GC操作,也可以称为迷你的垃圾回收动作,该动做就会将...











