jvm原理

手把手教你实现热更新功能,带你了解 Arthas 热更新背后的原理

我的梦境 提交于 2019-12-04 21:09:45
摘自: https://www.cnblogs.com/goodAndyxublog/p/11880314.html 手把手教你实现热更新功能,带你了解 Arthas 热更新背后的原理 文章来源: https://studyidea.cn/java-hotswap 一、前言 # 一天下午正在摸鱼的时候,测试小姐姐走了过来求助,说是需要改动测试环境 mock 应用。但是这个应用一时半会又找不到源代码存在何处。但是测试小姐姐的活还是一定要帮,突然想起了 Arthas 可以热更新应用代码,按照网上的步骤,反编译应用代码,加上需要改动的逻辑,最后热更新成功。对此,测试小姐姐很满意,并表示下次会少提 Bug。 嘿嘿,以前一直对热更新背后原理很好奇,借着这个机会,研究一下热更新的原理。 二、Arthas 热更新 # 我们先来看下 Arthas 是如何热更新的。 详情参考: 阿里巴巴Arthas实践--jad/mc/redefine线上热更新一条龙 假设我们现在有一个 HelloService 类,逻辑如下,现在我们使用 Arthas 热更新代码,让其输出 hello arthas 。 Copy public class HelloService { public static void main(String[] args) throws InterruptedException {

手把手教你实现热更新功能,带你了解 Arthas 热更新背后的原理

蹲街弑〆低调 提交于 2019-12-04 19:55:24
文章来源: https://studyidea.cn/java-hotswap 一、前言 一天下午正在摸鱼的时候,测试小姐姐走了过来求助,说是需要改动测试环境 mock 应用。但是这个应用一时半会又找不到源代码存在何处。但是测试小姐姐的活还是一定要帮,突然想起了 Arthas 可以热更新应用代码,按照网上的步骤,反编译应用代码,加上需要改动的逻辑,最后热更新成功。对此,测试小姐姐很满意,并表示下次会少提 Bug。 嘿嘿,以前一直对热更新背后原理很好奇,借着这个机会,研究一下热更新的原理。 二、Arthas 热更新 我们先来看下 Arthas 是如何热更新的。 详情参考: 阿里巴巴Arthas实践--jad/mc/redefine线上热更新一条龙 假设我们现在有一个 HelloService 类,逻辑如下,现在我们使用 Arthas 热更新代码,让其输出 hello arthas 。 public class HelloService { public static void main(String[] args) throws InterruptedException { while (true){ TimeUnit.SECONDS.sleep(1); hello(); } } public static void hello(){ System.out.println(

《Java虚拟机原理图解》6、 class文件中的方法表集合--method方法在class文件中是怎样组织的

我是研究僧i 提交于 2019-12-04 13:31:21
0. 前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路。但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给人以形象化的认知,看完之后感觉还是稀里糊涂的。 感于以上的种种,我打算把我在学习JVM虚拟机的过程中学到的东西,结合自己的理解,总结成《Java虚拟机原理图解》 这个系列,以图解的形式,将抽象的JVM虚拟机的知识具体化,希望能够对想了解Java虚拟机原理的的Java程序员 提供点帮助。 读完本文,你将会学到: 1、类中定义的method方法是如何在class文件中组织的 2、method方法的表示-方法表集合在class文件的什么位置 3、 类中的method方法的实现代码---即机器码指令存放到哪了,并初步了解机器指令 4. 为什么没有在类中定义自己的构造函数,却可以使用new ClassName()构造函数创建对象 5. IDE代码提示功能的基本原理 1.概述 方法表集合 是指由若干个 方法表 (method_info) 组成的集合。对于在类中定义的若干个,经过 JVM 编译成 class 文件后,会将相应的 method 方法信息组织到一个叫做 方法表集合 的结构中, 字段表集合 是一个类数组结构,如下图所示: 2. method方法的描述

JVM

雨燕双飞 提交于 2019-12-04 11:07:14
1.Java中垃圾回收有什么目的?什么时候进行垃圾回收? 垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。 2.如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存? 不会,在下一个垃圾回收周期中,这个对象将是可被回收的。 3. GC是什么? 为什么要有GC? GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。 4. 垃圾回收的优点和原理。并考虑2种回收机制。 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有”作用域”的概念,只有对象的引用才有”作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。 5.

Java内存模型

半城伤御伤魂 提交于 2019-12-04 04:18:48
java内存模型划分 废话少说先上图: 1.程序计数器   程序计数器(Program Counter Register),也有称作为PC寄存器。想必学过汇编语言的朋友对程序计数器这个概念并不陌生,在汇编语言中,程序计数器是指CPU中的寄存器,它保存的是程序当前执行的指令的地址(也可以说保存下一条指令的所在存储单元的地址),当CPU需要执行指令时,需要从程序计数器中得到当前需要执行的指令所在存储单元的地址,然后根据得到的地址获取到指令,在得到指令之后,程序计数器便自动加1或者根据转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令。   虽然JVM中的程序计数器并不像汇编语言中的程序计数器一样是物理概念上的CPU寄存器,但是JVM中的程序计数器的功能跟汇编语言中的程序计数器的功能在逻辑上是等同的,也就是说是用来指示 执行哪条指令的。   由于在JVM中,多线程是通过线程轮流切换来获得CPU执行时间的,因此,在任一具体时刻,一个CPU的内核只会执行一条线程中的指令,因此,为了能够使得每个线程都在线程切换后能够恢复在切换之前的程序执行位置,每个线程都需要有自己独立的程序计数器,并且不能互相被干扰,否则就会影响到程序的正常执行次序。因此,可以这么说,程序计数器是每个线程所私有的。   在JVM规范中规定,如果线程执行的是非native方法

