字节码

Java语言概述

筅森魡賤 提交于 2020-02-08 06:19:48
1、Java语言初探 JRE : java运行时环境; JDK : Java开发工具; JVM : java 虚拟机; Java和C++的区别: (读下计算机编译原理) C++和C是编译型语言--->静态编译成机器可执行的机器码 Java是解释型的语言--->先生成一个.class的字节码--->解析成机器码 (关于面向对象) C++是可以多继承;Java只能单继承;但是Java提供了可以实现多个接口的功能来对对象的功能进行扩展 (关于生态圈) Java的生态圈比较成熟所以基本上引用框架就好了,但是C++里面的话基本上还是好多需要自己去实现。 2、Java语言特点 1)面向对象:封装,继承和多态。 2)平台无关性:Java语言是靠Java虚拟机(JVM)在目标代码级实现平台无关性的,可以说,JVM是Java平台无关的基础。 3)分布式:(有待深入了解做详细介绍) 4)生态圈比较成熟。 3、再次复习面向对象 封装:保护内部信息。 继承:复用,共性,特性。 (抽象类 VS 接口) 抽象类:只是部分的抽象;可以不包含或者仅包含部分抽象的方法;可以有默认的方法实现; 接口:完全的抽象;全部方法均为抽象方法;不存在默认方法的实现; 多态: Java中的多态实现: 1、方法重写 2、向上转型 3、动态链接 做道题试试~ 4、Java虚拟机 大部分计算机语言都必须先经过编译或解释的操作后

Java基础学习 —— 第一章 Java概述

丶灬走出姿态 提交于 2020-02-08 06:15:04
一、Java程序的运行机制   Java语言是一种特殊的高级语言、它既具有解释性语言的特征、也具有编译型语言的特征,因为Java程序要经过先编译后解释两个步骤。用Java语言编写的程序先经过编译步骤,但是这个编译步骤并不会生成特定平台的机器码,而是生成一种与平台无关的字节码(也就是*.class文件)。当然,这种字节码不是可执行性的,必须使用Java解释器来解释执行。   Java语言里负责解释执行字节码文件的是Java虚拟机,即JVM(Java Virtual Machine)。 二、开发Java的准备   在开发Java程序之前,必须先完成一些准备工作,也就是在计算机上安装并且配置Java开发环境,开发Java程序需要安装和配置JDK(Java SE Development Kit 即Java标准版开发包),JDK提供了编译、运行Java程序所需要的各种工具和资源,包括Java编译器、Java运行时环境(JRE)、以及常用的Java类库等。   配置PATH环境变量:虽然我已近在计算机中安装了JDK,而JDK的安装路径下也包含了编译命令java和解释执行命令javac两个命令,但是计算机不知道去哪里找这两个命令,所以我们需要配置Path环境变量(变量值就是一系列路径),Windows操作系统根据Path环境变量来查找命令。   在JDK1.4以前的JDK版本中

Java--基础知识之JVM

走远了吗. 提交于 2020-02-08 01:34:21
一、什么是JVM 1、概念 JVM,即Java Virtual Machine(Java虚拟机),是Java和的核心和基础,是在Java编译器和操作系统平台间的虚拟处理器。JVM是利用软件方法实现的抽象的、计算机基于下层的操作系统和硬件平台可以在上面执行Java程序的字节码程序。 2、特点 JVM有完善的硬件架构(如处理器、堆栈、寄存器),其存在是为了支持与操作系统无关,实现Java跨平台。 3、Java的跨平台性 真正跨平台的是Java程序而非JVM。不同平台下安装了不同版本的JVM。编写的Java源码在编译后生成class文件(字节码文件),JVM是负责将这些字节码文件翻译成特定平台下的机器码然后运行,即在不同平台下安装对应的JVM,就可以运行编写的Java程序。而这个过程中Java程序没有做任何改变,只是通过JVM在不同平台上运行罢了,可以说是“一次编译,多处运行”。 4、启动与消亡 JVM负责运行一个Java程序,当启动一个Java程序时,也产生一个虚拟机实例,当程序关闭时这个虚拟机实例也消亡。 JVM运行起点:Java虚拟机实例通过调用某个初始类的main方法来运行Java程序,这个main方法是共有的、静态的、返回值为void类型,并传入一个字符串数组作为参数。 5、两种线程 (1)守护线程:通常由虚拟机自己使用,比如执行垃圾收集任务的线程

