字节码

记一次使用修改字节码的方法解决java.lang.NoSuchMethodError

时光毁灭记忆、已成空白 提交于 2020-03-09 07:43:18
接兔兔国际sdk ane 充值界面选择兔币充值就会闪退, 观察logcat ,NoSuchMethodError: com.tutu.common.a.b.getContext 原来是因为没有方法找不到 04-19 10:10:54.224: E/AndroidRuntime(20315): FATAL EXCEPTION: main 04-19 10:10:54.224: E/AndroidRuntime(20315): Process: com.tutusdk.global.demo, PID: 20315 04-19 10:10:54.224: E/AndroidRuntime(20315): java.lang.NoSuchMethodError: com.tutu.common.a.b.getContext 04-19 10:10:54.224: E/AndroidRuntime(20315): at com.tutu.common.a.b.a(TutuAlertDialog.java:78) 04-19 10:10:54.224: E/AndroidRuntime(20315): at com.tutu.common.a.b.onCreateView(TutuAlertDialog.java:66) 04-19 10:10:54.224: E

jvm02

风格不统一 提交于 2020-03-09 05:16:50
java虚拟机内存管理 每个线程就是一个顺序的执行单元,线程共享区即多个线程共享同一块区域,线程独占区即每个线程都有自己的虚拟机栈,本地方法栈,程序计数器。 程序计数器是一个比较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器,位于线程独占区,如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果执行的是native方法,计数器的值为underfined Java虚拟机栈 虚拟机描述的是java方法执行的动态内存模型 栈帧 每个方法执行,都会创建一个栈帧,伴随着方法从创建到执行完成,用于存储变量表,操作数栈,动态链接,方法出口等。 局部变量表 存储编译期可知的各种基本数据类型,引用类型,returnAddress类型, 局部变量表的内存空间在编译期完成分配,当进入一个方法,这方法需要在帧分配多少内存是固定的,在方法运行期是不会改变局部变量表的大小(存储的只是对象的引用) 1 public class Demo { 2 3 public void tes() { 4 System.out.println("方法执行...."); 5 tes(); 6 } 7 8 public static void main(String[] args) { 9 new Demo().tes(); 10 11 } 12 13 } 方法执行.... 方法执行.

JVM内存模型

我的梦境 提交于 2020-03-09 01:01:39
JVM的内存划分: 方法区: 是线程共享的,常量静态变量的JIT(即时编译器)编译后代码也在方法区存放。用来 存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。 虽然Java虚拟机规范把方法区描述为堆得一个逻辑部分,但是他却有个别名Non-Heap(非堆),目的是为了与Java堆区分。 堆内存: 是 线程共享的,垃圾回收的主要场所 。Java虚拟机所管理的 内存最大的一块 ,在 虚拟机启动时创建。 此内存区域的 唯一目的就是存放对象实例 (也就是new出来的),几乎所有的对象实例以及数组都在这里分配。Java堆是垃圾收集管理器的主要区域,因此也被称作GC堆。 程序计数器: 当前线程执行的字节码的位置指示器。是一块较小的内存空间,可以看做是 当前线程所执行的符号指示器。 两个主要作用: 字节码解释器通过改变程序计数器来一次读取指令,从而实现代码的流程控制,如:顺序执行,选择,循环,异常处理。 在多线程的情况下,程序计数器用于记录当前程序执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行的位置。 注意: 程序计数器是 唯一一个不会出现OutOfMemoryError的内存区域 ,他的生命周期随着现成的创建而创建,随着线程的结束而死亡。 Java虚拟机(栈内存): 保存局部变量,基本数据类型以及堆内存中对象的引用变量。是线程私有的

JVM,DVM虚拟机

