字节码

java虚拟机运行时数据区

China☆狼群 提交于 2019-12-19 04:28:26
1.程序计数器:当前县城之心工单而字节码的行号指示器;字节码解释器工作依赖于他; 线程私有;java方法记录的是正在执行的虚拟机字节码指令的地址;native计数器的值为空; 2.java虚拟机栈:线程私有,生命周期与线程相同;是java方法(字节码)执行的内存模型;每个方法执行对应创建一个栈帧,存储(程序员通常所说的栈),操作栈,动态链接,方法出口等; 局部变量表:内存大小在编译期间分配完成;运行期间不会变化; 局部变量空间slot:long,double占两个,其余占一个; 线程请求的栈深度大于虚拟机允许的抛出栈异常,栈扩展申请不到足够的内存会抛memory异常; 3.本地方法栈: 为虚拟机执行native方法服务;也会抛异常;对本地方法栈中的方法使用的语言,方式,数据结构没有强制规定; 4.java堆(GC) 所有线程共享;存放对象实例,以及数组;虚拟机启动时创建; 相关技术:JIT编译器发展,逃逸分析技术,栈上分配,标量替换优化技术; 是垃圾收集器主要管理区域,通过-xmx -xms进行扩展;物理上不一定连续但逻辑上连续的; 注释:由于现在收集器基本都是采用的分代收集算法,所以Java堆中还可以细分为:新生代和老年代;再细致一点的有Eden空间、From Survivor空间、To Survivor空间等。如果从内存分配的角度看

Java的基本数据类型

≯℡__Kan透↙ 提交于 2019-12-19 03:50:41
1. JDK=Java Development Kit,Java开发工具包。它包括: JRE=Java Runing Environment即Java运行环境 Java工具包:Java的编译器(javac.exe)Java的解释执行器(java.exe) Java的类库(lib) 2. Java源文件(.java文件)经过编译(javac.exe)得到Java字节码(.class)文件,再由解释器 (java.exe)将字节码文件加载到Java虚拟机(JVM),也就是说字节码会在虚拟机上执行,以此 达到跨平台的功能,这样就可以保证了代码的安全性,只需提供字节码,不必开源 3. Java的基本类型: 整数类型:byte,short,int,long。 byte 是 1个字节 (8bits),-128到127 short 是 2个字节 ,-32768到32767 int 是 4个字节 long 是 8个字节 浮点类型:float, 4个字节 双精度浮点型:double, 8个字节 布尔类型:boolean 字符类型:char,char是 2个字节 ,可以存放汉字 int x='a'+'b';System.out.println("x is:"+x);//则将a和b对应的ASCII相加 char y='a'+'b';System.out.println("y is:"+y);/

java语言浅谈

老子叫甜甜 提交于 2019-12-19 03:23:54
java语言特性 简单性 一方面是语法简单,c++纯净版本,无指针伪指针 第二个方面是小能够在小型机器上独立运行 面向对象 Java多继承是接口实现,比c++多继承简单 分布式计算 处理http和ftp之类的tcp、ip直接通过url打开 健壮性 Java采用指针模型能够避免重写内存,损坏数据的可能性 安全性 安全性能好,自带验证机制 体系结构中立 解释虚拟机指令比全速运行机器指令慢得多,但是把频繁使用的字节码序列转换为机器码,热点代码的执行不一定比c++慢,即时编译(Java编译器就是即时编译器) 面向对象 跨平台 多线程 有大量的API拓展 GC jdk/jre/jvm JDK是java开发包,包含jre(java运行时环境),jvm(虚拟机),监控和诊断 java实现了一次编写到处执行,因为jvm向上提供相同的接口,向下提供不同的接口针对不同的操作系统 java执行过程 .java文件编译成.class字节码文件 将.class放入jvm中 java使用类加载器(class-loader)加载.class文件 类加载完毕后,进行字节码校验,通过校验后,通过jvm的解释器,将字节码转换为机器码,交给操作系统执行,java8采用的是半编译,半解释执行,HotSpot JVM内置了JIT complie(动态编译器),能够将热点代码转换为机器码,提高了效率 来源: CSDN 作者:

Java的内存结构

耗尽温柔 提交于 2019-12-18 16:53:39
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Java 的运行时数据区域分为五大数据区域。这些区域各有各的用途,创建及销毁时间。如下图所示,其中方法区和堆是所有线程共享的,栈,本地方法栈和程序虚拟机则为线程私有的。 根据 Java 虚拟机规范, Java 虚拟机管理的内存分为 方法区、堆、虚拟机栈、本地方法栈、程序计数器栈 五大区域。 程序计数器(Program Counter Register) 程序计数器是一块很小的内存空间,它是线程私有的,可以认作为当前线程的行号指示器。 在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。由于 Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,对于一个处理器(如果是多核 CPU 那就是一核)来说,在一个确定的时刻只会执行一条线程中的指令,而一条线程中有多个指令,为了线程切换可以恢复到正确执行位置,每个线程都需有独立的一个程序计数器,不同线程之间的程序计数器互不影响,独立存储。 如果线程执行的是个 Java 方法,那么计数器记录的是虚拟机字节码指令的地址。如果为 native 底层方法,那么计数器为空( Undefined )。这块内存区域是虚拟机规范中唯一没有

jvm系列(二):JVM内存结构

对着背影说爱祢 提交于 2019-12-18 04:25:32
所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问题就会变的非常常见,了解JVM内存也是为了服务器出现性能问题的时候可以快速的了解那块的内存区域出现问题,以便于快速的解决生产故障。 先看一张图,这张图能很清晰的说明JVM内存结构布局。 Java的内存结构: JVM内存结构主要有三大块:堆内存、方法区和栈。堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配; 方法区存储类信息、常量、静态变量等数据,是线程共享的区域,为与Java堆区分,方法区还有一个别名Non-Heap(非堆);栈又分为java虚拟机栈和本地方法栈主要用于方法的执行。 在通过一张图来了解如何通过参数来控制各区域的内存大小 控制参数 -Xms设置堆的最小空间大小。 -Xmx设置堆的最大空间大小。 -XX:NewSize设置新生代最小空间大小。 -XX:MaxNewSize设置新生代最大空间大小。 -XX:PermSize设置永久代最小空间大小。 -XX:MaxPermSize设置永久代最大空间大小。 -Xss设置每个线程的堆栈大小。

Java Jvm运行机制原理

 ̄綄美尐妖づ 提交于 2019-12-18 03:30:28
一:简介 在学习 Java 虚拟机之前,也就是 Jvm 之前,我想大家能够带着问题去学习,这样的话,大家学习起来也会比较有所获! 1. Java 虚拟机( Jvm )是什么? 2.Java 虚拟机是用来干什么的? 3.Java 虚拟机它的体系结构是什么样子的? 4.Java 虚拟机在工作做扮演什么角色? 5.Java 虚拟机在运行时数据区? 二: Jvm 基础概念 Java 虚拟机 (Jvm) 是可运行 Java 代码的假想计算机 Java 虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 在了解 Jvm 之前,大家如果有兴趣的,也可以先去了解下 Java 中的堆和栈,可以观看上一篇: Java 堆和栈的区别 http://blog.csdn.net/u011546655/article/details/52170470 三: Jvm 我们都知道 Java 源文件,通过编译器,能够生产相应的 .Class 文件,也就是字节码文件,而字节码文件又通过 Java 虚拟机中的解释器,也就是前面所有的 Java 虚拟机中的字节码指令集 …. 编译成特定机器上的机器码 也就是如下: 1.Java 源文件 —-> 编译器 —-> 字节码文件 2. 字节码文件 —->Jvm—-> 机器码 每一种平台的解释器是不同的,但是实现的虚拟机是相同的。这也就是 Java

了解JVM内存区域