内存模型以及分区,需要详细到每个区放什么

时光毁灭记忆、已成空白 提交于 2020-02-07 19:19:19
内存模型以及分区,需要详细到每个区放什么 整个计算机的内存中的一部分划给了Java程序管理,在执行Java程序的时候,虚拟机会将这部分内存划分为不同区域,都有各自的用途以及生命周期。 分区:程序计数器、虚拟机栈、本地方法栈、堆、方法区(包含运行时常量池) 程序计数器(PCR)它可以看作是当前线程所执行的字节码的行号指示器。字节码工作器是通过改变这个计数器的值来获取下一条需要执行的字节码,线程中的很多基础功能都通过这个步骤来实现。 程序计数器中放置的是当前正在执行的虚拟机字节码指令的地址,如果正在执行的是Native方法,那么计数器中的值则为空(Undefined)。 虚拟机栈,是描述Java方法执行的内存模型。虚拟机栈中存放的是栈帧,栈帧中存储有局部变量表、操作数、方法接口等信息。 本地方法栈和虚拟机栈类似,不同点在于虚拟机栈是为字节码服务的,本地方法栈是为Native方法服务的。并且虚拟机规范对本地方法栈没有强制规定,可以按需求自由实现。 堆是存放对象实例的地方,它是Java程序管理的内存中最大的一块,内存回收是这一块中经常发生的事情,为了方便回收与分配,这一块内存通常会被划分成不同区域。 方法区是存放被虚拟机加载的类信息、常量、静态变量等数据。其中常量被放在一个叫运行时常量池的地方。这里存放的是各种字面量和符号引用。 来源: https://www.cnblogs.com

晚期(运行期)优化

对着背影说爱祢 提交于 2020-02-07 17:40:34
一、概述 部分商用虚拟机中,Java程序最初通过解释器进行解释执行,当虚拟机发现 某个方法或代码块的运行特别频繁 时,就会把这些代码认定为" 热点代码 "。 为了提高热点代码的执行效率,在运行时,虚拟机将会 把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化 ,完成这个任务的编译器称为 即时编译器 二、HotSpot虚拟机内的即时编译器 2.1 解释器与编译器   事实上,现在许多主流的商用虚拟机,如HotSpot、J9等,都同时包含有解释器与编译器。解释器与编译器两者各有优势: 当程序需要快速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行 在程序运行后,随着时间推移编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获得更高的执行效率。 当程序运行环境中内存限制较大时,可以使用解释执行节约内存,反之可以使用编译执行提高效率 同时,解释器还可以作为编译器激进优化时的一个“逃生门”,让编译器根据概率选择一些大多数时候都能提升运行速度的优化手段,当激进优化的假设不成立,如加载了新类后类型继承结构出现变化、出现罕见陷阱时可以通过逆优化退回到解释状态继续执行(部分没有解释器的虚拟机中也会采用不进行激进优化的C1编译器担任“逃生门”的角色)。因此,解释器与编译器经常配合工作,如下图所示: 2.1.1 Client Compiler 与 Server

java字节码操作

你离开我真会死。 提交于 2020-02-07 09:28:01
实现java动态性的两种做法:1,反射,2,字节码操作 两者相辅相成,并不孤立。 字节码操作比反射更加有性能优势。 *********************** 字节码操作的作用:1,动态生产新的类 ,2 改变类的结构; ********************** 字节码操作的四个类库 1. BCEL 2.ASM 3.CGLIB 4.Javassist 最常用 来源: CSDN 作者: fire-fire-fox 链接: https://blog.csdn.net/wangrong111222/article/details/104174004

