字节码

java入门到精通[java简介]

帅比萌擦擦* 提交于 2020-01-28 04:13:56
java入门到精通[Java简介] Java简介 什么是java语言 Java应用的领域 Java的版本 Java简介 Java是一门高级的面向对象的程序设计语言。使用Java语言编写的程序是跨平台的,从PC机到手持电话,到处都在运行着Java开发的程序和游戏。Java程序可以在任何计算机、操作系统以及支持Java的硬件设备上运。 什么是java语言 Java是1995年由Sun公司推出的一门极富创造力的面向对象的程序设计语言,它是由有"java之父"之称的Sun研究所院士詹姆斯·戈士林博士新手设计而成,正是他完成了Java技术的原始编译器和虚拟机。Java起初的名字叫OAK,在1995年被重新命名为Java,并正式发布。 Java是一种通过解释方式来执行的语言,其语法规则和C++类似。同时,Java也是一种跨平台的程序设计语言。用Java语言编写的程序,可以运行在任何平台和设备上,如跨越IBM个人电脑、MAC苹果计算机、各种微处理硬件平台、以及Windows、UNIX、0S/2、MAC OS等系统平台,真正实现了“一次编写,到处运行”。 Java语言编写的程序既是编译型的,又是解释型的。程序代码经过编译之后转换为一种称为Java字节码的中间语言,Java虚拟机(JVM)将对字节码文件进行解释和运行。编译只进行一次,而解释在每次运行程序时都会进行

day1

限于喜欢 提交于 2020-01-28 00:20:36
学习的知识有点杂乱,今天看的一些面试问题。虽然是重述,但也是通过自己能理解的语言复述,旨在保持一种写博客的习惯,等开始做项目会慢慢记录更多。 (1)java程序运行过程:在java语言开发环境中编写.java文件通过java编译器编译形成.class(字节码),JVM使用类加载器加载.class文件,类加载器完成后,进行字节码检验,字节码检验通过后,JVM解释器会把字节码翻译成机器码交由操作系统执行。 (2)jdk,jre,JVM之间的区别:jdk是java的开发环境(将java文件编译成class文件)与运行环境(解析class文件),jdk中包含了jre,jre是java运行环境,是java的最小运行单元,一般安装服务器上,jre中包含了JVM,jre中有java核心库,JVM具有跨平台特性,屏蔽底层的服务器差异运行一套java程序,JVM是java程序的载体(目前对虚拟机的了解比较浅) 来源: CSDN 作者: 沐之。 链接: https://blog.csdn.net/qq_35449051/article/details/104095114

深入理解JVM:内存区域

a 夏天 提交于 2020-01-27 22:08:42
一、运行时数据区域 Java虚拟机在运行时java程序的时候,会把它所管理的内存划分成若干个不同的数据区域。其中jdk1.8前后版本有差别。 jdk1.8之前: jdk1.8之后: 内存可分为:程序计数器、栈、堆、方法区和直接内存。 整个内存数据区域是属于当前进程的,当前进程拥有所有的资源和数据。而直接内存是所有进程共享的。 其中栈和程序计数器是线程私有的,也就是每一个线程拥有自己独立的区域。互相不干扰。 二、程序计数器 我们的java代码在程序执行之前就被编译成字节码。而这个程序计数器不是我们计算机组成原理的程序计数器(存放的计算机指令地址),而我们的jvm的pc是字节码解释器的指示器。存放的是字节码的地址。如果执行的是java方法,这里存储的就是正在执行的字节码的地址,如果执行的是本地方法存储的就是undefined。 字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完成。 在多线程的环境下,pc还能保证恢复到原来线程的位置。 注意:程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。 三、Java虚拟机栈 描述的是 Java 方法执行的内存模型,每次方法调用的数据都是通过栈传递的。 栈帧:操作数栈 动态链接

代理模式-CGLIB动态代理

自古美人都是妖i 提交于 2020-01-27 03:04:23
1.JDK动态代理是实现了被代理对象的接口,Cglib是继承了被代理对象。 2.JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低。 3.JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法。 CGLIB动态代理 : 使用JDK的Proxy实现代理,要求目标类与代理类实现相同的接口。若目标类不存在接口,则无法使用该方式实现。 但对于无接口的类,要为其创建动态代理类,就要使用CGLIB来实现。CGLIB代理的生成原理是生成目标类的子类,而子类是增强过的,这个子类对象就是代理对象。所以,使用CGLIB生成动态代理,要求目标类必须能够被继承,即不能是final的类。 CGLIB(Code Generation Library)是一个开源项目,是一个强大的、高性能的、高质量的代码生成类库。它可以在运行期扩展喝增强Java类。Hibernate用它来实现持久对象的字节码的动态生成,Spring用它来实现AOP编程。 CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM(Java字节码操控框架)来转换字节码并生成新的类。CGLIB是通过对字节码进行增强来生成代理的。 代理实现与解析: 使用CGLIB创建代理步骤: 步骤1

Java虚拟机——初探字节码class文件内部结构

