字节码

JVM_1

喜夏-厌秋 提交于 2019-12-01 05:12:42
这里面加了很多我自己的看法,有啥错误的阔以给我留言一手,多谢您! JAVA虚拟机在执行java程序的时候会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自不同的用途,以及创建和销毁时间. java虚拟机所管理的内存包括以下几个运行时数据区域 Method Area方法区(线程共享) VM Stack虚拟机栈(线程私有) Native Method Stack本地方法栈(线程私有) Heap堆(线程共享) Program Counter Register程序计数器(线程私有) 注意:这几个区域都是JVM管理的运行时数据区,要记住运行时数据区这几个字. 程序计数器(线程私有) 它是一块较小的内存空间, 可以看作是当前线程所执行的字节码的行号指示器,其中的值的数据类型为returnAddress类型 字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码指令的,分支,循环,跳转,异常处理,线程恢复等都需要依赖这个计数器来完成. 为什么说它是线程私有的呢? 因为虚拟机的多线程是通过线程轮流切换并分配处理器时间的方式来实现的,在任何一个确定的时刻,一个处理器都 只会 执行一条线程中的指令,因此,为了保证线程切换后能恢复到正确的执行位置,每条线程都会有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储! 如果当前线程执行的时java方法

Java注解基础

巧了我就是萌 提交于 2019-12-01 00:21:41
Java注解解析 注解,也被成为元数据,为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。—-JAVA编程思想的注解描述。 什么是注解 在JAVA中,我们最常见的有: 123 @Override //当前类的某一个方法重写了父类的方法,当有这个注释但该方法不是父类的时候编译报错@Deprecated //表明这是一个废弃的方法,不提倡使用,可能后续版本去除掉该方法@SuppressWarnings //压制编译警告 我们看一下@Override的定义 1234 @Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public @interface Override {} 这样子就定义了Override这个注解。 注解就是使用一个@进行引用,他可以使用在类,方法,属性上,用于修饰。通过使用注解,我们可以做一些简化的操作,使得程序更加规范,同时也便于管理和编写。 定义注解 定义注解之前,我们需要先了解元注解。 元注解 元注解:就是用来标记自定义注解的注解,是JDK为我们提供的。比如: 1234 @Target@Retention@Documented //表明该注解会被javadoc包含@inherited //表明允许子类继承父类中的注解 其中常用的是下面的两个

Java注解基础

梦想与她 提交于 2019-12-01 00:15:46
Java注解解析 注解,也被成为元数据,为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。—-JAVA编程思想的注解描述。 什么是注解 在JAVA中,我们最常见的有: 123 @Override //当前类的某一个方法重写了父类的方法,当有这个注释但该方法不是父类的时候编译报错@Deprecated //表明这是一个废弃的方法,不提倡使用,可能后续版本去除掉该方法@SuppressWarnings //压制编译警告 我们看一下@Override的定义 1234 @Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public @interface Override {} 这样子就定义了Override这个注解。 注解就是使用一个@进行引用,他可以使用在类,方法,属性上,用于修饰。通过使用注解,我们可以做一些简化的操作,使得程序更加规范,同时也便于管理和编写。 定义注解 定义注解之前,我们需要先了解元注解。 元注解 元注解:就是用来标记自定义注解的注解,是JDK为我们提供的。比如: 1234 @Target@Retention@Documented //表明该注解会被javadoc包含@inherited //表明允许子类继承父类中的注解 其中常用的是下面的两个

Java注解基础

纵饮孤独 提交于 2019-12-01 00:10:27
Java注解解析 注解,也被成为元数据,为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。—-JAVA编程思想的注解描述。 什么是注解 在JAVA中,我们最常见的有: 123 @Override //当前类的某一个方法重写了父类的方法,当有这个注释但该方法不是父类的时候编译报错@Deprecated //表明这是一个废弃的方法,不提倡使用,可能后续版本去除掉该方法@SuppressWarnings //压制编译警告 我们看一下@Override的定义 1234 @Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public @interface Override {} 这样子就定义了Override这个注解。 注解就是使用一个@进行引用,他可以使用在类,方法,属性上,用于修饰。通过使用注解,我们可以做一些简化的操作,使得程序更加规范,同时也便于管理和编写。 定义注解 定义注解之前,我们需要先了解元注解。 元注解 元注解:就是用来标记自定义注解的注解,是JDK为我们提供的。比如: 1234 @Target@Retention@Documented //表明该注解会被javadoc包含@inherited //表明允许子类继承父类中的注解 其中常用的是下面的两个

Java注解基础

与世无争的帅哥 提交于 2019-12-01 00:09:31
Java注解解析 注解,也被成为元数据,为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。—-JAVA编程思想的注解描述。 什么是注解 在JAVA中,我们最常见的有: 123 @Override //当前类的某一个方法重写了父类的方法,当有这个注释但该方法不是父类的时候编译报错@Deprecated //表明这是一个废弃的方法,不提倡使用,可能后续版本去除掉该方法@SuppressWarnings //压制编译警告 我们看一下@Override的定义 1234 @Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public @interface Override {} 这样子就定义了Override这个注解。 注解就是使用一个@进行引用,他可以使用在类,方法,属性上,用于修饰。通过使用注解,我们可以做一些简化的操作,使得程序更加规范,同时也便于管理和编写。 定义注解 定义注解之前,我们需要先了解元注解。 元注解 元注解:就是用来标记自定义注解的注解,是JDK为我们提供的。比如: 1234 @Target@Retention@Documented //表明该注解会被javadoc包含@inherited //表明允许子类继承父类中的注解 其中常用的是下面的两个