Java重排序

笑着哭i 提交于 2020-02-07 01:35:23
之前听公司讲座说到的设计模式,经典的懒汉式单例模式会有重排序问题,当时不是很理解,后来深入学了JVM终于恍然大悟,这里做个总结分享。 重排序排序的就是操作指令的顺序,改变了指令的执行顺序。重排序首先要知道字节码.class文件,它就是JavaC编译后的那个字节码文件,它里面有操作指令的执行顺序,程序计数器就是根据字节码的操作指令的顺序进行寻址查找属性和方法进行操作。JVM会自行判断,把速度快的逻辑简单的代码先执行。 但是有的情况下,JVM会自己对执行指令进行一些优化,比如我们知道for循环重复读取一个值,它会直接从缓存中读取,这时候值就算发生改变JVM也没及时发现。就要加volatile关键字修饰那个属性值,volatile关键字简单来说,就是不让JVM进行优化。 重排序问题也是JVM做的优化,但是变成了好心做坏事。 比如单例模式下,我们都知道创建对象过程中,分配空间是在加载阶段,而里面有什么属性什么方法,都是初始化阶段才有的。JVM优化后就可能直接return了一个全部是null的只是分配了内存空间但是没有初始化的对象。 来看简单的懒汉式单例模式例子: public class Singleton { private static Singleton instance ; private Singleton ( ) { } public static synchronized

javaweb-codereview 学习记录-5

会有一股神秘感。 提交于 2020-02-06 21:33:29
1.关于URLConnection 应用程序利用url与远程通信的所有类的超类 jdk1.8中支持的协议包括以上这些,gopher在jdk8中取消了。 java中默认对(http|https)做了一些事情,比如: 默认启用了透明NTLM认证 默认跟随跳转 httpURLconnection可能jdk7低版本可能在win机器上导致ntlmrelay攻击 https://zhuanlan.zhihu.com/p/64889695 使用URLconnection的子类可能只适合http|https,对ssrf也有一定的限制 HttpURLConnection HttpClient Request okhttp 2.关于java agent Java中 Instrumentation(Java Agent API) 和 JVMTI(JVM Tool Interface) 功能, 允许 JVM 在加载某个 class文件 之前对其字节码进行修改,同时也支持对已加载的 class(类字节码) 进行重新加载( Retransform ),rsap和iast都基于这个功能实现动态修改java字节码来插入检测代码 java agent的两种运行模式: 1.直接在命令添加运行参数 -javaagent(Instrumentation API实现方式)或-agentpath/ -agentlib

1、Python的初识与简介

拥有回忆 提交于 2020-02-06 05:15:00
1、Python的介绍   Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。   Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议[2] 。   Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。   Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中[3] 有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。     Python的出现,让程序员极大的减少了开发成本。 2、Python与其它语言的对比    C 和 Python、Java、C#等 C语言: 代码编译得到 机器码 ,机器码在处理器上直接执行,每一条指令控制CPU工作 其他语言: 代码编译得到 字节码 ,虚拟机执行字节码并转换成机器码再后在处理器上执行

Python.0001.初步了解

帅比萌擦擦* 提交于 2020-02-06 02:30:36
简介 Python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。 2018年3月,该语言作者在邮件列表上宣布Python 2.7将于2020年1月1日终止支持。用户如果想要在这个日期之后继续得到与Python 2.7有关的支持,则需要付费给商业供应商。 趋势 在TIOBE排行榜上,Python整体呈上升趋势,反映出Python应用越来越广泛并且也逐渐得到业内的认可!!! https://www.tiobe.com/tiobe-index/ 应用 Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等。互联网公司广泛使用Python来做的事一般有: 自动化运维、自动化测试、大数据分析、爬虫、Web 等 。 注:上述重点字体表示该公司主要使用Python语言开发 种类 CPython:Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件