jvm原理

原来热加载如此简单,手动写一个 Java 热加载吧

一曲冷凌霜 提交于 2019-12-02 19:32:13
摘自: https://www.cnblogs.com/niumoo/p/11756703.html 原来热加载如此简单,手动写一个 Java 热加载吧 1. 什么是热加载 热加载 是指可以在不重启服务的情况下让更改的代码生效, 热加载 可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环境。 2. 热加载与热部署的区别 首先,不管是 热加载 还是热部署,都可以在不重启服务的情况下编译/部署项目,都是基于 Java 的类加载器实现的。 那么两者到底有什么区别呢? 在部署方式上: 热部署是在服务器运行时 重新部署 项目。 热加载是在运行时 重新加载 class 。 在实现原理上: 热部署是直接重新 加载整个应用 ,耗时相对较高。 热加载是在运行时 重新加载 class ,后台会启动一个线程不断检测你的类是否改变。 在使用场景上: 热部署更多的是在 生产环境 使用。 热加载则更多的是在 开发环境 上使用。线上由于安全性问题不会使用,难以监控。 3. 类加载五个阶段 可能你已经发现了,图中一共是7个阶段,而不是5个。是因为图是类的完整生命周期,如果要说只是类加载阶段的话,图里最后的使用(Using)和卸载(Unloading)并不算在内。 简单描述一下类加载的五个阶段: 加载阶段:找到类的静态存储结构,加载到虚拟机

面试必问的Synchronized知道这些就可以了

♀尐吖头ヾ 提交于 2019-12-02 14:41:07
摘自: https://www.cnblogs.com/wyc1994666/p/11748212.html 面试必问的Synchronized知道这些就可以了 Synchronized关键字算是Java的元老级锁了,一开始它撑起了Java的同步任务,其用法简单粗暴容易上手。但是有些与它相关的知识点还是需要我们开发者去深入掌握的。比如,我们都知道通过Synchronized锁来实现互斥功能,可以用在方法或者代码块上,那么不同用法都是怎么实现的,以及都经历了了哪些优化等等问题都需要我们扎实的理解。 1.基本用法 2.实现原理 2.1 同步代码块的实现 2.2 同步方法的实现 3.锁升级 3.1 Java对象头介绍 3.2 什么是锁升级 1.基本用法 通常我们可以把Synchronized用在一个方法或者代码块里,方法又有普通方法或者静态方法。 对于普通同步方法,锁是当前实例对象,也就是this public class TestSyn{ private int i=0; public synchronized void incr(){ i++; } } 对于静态同步方法,锁是Class对象 public class TestSyn{ private static int i=0; public static synchronized void incr(){ i++; } }

JVM笔记:Java虚拟机的常量池