1.1 Java程序是如何执行的?

浪子不回头ぞ 提交于 2019-11-30 23:35:41
本节从整体来看一下Java中的精髓. Java介绍 略 Java和JDK的关系 JDK(Java Development Kit) Java开发工具包,它包括:编译器,Java运行环境(JRE, Java Runtime Environment), JVM(Java虚拟机),监控和诊断工具等,而Java则表示一种开发语言. Java程序是怎么执行的? 先把Java代码编译成字节码,也就是把 .java类型的文件编译成 .class类型的文件.这个过程的大致执行流程: Java源代码 -> 词法分析器 -> 语法分析器 -> 语义分析器 -> 字节码生成器 ->最终生成字节码,其中任何一个节点执行失败就会造成编译失败; 把class文件放置到Java虚拟机,这个虚拟机通常指的是Oracle官方自带的Hotspot JVM; Java虚拟机使用类加载器(Class Loader)装载class文件; 类加载完成之后,会进行字节码校验,字节码校验通过JVM解释器会把字节码翻译成机器码交由操作系统执行.但不是所有代码都是解释执行的,JVM对此做了优化, 比如, 以Hotspot虚拟机来说, 它本身提供了JIT (Just In Time)也就是我们通常所说的动态编译器,它能够在运行时将热点代码编译成机器码,这个时候字节码就变成了编译执行. Java程序执行流程图如下:

java相关

廉价感情. 提交于 2019-11-30 22:47:05
---恢复内容开始--- 1.JDK的下载与安装:   www.oracle.com   安装需要注意的是:不能把jdk安装到有空格或中文的文件夹中,建议大家在某个目录下创建一个JavaWeb的文件夹,然后把所学的java所有内容(后面会学习到大量的开源及第三方组件技术)都安装到该目录下     例如:c:\JavaWeb\Java\jdk1.8\... 2.配置环境变量:   为什么要配置path环境变量:为了在任何路径下都可以使用(让电脑可以解析该命令)jdk中给我们提供的命令,如java编译命令:javac,java的解释执行命令:java,打包命令jar等    JAVA_HOME:C\JavaWeb\Java\jdk1.8   PATH:%JAVA_HOME%\bin;.......   CLASSPATH:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib;   .代表当前路径 bin中存放的是2进制文件,如可执行文件以及相关指令; lib是类库 开发和运行需要用到  JVM(JAVA VIRTUAL MACHINE)Java虚拟机            JRE(JAVA RUNTIME ENVIROMENT)Java运行环境            JDK(JAVA DEVELOPMENT

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个。在进入一个方法的时候,这个方法需要在帧中分配多大的局部空间是完全确定的,在方法运行期间不会发生大小更改。 异常情况

Java I/O : Java中的进制详解

依然范特西╮ 提交于 2019-11-30 19:44:50
作者: 李强强 上一篇,泥瓦匠基础地讲了下 Java I/O : Bit Operation 位运算 。这一讲,泥瓦匠带你走进Java中的进制详解。 一、引子 在Java世界里,99%的工作都是处理这高层。那么二进制,字节码这些会在哪里用到呢? 自问自答:在 跨平台 的时候,就凸显神功了。比如说 文件读写 , 数据通信 ,还有Java编译后的 字节码文件 。下面会有个数据通信的例子哦。 Java对对象实现 Serializablle 接口,就可以将其转化为一系列 字节 ,而在通信中,不必要关系数据如何在不同机器表示和字节的顺序。这里泥瓦匠对 Serializablle 接口,不做详细讲解,以后单独详解。 二、Java进制转换 首先认识下Java中的 数据类型 : 1、Int整型:byte(8位,-128~127)、short(16位)、int(32位)、long(64位) 2、Float型:float(32位)、double(64位) 2、char字符:unicode字符(16位) 也就是说, 一个int等价于长度为4的字节数组。 Java中进制如何转换呢? 在Java中,Int整形以及char字符型 被包装的类 中提供了一系列的 操作方法 。比如 java.lang.Integer 中 , api如图所示 : 下面泥瓦匠写个demo,验证下。 package javaBasic

第二章:JVM基本结构图

匆匆过客 提交于 2019-11-30 19:40:32
①JVM基本结构图 ② 1.类加载子系统 负责从文件系统或网络中加载Class信息 2.方法区 存放加载的类信息,jdk1.7之前称为永久代(Perm),1.8之后为元数据区(Metaspace) ☞也称”永久代” ,它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。 ☞运行时常量池:是方法区的一部分,其中的主要内容来自于JVM对Class的加载。 ☞Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中。 3.Java堆 在虚拟机启动时建立,几乎所有的Java对象实例都存在堆中,所有线程共享 ☞GC堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,在JVM启动时创建。 ☞其大小通过-Xms(最小值)和-Xmx(最大值)参数设置,-Xms为JVM启动时申请的最小内存,-Xmx为JVM可申请的最大内存。 ☞由于现在收集器都是采用分代收集算法,堆被划分为新生代和老年代。新生代由S0和S1构成,可通过-Xmn参数来指定新生代的大小。 ☞所有对象实例以及数组都在堆上分配。 ☞Class文件中除了有类的版本、字段、方法、接口等描述信息外