末鹿安然 提交于 2019-12-18 02:00:00
Java运行时数据区(Java内存区域) 为更好理解Java内存区域,我们首先看一下Java程序的执行过程: Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀)。然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范(Java SE 7版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域。如下图所示: 1 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现), 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令, 分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此

Java的虚拟机内存模型

寵の児 提交于 2019-12-17 18:59:43
JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。 堆: 堆在虚拟机启动时就被创建,是用来存放对象的内存空间,几乎所有的对象都被放在堆中,这是一块线程共享的区域。 在规范中有这样一段描述: 所有的对象实例以及数组都要在堆上分配,但是随着JIT编译器的发展和逃逸分析技术逐渐成熟,栈上分配/标量替 换优化技术将会导致一些微妙的发生,所有的对象都分配在堆上也渐渐变得不是那么绝对了. java堆是垃圾回收机制主要场所,所以堆还可以细分为新生代,老年代,在细分的话就是新生代分为Eden空间/From Survivor空间/To

ASM字节码插桩:QQ空间的热修复解决方案核心技术,安卓程序员的硬通货

[亡魂溺海] 提交于 2019-12-17 11:14:27
一、什么是插桩 QQ空间曾经发布的《热修复解决方案》中利用 Javaassist库实现向类的构造函数中插入一段代码解决 CLASS_ISPREVERIFIED 问题。包括了 Instant Run 的实现以及参照 Instant Run 实现的热修复美团Robus等都利用到了插桩技术。 插桩就是将一段代码插入或者替换原本的代码。字节码插桩顾名思义就是在我们编写的源码编译成字节码(Class)后,在Android下生成dex之前修改Class文件,修改或者增强原有代码逻辑的操作。 我们需要查看方法执行耗时,如果每一个方法都需要自己手动去加入这些内容,当不需要时也需要一个个删去相应的代码。 一个、两个方法还好,如果有10个、20个得多麻烦!所以可以利用注解来标记需要插桩的方法,结合编译后操作字节码来帮助我们自动插入,当不需要时关掉插桩即可。 这种AOP思想让我们只需要关注插桩代码本身。 二、字节码操作框架 上面我们提到QQ空间使用了 Javaassist来进行字节码插桩,除了 Javaassist之外还有一个应用更为广泛的 ASM框架同样也是字节码操作框架,Instant Run包括 AspectJ就是借助 ASM来实现各自的功能。 我们非常熟悉的JSON格式数据是基于文本的,我们只需要知道它的规则就能够轻松的生成、修改JSON数据。 同样的Class字节码也有其自己的规则(格式)。

类加载器、反射

杀马特。学长 韩版系。学妹 提交于 2019-12-17 10:32:26
第1章 类加载器 当你的文件编译的时候会产生class文件,当运行文件的时候class文件会被加载到方法与数据共享区,这个时候,当一进入方法与数据共享区的时候会由 类的加载器 负责在堆里面创建一个对象(字节码文件对象) New的是和这个不一样的,new可以new很多个,但是字节码文件对象我们控制不了,是又累的加载器创建的( 只创建一个 ) 静态同步方法中的锁对象是 类名.class ,因为他优先于静态 1.1 类的加载 l 加载 就是指将class文件读入内存,并为之创建一个Class对象。( 文件字节码 ) 任何类被使用时系统都会建立一个Class对象 l 连接 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值(静态初始化) 解析 将类的二进制数据中的符号引用替换为直接引用( int a=1/a是符号引用,1是直接引用 ) l 初始化 就是我们以前讲过的初始化步骤 1.2 类初始化时机 1. 创建类的实例( new一个类的对象的时候 ) 2. 类的静态变量,或者为静态变量赋值( 访问某个类的静态变量或者给他赋值的时候 ) 这个时候Demo01进内存,Math也进内存,并且创建字节码文件对象( 访问静态 ) 3. 类的静态方法( 只要用到类的静态变量就进内存 ) 4. 使用反射方式来强制创建某个类或接口对应的java.lang