深入分析Synchronized原理

一曲冷凌霜 提交于 2019-12-03 20:06:27
前言 记得开始学习Java的时候,一遇到多线程情况就使用synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是, 随着学习的进行我们知道在JDK1.5之前synchronized是一个重量级锁,相对于j.u.c.Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它 。 不过, 随着Javs SE 1.6对synchronized进行的各种优化后,synchronized并不会显得那么重了 。下面来一起探索synchronized的基本使用、实现机制、Java是如何对它进行了优化、锁优化机制、锁的存储结构等升级过程。 大家可以点击加群【JAVA架构知识学习讨论群】 473984645, (如多你想跳槽换工作,但是技术又不够,或者工作遇到了瓶颈,我这里有一个Java的免费直播课程,讲的是高端的知识点,只要有1-5年的开发工作经验可以加群找我要课堂链接。)注意:是免费的 没有开发经验的误入。 1 基本使用 Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。 Synchronized的作用主要有三个 : 原子性 :确保线程互斥的访问同步代码; 可见性 :保证共享变量的修改能够及时可见

手把手教你实现热更新功能,带你了解 Arthas 热更新背后的原理

别来无恙 提交于 2019-12-03 11:29:52
一、前言 一天下午正在摸鱼的时候,测试小姐姐走了过来求助,说是需要改动测试环境 mock 应用。但是这个应用一时半会又找不到源代码存在何处。但是测试小姐姐的活还是一定要帮,突然想起了 Arthas 可以热更新应用代码,按照网上的步骤,反编译应用代码,加上需要改动的逻辑,最后热更新成功。对此,测试小姐姐很满意,并表示下次会少提 Bug。 嘿嘿,以前一直对热更新背后原理很好奇,借着这个机会,研究一下热更新的原理。 二、Arthas 热更新 我们先来看下 Arthas 是如何热更新的。 详情参考: 阿里巴巴Arthas实践--jad/mc/redefine线上热更新一条龙 假设我们现在有一个 HelloService 类,逻辑如下,现在我们使用 Arthas 热更新代码,让其输出 hello arthas 。 public class HelloService { public static void main(String[] args) throws InterruptedException { while (true){ TimeUnit.SECONDS.sleep(1); hello(); } } public static void hello(){ System.out.println("hello world"); } } 2.1、jad 反编译代码 首先运行 jad

Android热修复——深入剖析AndFix热修复及自己动手实现

蓝咒 提交于 2019-12-03 11:29:35
前言 去年写过一篇热修复的文章,那时候刚开始接触,照猫画虎画的还算比较成功。但是那种修复需要重新启动APP,也就是在JAVA层实现的热修复。我们知道目前Android主流的修复还有在Native层实现修复的,就是在Native层替换方法,不用重新启动APP。今天写了个Demo,下面主要分享一下它的主要原理。 1、热修复 目前,热修复的原理主要有两种技术,一是不需要启动APP就能实现修复,在Native层实现的。一种时需要启动APP,在JAVA层实现的。 Native层 :andfix sophix (即时修复 不重启APP) JAVA层 :Tinker robust等(需要启动APP) 出现异常的根源在于方法 我们的程序出现异常(BUG)的根源是什么?为什么会出现异常呢,要出现异常肯定是我们程序中的 某个方法 抛出了异常,所以异常的根源是 方法 。那么我们修复包的目的就是去替换异常的方法所在的包名类名下的方法。我们需要准确的找到这个方法,那么我们怎么去找这个方法呢? 如何替换已经运行的APK ? 是直接替换运行时的APK加载的有bug的类吗?显然不行,因为 Java的懒加载机制,在不启动APP时新类不能替换老的类 。class类只被ClassLoader加载一次,所以已经有bug的类,再不启动APP的情况下我们不能直接再虚拟机中替换。那我们要怎么去做呢

JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

安稳与你 提交于 2019-12-03 02:55:58
这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有 比较大的帮助。 废话不想讲了.入主题: 先了解具体的概念: JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 栈区: 1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。 3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。 方法区: 1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。 2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。 为了更清楚地搞明白发生在运行时数据区里的黑幕,我们来准备2个小道具(2个非常简单的小程序)。 AppMain.java public class AppMain //运行时, jvm 把appmain的信息都放入方法区 { public static void main

[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)(转)

非 Y 不嫁゛ 提交于 2019-12-02 23:10:20
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢. 上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大家. 对于这次跳槽找工作, 我准备了挺长的时间, 其中也收集了很多比较好的笔试 面试题 , 大都是一些常用的基础, 很多都是由于时间原因没有来得及给出答案, 但是题目大都是比较经典实用的, 现在都放到这里, 希望对正处于找工作的博友有一定的帮助. 第一部分: Java基础(此部分面试题题目来自:http://www.hollischuang.com/archives/10 答案是搜集与互联网) (为了方便,我把他们分了类,有一些是必看的,我用!标注,有一些进阶型的我用%标注,有一些需要了解的,我用?标注。) 一:继承、抽象类与接口区别、访问控制(private, public, protected,默认)、多态相关 !1、interface和 abstract class的区别 interface是接口,abstract class是抽象类。 1,语法层次 抽象类中可以拥有任意范围的成员数据,可以定义非抽象方法。而接口中只能拥有静态的不能修改的成员数据,同时所有的方法必须是抽象的。 所以说接口是抽象类的一种特例。 2,跨域不同 a,抽象类是对类的整体进行抽象,包括类的属性和行为