别说谁变了你拦得住时间么 提交于 2019-12-02 05:09:34
这篇文章主要是做一个总结,将查找到相关的资料自己做一个整理,最后会列出查找过的相关资料,感兴趣的可以去翻一翻。 常量池 class文件常量池(class constant pool) 常量池可以理解为Class文件之中的资源仓库,它是Class文件结构中与其他项目关联最多的数据类型,包含了类也是占用Class文件中第一个出现的表类型数据项目。 常量池中主要存放两大类常量:字面量(Literal)和符号引用(Symbolic References)。字面量比较接近于Java语言层面的常量概念,如文本字符串、声明为final的常量值等。而符号引用则属于编译原理方面的概念,包含了下面三类常量: 类和接口的全限定名(Full Qualified Name) 字段的名称和描述符(Descriptor) 方法的名称和描述符 类和接口的全限定名,例如: com/example/demo/Demo.class 字段的名称和描述符,例如: Field a:[Ljava/lang/String 方法的名称和描述符,例如: Method java/lang/String."<init>":(Ljava/lang/String;)V 后两个是字节码指令,不懂得可以查阅下相关资料(TODO) + 可以通过查看字节码的形式来查看Class的常量池的内容,因为是在编译时产生的,也可以称为 静态常量池 。

JVM和线程池

别来无恙 提交于 2019-12-01 22:00:31
本文链接:https://blog.csdn.net/liuwenliang_002/article/details/90074283 ———————————————— 版权声明:本文为CSDN博主「30以后的男人」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/liuwenliang_002/article/details/90074283 jvm结构原理,GC工作原理 Jvm结构: Jvm主要包括四个部分: 1、类加载器(ClassLoad) 在JVM启动时或者在类运行时将需要的class加载到JVM中。 类加载时间与过程: 类从被加载到虚拟机内存开始,在到卸载出内存为止,正式生命周期包括了:加载,验证,准备,解析,初始化,使用和卸载7个阶段。其中验证、准备、解析这个三个步骤被统称为连接(linking)。 其中,加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的 ,类的加载过程必须按照这种顺序按部就班的“开始”(仅仅指的是开始,而非执行或者结束,因为这些阶段通常都是互相交叉的混合进行,通常会在一个阶段执行的过程中调用或者激活另一个阶段),而解析阶段则不一定(它在某些情况下可以在初始化阶段之后再开始,这是为了支持java语言的运行时绑定) 在以下几种情况下

一、JVM(HotSpot)Java内存区域

对着背影说爱祢 提交于 2019-12-01 15:28:59
注:本博文主要是基于JDK1.7会适当加入1.8内容。 切记,分清Java内存区域和Java内存模型是两个概念。Java运行区域大致分为五大部分,分别是: 程序计数器、虚拟机栈、本地方法栈,堆,方法区 。真实开发环境中,开发人员往往最关注的就是JVM的堆信息和栈信息,而方法区也就是我们通常所说的永久代,JDK1.7后已被移除,加入metaspace区域。 1、程序计数器(线程私有) 程序计数器是一块很小的内存空间,可以看成当前线程所执行字节码的行号指示器。字节码解释器工作时就是通过程序计数器的值来选取下一条需要执行的字节码指令(这里是解释器,注意区分解释器和编译器的概念和原理)。分支、循环、跳转、异常处理、线程恢复等基础功能都依赖程序计数器完成。 执行Java方法,程序计数器记录的是正在执行的虚拟机字节码所在地址;执行Native方法,程序计数器则为空。它是 唯一一个 没有规定任何OutOfMemoryError的区域。 2、虚拟机栈(线程私有,生命周期和所在线程相同,参数-Xss) 虚拟机栈描述Java方法执行的内存模型,每个方法在执行时都会创建一个栈帧,用于存储局部变量,操作数栈,动态链接,方法出口等。一般设置最大空间为1M。 OutOfMemoryError:扩展时无法申请到足够的内存,抛出。 StackOverflowError:线程请求栈深度大于虚拟机所允许栈的最大深度

mina 之 java.lang.OutOfMemoryError

怎甘沉沦 提交于 2019-12-01 06:57:41
前段时间在测试过程中发现了mina框架的问题:当mina一次传输的文件超过一定值(如55m)或者连续传输文件的次数过于频繁,就会内存溢出: org.apache.mina.filter.codec.ProtocolEncoderException:java.lang.OutOfMemoryError: Java heap space atorg.apache.mina.filter.codec.ProtocolCodecFilter.filterWrite(ProtocolCodecFilter.java:217) atorg.apache.mina.common.support.AbstractIoFilterChain.callPreviousFilterWrite(AbstractIoFilterChain.java:361) atorg.apache.mina.common.support.AbstractIoFilterChain.access$1300(AbstractIoFilterChain.java:53) atorg.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.filterWrite(AbstractIoFilterChain.java:659) atorg.apache.mina

java虚拟机(JVM)

落花浮王杯 提交于 2019-11-30 21:46:22
java虚拟机(JVM) 当我们讨论到它的组成部分的时候,有人可能很多都会说是以栈和堆,但是实际上远远不止这两个部分。 下面我们来讲讲他的组成部分: JVM分为两个区域: 一、线程私有区域 包含虚拟机栈(通常称为Java栈)、本地方法栈(储存JNI)、程序计数器 1、虚拟机栈 对应的就是认为的堆栈的栈,它生命周期与线程相同,描述的是Java内存执行的内存模型:每一个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,对应着一个栈帧在虚拟机栈种入栈到出栈的过程。 局部变量表中存放了编译器可知的各种基本数据类型(boolean、byte、char、short、int、float、double、long的引用和值,方法中的局部变量,执行完成之后就从栈中移除)、对象引用(reference类型,根据具体虚拟机实现,对应的可能是一个指向对象起始地址的引用指针【直接指针】,也可能是指向一个代表对象的句柄或其他与对象相关的位置【句柄池】)和returnAddress类型(指向一条字节码指令的地址) 其中64位长度的long和double类型数据会占2个局部变量内存空间(Slot),其他的数据类型占用1个。在进入一个方法的时候,这个方法需要在帧中分配多大的局部空间是完全确定的,在方法运行期间不会发生大小更改。 异常情况

第三章:JVM判定哪些对象可回收

。_饼干妹妹 提交于 2019-11-30 19:42:38
①引用计数算法 原理:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;在任何时刻计数器的值为0的对象就是不可能再被使用的,也就是可被回收的对象。 它有一个致命的缺陷,那就是它无法解决对象之间相互循环引用的的问题,对于循环引用的对象它无法进行回收。 public class Object { public Object instance; public static void main(String[] args) { // 1Object objectA = new Object();Object objectB = new Object();// 2objectA.instance = objectB;objectB.instance = objectA;// 3objectA = null;objectB = null;}} 程序启动后,objectA和objectB两个对象被创建并在堆中分配内存,这两个对象都相互持有对方的引用,除此之外,这两个对象再无任何其他引用,实际上这两个对象已经不可能再被访问(引用被置空,无法访问),但是它们因为相互引用着对方,导致它们的引用计数器都不为0,于是引用计数算法无法通知GC收集器回收它们。 实际上,当第1步执行时,两个对象的引用计数器值都为1;当第2步执行时,两个对象的引用计数器都为2

深入理解Flink核心技术及原理

只谈情不闲聊 提交于 2019-11-29 17:42:36
前言 Apache Flink(下简称Flink)项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多人的关注。本文将深入分析Flink的一些关键技术与特性,希望能够帮助读者对Flink有更加深入的了解,对其他大数据系统开发者也能有所裨益。本文假设读者已对MapReduce、Spark及Storm等大数据处理框架有所了解,同时熟悉流处理与批处理的基本概念。 文章转载自: 深入理解Flink核心技术 一.Flink简介 Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink提供了诸多更高抽象层的API以便用户编写分布式任务: DataSet API, 对静态数据进行批处理操作,将静态数据抽象成分布式的数据集,用户可以方便地使用Flink提供的各种操作符对分布式数据集进行处理,支持Java、Scala和Python。 DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流,用户可以方便地对分布式数据流进行各种操作,支持Java和Scala。 Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过类SQL的DSL对关系表进行各种查询操作,支持Java和Scala。 此外,Flink还针对特定的应用领域提供了领域库

Jvm Stack栈(五)

拈花ヽ惹草 提交于 2019-11-29 12:31:57
  1、Stack栈    栈也叫栈内存,主管Java程序的运行,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放, 对于栈来说不存在垃圾回收问题 ,只要线程一结束该栈就Over,生命周期和线程一致,是线程私有的。8种 基本类型的变量+对象的引用变量+实例方法都是在函数的栈内存种分配。    2、栈存储什么?   栈帧中主要保存3类数据:   本地变量(Local Variables):输入参数和输出参数以及方法内的变量   栈操作(Operand Stack):记录出栈、入栈的操作;   栈帧(Frame Data):包括类文件、方法等等。    3、栈运行原理    栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存块,是一个数据集,是一个有关方法(Method)和运行期数据的数据集,当一个方法A被调用时就产生了一个栈帧F1,并被压入栈中,A方法又调用了B方法,于是产生栈帧F2也被压入栈,B方法又调用了C方法,于是产生栈帧F3也被压入栈,.....执行完毕后,先弹出F3栈帧,再弹出F2栈帧,再弹出F1栈帧.....。遵循”先进后出“/”后进先出“原则。   每个方法执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息,每一个方法从调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中入栈出栈的过程