倾然丶 夕夏残阳落幕 提交于 2020-01-27 01:23:41
之前介绍过Java编译器如何将Java源码编译成字节码class文件。 Java虚拟机——从Java源码到字节码到底经历了什么 那么最终的到的字节码文件是怎样的一个文件,内部结构又是如何?此文对字节码class文件的内部结构进行初步探索,介绍其各个重要组成部分,对之后的Java虚拟机学习做好基础。 下面展示了一个class文件的构成,其中u2、u4等表示类型,分别表示占2、4个字节的数据,属于class文件的基本类型。cp_info表示常量池类型,field表示成员变量类型,method表示类或接口的方法类型,attribute表示属性类型。 ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count - 1]; u2 access_flags; u2 this_class; u2 super_class; u2 interface_count; u2 interfaces[interface_count]; u2 fields_count; field info_fields[fields_count]; u2 methods_count; method info_methods[methods

AOP与IOC区别

你。 提交于 2020-01-26 23:34:08
Spring核心知识 Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。 为什么说Spring是一个一站式的轻量级开源框架呢?EE开发可分成三层架构,针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术。 • WEB层:SpringMVC • 业务层:Spring的IoC • 持久层:Spring的JDBCTemplate(Spring的JDBC模板,ORM模板用于整合其他的持久层框架) 从上面的简要介绍中,我们要知道Spring的核心有两部分: • IoC:控制反转

JVM 的内存模型

折月煮酒 提交于 2020-01-26 18:56:17
为什么要了解? 很多做Android开发的同学会问,我们为什么要了解这个呢?首先移动端资源有限,我们了解jvm的内存模型,便于我们更好的管理客户端的内存。 什么是JVM? java代码的执行过程如下图: 运行时数据区可分为:方法区、堆、虚拟机栈、本地方法栈、程序计数器五个部分。 概述 方法区:线程共享数据,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 堆:线程共享数据,主要是存放对象实例和数组。内部会划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer, TLAB)。可以位于物理上不连续的空间,但是逻辑上要连续。 虚拟机栈:线程隔离数据,每个方法在执行时都会床创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。 本地方法栈:线程隔离数据,区别于 Java 虚拟机栈的是,Java 虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 程序计数器:线程隔离数据,字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成。 1.方法区  

Spark学习之路 (十三)SparkCore的调优之资源调优JVM的基本架构[转]

筅森魡賤 提交于 2020-01-26 18:14:10
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设置每个线程的堆栈大小。 没有直接设置老年代的参数,但是可以设置堆空间大小和新生代空间大小两个参数来间接控制。 老年代空间大小=堆空间大小-年轻代大空间大小 JVM和系统调用之间的关系 方法区和堆是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。 JVM各区域的作用 Java堆(Heap) 对于大多数应用来说,Java堆(Java Heap

java的跨平台原理

梦想的初衷 提交于 2020-01-26 14:53:16
跨平台的实现涉及Java虚拟机(Java Virtual Machine,简称 JVM)。 JVM是一个软件,不同的平台有不同的版本。我们编写的Java代码,编译后会生成 .class 文件(字节码文件)。Java虚拟机负责将字节码文件翻译(转译)成特定平台下的 机器码 然后运行。也就是说,只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行Java程序。 在这个过程中,Java程序没有任何改变,仅仅是通过JVM,就能在不同平台上运行,真正实现了“一次编译,到处运行”。 JVM是实现跨平台的关键。 注意:编译的结果不是生成机器码,而是生成字节码,字节码不能直接运行,必须通过JVM翻译成机器码才能运行。 不同平台下编译生成的字节码是一样的,但是由JVM翻译成的机器码却不一样 。 所以,运行Java程序必须有JVM的支持,因为编译的结果不是机器码,必须要经过JVM的再次翻译才能执行。 跨平台的是Java程序,不是JVM。 来源: CSDN 作者: Reverse train. 链接: https://blog.csdn.net/xylyaya/article/details/103773583

编译系统VS解释系统

旧城冷巷雨未停 提交于 2020-01-26 01:55:01
下面关于解释系统和编译系统的说法中,错误的是() A.解释程序不产生目标代码,直接执行源程序或源程序的内部形式 B.使用编译系统时会区分编译阶段和运行阶段 C.一般来说,解释系统比编译系统复杂,但是可移植性好 D.一般来说,建立在编译基础上的系统执行速度要比建立在解释基础上的系统快 答案是选A, 错在后半部分,并不是直接执行源程序,而是必须要转换为机器可识别码才能运行 C++代码每一次进行更新都需要重新编译,有些大型系统编译一次需要花很长时间,这就对系统的调试带来很多不便,如linux内核,这个是编译系统的一个不足。 下面是对编译型语言和解释型语言介绍: 编译型语言: 编译是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因此其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。但应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件(* .OBJ)才能执行,只有目标文件而没有源代码,修改很不方便。现在大多数的编程语言都是编译型的。编译程序将源程序翻译成目标程序后保存在另一个文件中,该目标程序可脱离编译程序直接在计算机上多次运行。大多数软件产品都是以目标程序形式发行给用户的,不仅便于直接运行,同时又使他人难于盗用其中的技术C、C++、Fortran、Visual Foxpro、Pascal、Delphi、Ada都是编译实现的。 解释型语言: