2.1.1
所有能编译出java .class文件的JVM脚本语言,都能在hi-nginx-java体系中工作。 例如groovy : package groovy import hi.request import hi.response import hi.route import java.util.regex.Matcher class test implements hi.route.run
主要内容:前言,1、是否依赖Java系统自身内存处理数据?,2、依赖Java系统自身内存有什么缺陷,3、优化为依赖OS Cache而不是JVM,4、老司机经验之谈:,5、正确的做法:前言 这篇文章,给大家聊一个生产环境的实践经验:线上系统部署的时候,JVM堆内存大小是越大越好吗? 先说明白一个前提,本文主要讨论的是Kafka和Elasticsearch两种分布式系统的线上部署情况,不是普通的Java应用系统。 1、是否依赖Java系统自身内存处理数据? 先说明一点,不管是我们自己开发的Java应
主要内容:事故背景,排查思路,排查案例,总结今天给大家分享一个我们之前基于 dubbo 开发一个线上系统时候遇到的内存泄漏生产问题的排查与优化实践经验。 相信对于大家多看一些类似的案例,以后对于大家自己在线上系统遇到各种生产问题的时候,进行排查和优化的思路会有很大的启发。 事故背景 先给大家简单说一下这个问题的发生背景,线上生产环境部署了两个系统,我们可以认为是系统 A 和系统 B,同时系统 B 因为是大流量核心系统,所以部署了几十台机器,
主要内容:1、前言,2、JVM在什么情况下会加载一个类?,3、从实用角度出发,来看看验证、准备和初始化的过程,4、核心阶段:初始化,5、类加载器和双亲委派机制1、前言 先来看一下JVM整体的一个运行原理。 我们首先从“.java”代码文件,编译成“.class”字节码文件,然后类加载器把“.class”字节码文件中的类给加载到JVM中,接着是JVM来执行我们写好的那些类中的代码,整体是这么个顺序。 我们看看下图,感受一下这个过程: 那么今天,我们就来仔细看看上图中的“类加载”这个过程,看看JVM
主要内容:前言,1、是否依赖Java系统自身内存处理数据?,2、依赖Java系统自身内存有什么缺陷,3、优化为依赖OS Cache而不是JVM,4、老司机经验之谈:,5、正确的做法:前言 这篇文章,给大家聊一个生产环境的实践经验:线上系统部署的时候,JVM堆内存大小是越大越好吗? 先说明白一个前提,本文主要讨论的是Kafka和Elasticsearch两种分布式系统的线上部署情况,不是普通的Java应用系统。 1、是否依赖Java系统自身内存处理数据? 先说明一点,不管是我们自己开发的Java应
主要内容:1.JVM内存结构,2.JVM内存模型,3. heap 和stack,4.栈内存溢出,5. OOM,7.如何判断一个对象是否存活,8.强引用、软引用、弱引用、虚引用,9.被引用的对象就一定能存活吗,10.垃圾回收器,11.垃圾回收算法,12.JVM中一次完整的GC,13.Minor GC 和 Full GC,14.空间分配担保原则,15.栈结构,16.类加载系统,17.类加载以及类加载的过程,,,,,,,,,,,1.JVM内存结构 图1 图2 图3 图4 图5: 运行时数据期分为:1.
主要内容:垃圾回收算法,1、垃圾回收器的分类,2、串行垃圾回收器,3、吞吐量优先,4、响应时间优先,5、G1(Garbage First,jdk9默认),6、Full GC垃圾回收算法 1.标记清除 2.标记复制 3.标记整理 内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度) 内存整齐度:复制算法=标记清除算法>标记压缩算法 内存利用率:复制算法<标记清除算法=标记压缩算法 年轻代: 存活率低 复制算法 老年代: 区域大,存活率高 标记清除(内存碎片不是太多)+标记压缩共同实现 1、
什么是是可达性分析算法? 现代虚拟机基本都是采用可达性分析算法来判断对象是否存活,可达性算法的原理是以一系列叫做 GC Root 的对象为起点出发,引出它们指向的下一个节点,再以下个节点为起点,引出此节点指向的下一个结点。这样通过 GC Root 串成的一条线就叫引用链),直到所有的结点都遍历完毕,如果相关对象不在任意一个以 GC Root 为起点的引用链中,则这些对象会被判断为垃圾对象,会被 G
主要内容:1.JVM参数分类,2.堆参数设置,3.元空间参数,4.栈参数设置,5.收集器参数设置,6.GC策略参数配置,7.Dump异常快照,8.GC日志配置写在开头: X或者XX开头的都是非标准化参数 意思就是说标准化参数不会变,非标准化参数可能在每个JDK版本中有所变化 -XX:+PrintCommandLineFlags查看当前JVM设置过的相关参数 1.JVM参数分类 “-”、“-X”、“-XX” 标准参数(-):所有的JVM实现都必须实现这些参数的功能,而且向后兼容; -verbose
主要内容:1.JVM内存结构,2.JVM内存模型,3. heap 和stack,4.栈内存溢出,5. OOM,7.如何判断一个对象是否存活,8.强引用、软引用、弱引用、虚引用,9.被引用的对象就一定能存活吗,10.垃圾回收器,11.垃圾回收算法,12.JVM中一次完整的GC,13.Minor GC 和 Full GC,14.空间分配担保原则,15.栈结构,16.类加载系统,17.类加载以及类加载的过程,,,,,,,,,,,1.JVM内存结构 图1 图2 图3 图4 图5: 运行时数据期分为:1.
主要内容:垃圾回收算法,1、垃圾回收器的分类,2、串行垃圾回收器,3、吞吐量优先,4、响应时间优先,5、G1(Garbage First,jdk9默认),6、Full GC垃圾回收算法 1.标记清除 2.标记复制 3.标记整理 内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度) 内存整齐度:复制算法=标记清除算法>标记压缩算法 内存利用率:复制算法<标记清除算法=标记压缩算法 年轻代: 存活率低 复制算法 老年代: 区域大,存活率高 标记清除(内存碎片不是太多)+标记压缩共同实现 1、
Runtime data Area 什么是操作数栈? 与局部变量表一样,均以字长为单位的数组。不过局部变量表用的是索引,操作数栈是弹栈/压栈来访问。操作数栈可理解为java虚拟机栈中的一个用于计算的临时数据存储区。 存储的数据与局部变量表一致含int、long、float、double、reference、returnType,操作数栈中byte、short、char压栈前(bipush)会被转为
想要让一个Java程序正确地运行在JVM中,Java源码就必须要被编译为符合JVM规范的字节码。 前端编译器的主要任务就是负责将符合Java语法规范的Java代码转换为符合JVM规范的字节码文件。 javac是一种能够将Java源码编译为字节码的前端编译器。 Javac编译器在将Java源码编译为一个有效的字节码文件过程中经历了4个步骤,分别是词法解析、语法解析、语义解析以及生成字节码。 一个语言
主要内容:1.对象的实例化,2. 对象的内存布局,3.对象的访问定位1.对象的实例化 1. new 最常见的方式 变形1 : Xxx的静态方法 变形2 : XxBuilder/XxoxFactory的静态方法 Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是public Constructor的newInstance(Xxx):反射的方式,可以调用空参、带参的构造器,权限没有要求 使用clone() :不调用任何构造器,当前类需