允我心安 提交于 2020-03-09 00:44:59
Java虚拟机–JVM,类加载器,双亲委派 https://www.iteye.com/blog/welcome66-2216572 1、JVM(Java Virtual Machine),java虚拟机 JVM就是虚拟出来的计算机,有自己完善的架构,处理器,堆栈,寄存器,指令系统。使用jvm就是为了支持与操作系统无关,java跨平台的原理,因为java代码都在这上运行, .java 文件通过javac命令编译后生成. class 字节码文件,JVM的java解释器负责把.class字节码文件转化为特定的机器码文件运行。 1.进程级别,守护线程和非守护线程(用户线程) 守护线程:后台线程,为前台线程提供便利服务,比如GC线程。不要在守护线程中执行业务逻辑操作(比如对数据的读写等)。 非守护线程:前台线程 设置守护线程: public final void setDaemon ( boolean on ) 判断守护线程: public final boolean isDaemon ( ) 2.生命周期: 启动:启动java是开启,起点是public static void main 运行:main起点,两种线程:守护线程(JVM),非守护线程(JAVA),java也可以创建自己的守护线程 消亡:程序终止则退出,也可以用System.exit或Runtime类来退出 3.体系结构

JVM初识

瘦欲@ 提交于 2020-03-08 11:28:00
###JVM初体验 基本概念:JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。 JVM大致可分为三部分 1.Java代码的执行 代码执行也可以分为三个过程 代码编译为class,命令javac 转载class,命令ClassLoader 执行class,亦可分为解释执行与编译执行两部分,编译执行可分为client complier与server compiler 2.内存管理 内存管理大致分为四个部分 内存空间:包含方法区、堆,本地方法栈、pc寄存器 内存分配:有堆上分配、TLAB分配、栈上分配 内存回收:1.用到的算法有:Copy、Mark-Sweep、Mark-Compact,2.sun jdk的分代回收可分为:新生代可用的GC、Minor GC触发机制以及日志格式、旧生代可用的GC、Full Gc触发机制以及日志格式 内存状况分析:jconsole、visualvm、jstat、jmap、MAT 3.线程资源同步与交互机制 线程资源同步:可分为线程资源执行机制和线程资源同步机制,线程资源同步机制:Sychronized的实现机制,lock/unlock实现机制 线程交互机制:Object.wait/notify/notifyall

Unsupported major.minor version 49.0的错误解决

岁酱吖の 提交于 2020-03-08 05:15:21
Unsupported major.minor version 49.0的错误解决 Posted on 2011-01-14 16:49 chinaifne 阅读( 15840) 评论( 0) 编辑 收藏 在装2个不同版本JDK时遇到了这个问题,在网上钩了一吧!查到一个讲解比较好的资料。 一:要解决的问题 我们在尝鲜 JDK1.5 的时候,相信不少人遇到过 Unsupported major.minor version 49.0 错误,当时定会茫然不知所措。因为刚开始那会儿,网上与此相关的中文资料还不多,现在好了,网上一找就知道是如何解决,大多会告诉你要使用 JDK 1.4 重新编译。那么至于为什么,那个 major.minor 究竟为何物呢?这就是本篇来讲的内容,以使未错而先知。 我觉得我是比较幸运的,因为在遇到那个错误之前已研读过《深入 Java 虚拟机》第二版,英文原书名为《Inside the Java Virtual Machine》( Second Edition),看时已知晓 major.minor 藏匿于何处,但没有切身体会,待到与 Unsupported major.minor version 49.0 真正会面试,正好是给我验证了一个事实。 首先我们要对 Unsupported major.minor version 49.0 建立的直接感觉是:JDK1.5

(十八)属性表

偶尔善良 提交于 2020-03-08 03:29:16
一、概念 上一章节讲述了方法表,方法体的内容就存放在属性表的“Code”中,如下图。 在Class文件、字段表和方法表都可以携带自己的属性信息,这个信息用属性表进行描述,用于描述某些场景专有的信息。 与Class文件中其它数据项对长度、顺序、格式的严格要求不同,属性表集合不要求其中包含的属性表具有严格的顺序,并且只要属性的名称不与已有的属性名称重复,任何人实现的编译器可以向属性表中写入自己定义的属性信息。虚拟机在运行时会忽略不能识别的属性,为了能正确解析Class文件,虚拟机规范中预定义了虚拟机实现必须能够识别的9项属性。 二、Code 属性 java程序方法体中的代码 经过javac编译器处理后,最终变为字节码指令 存储在Code 属性内。 Code属性出现在方法表的属性集合中,抽象类和接口不存在code属性。 code属性是class类文件中最重要的属性。class文件可以分为代码(code,方法体里面的Java代码)和元数据(Metadata,包括类,字段,方法定义及其他信息)两部分,code属性描述代码,其他数据项都用于描述元数据。 以上一章节的代码为例: public class Test { private int getAge(int userId){ return 10; } public Object getUserName(String sex,Object

jvm学习006 jvm内存结构分配

穿精又带淫゛_ 提交于 2020-03-07 06:13:10
主要内容如下: JVM启动流程 JVM基本结构 内存模型 编译和解释运行的概念 一、JVM启动流程: JVM启动时,是由java命令/javaw命令来启动的。 二、JVM基本结构: JVM基本结构图: 《深入理解Java虚拟机(第二版)》中的描述是下面这个样子的: Java中的内存分配: Java程序在运行时,需要在内存中的分配空间。 为了提高运算效率,就对数据进行了不同空间的划分 ,因为每一片区域都有特定的处理数据方式和内存管理方式。 具体划分为如下 5个内存空间 :(非常重要) 栈 :存放 局部变量 堆 :存放所有 new出来的东西 方法区:被虚拟机加载的类信息、常量、静态常量等。 程序计数器(和系统相关) 本地方法栈 1、程序计数器: 每个线程拥有一个PC寄存器 在线程创建时创建 指向下一条指令的地址 执行本地方法时,PC的值为undefined 2、方法区: 保存装载的类信息   类型的常量池   字段,方法信息   方法字节码 通常和永久区(Perm)关联在一起 3、堆内存: 和程序开发密切相关 应用系统对象都保存在Java堆中 所有线程共享Java堆 对分代GC来说,堆也是分代的 GC管理的主要区域 现在的GC基本都采用分代收集算法,如果是分代的,那么堆也是分代的。如果堆是分代的,那堆空间应该是下面这个样子: 上图是堆的基本结构,在之后的文章中再进行详解。 4、栈内存:

京东资深架构带你深入理解JVM高级特性+最佳实践

允我心安 提交于 2020-03-06 17:25:56
本人免费整理了Java高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,需要自己领取。 传送门: https://mp.weixin.qq.com/s/osB-BOl6W-ZLTSttTkqMPQ 前言 Java是目前用户最多、使用范围最广的软件开发技术之一。Java 的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java API、Java 编程语言及许多第三方Java框架(如Spring.Struts等)构成。在国内,有关JavaAPI、Java语言语法及第三方框架的技术资料和书籍非常丰富,相比之下,有关Java虚拟机的资料却显得异常贫乏。 这种状况在很大程度上是由Java开发技术本身的一个重 要优点导致的:在虚拟机层面隐藏了底层技术的复杂性以及机器与操作系统的差异性。运行程序的物理机器的情况千差万别,而Java虚拟机则在千差万别的物理机上建立了统-的运行平台,实现了在任意一 台虚拟机上编译的程序都能在任何一台虚拟机上正常运行。这-极大优势使得Java应用的开发比传统CC++应用的开发更高效和快捷,程序员可以把主要精力集中在具体业务逻辑上,而不是物理硬件的兼容性上。在一般情况下,一个程序员只要了解了必要的JavaAPI. Java 语法

JVM内存结构

空扰寡人 提交于 2020-03-06 16:22:27
java程序运行 java源文件,通过编译器,能够生产响应的.class文件,也就是字节码文件,而字节码文件通过java虚拟机中的解释器,编译成特定机器上的机器码 过程 : java源文件 ----> 编译器 ---->字节码文件 ----->JVM ----> 机器码 每一个平台的解释器是不同的,但是实现的虚拟机是相同的,这就是java能够跨平台的原因,当一个程序开始运行,这是虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享 JVM内存区域 程序计数器(线程私有) 记录的是虚拟机字节码指令的地址,每个线程都有一个独立的程序计数器。 这个内存区域是唯一一个在虚拟机中没有任何OutOfMemoryError情况的区域 虚拟机栈(线程私有) 每一个方法在执行的时候都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接、方法返回值等信息。方法被调用,栈帧入栈,方法执行完毕,栈帧出栈。 栈帧 :随方法调用而创建,随方法结束而销毁,无论方法时正常完成还是异常抛出都算方法结束 操作数栈 :主要是方法中计算的部分,会进入操作数栈,计算的数值出栈,计算完成之后再将结果返回栈中。 本地方法区(线程私有) 区别于细腻基站为执行java方法服务,而本地方法区则为Native方法服务。 native方法