字节码

深入分析Java的编译原理

北城余情 提交于 2020-02-21 04:17:46
在《 Java代码的编译与反编译 》中,有过关于Java语言的编译和反编译的介绍。我们可以通过 javac 命令将Java程序的源代码编译成Java字节码,即我们常说的class文件。这是我们通常意义上理解的编译。 但是,字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令。这个过程是Java虚拟机做的,这个过程也叫编译。是更深层次的编译。 在编译原理中,把源代码翻译成机器指令,一般要经过以下几个重要步骤: 根据完成任务不同,可以将编译器的组成部分划分为前端(Front End)与后端(Back End)。 前端编译主要指与源语言有关但与目标机无关的部分,包括词法分析、语法分析、语义分析与中间代码生成。 后端编译主要指与目标机有关的部分,包括代码优化和目标代码生成等。 我们可以把将 .java 文件编译成 .class 的编译过程称之为前端编译。把将 .class 文件翻译成机器指令的编译过程称之为后端编译。 Java中的前端编译 前端编译主要指与源语言有关但与目标机无关的部分,包括词法分析、语法分析、语义分析与中间代码生成。 我们所熟知的 javac 的编译就是前端编译。除了这种以外,我们使用的很多IDE,如eclipse,idea等,都内置了前端编译器。主要功能就是把 .java 代码转换成 .class 代码。 词法分析 词法分析阶段是编译过程的第一个阶段

第二章01:Hello world 案例

柔情痞子 提交于 2020-02-20 12:44:33
java程序开发  =  三部曲  源文件+编译器+字节码文件+解释器=结果 源文件:编写Java源文件(我们也称之为源代码文件),它的扩展名为.java; 编译:然后通过编译器把源文件编译成字节码文件,字节码文件扩展名为.class; 运行:最后使用解释器来运行字节码文件 源代码编写 public  =  公共的 class  =  类 {}  =  程序只能写在大括号里面 主方法  =  程序的入口点  =  固定的 下面是完整的内容: HelloWorld.java public class HelloWorld { public static void main(String[] args) { System. out .println("HelloWorld"); } } 注意,大家在编写源代码时一定要注意大小写。总而言之,一模一样就对了。 下面我们对源代码进行解析,HelloWorld案例的源代码一共分为三个部分,分别是: 类 、 主方法 ,以及 输出语句 。   类是最外层的部分,其中public class是必须要写的命令,其中HelloWorld是类名称,要求必须与源文件名称相同。因为我们的源文件名称为HelloWorld.java,所以类名称必须是HelloWorld。类有一对大括号,类的内容存放在这对大括号中。你可能会问什么是类,我的答案是先不要去管什么是类

spring boot 2.0之后默认的连接池 HIkariCP介绍

£可爱£侵袭症+ 提交于 2020-02-20 10:59:24
  HIkariCP链接池比之传统的Tomcat JDBC datasource 、c3p0 datasource 等传统链接池优势太大,在获取链接释放链接,执行效率上面高出很多,这个产品的口号是“快速、简单、可靠”。 官网详细地说明了HikariCP所做的一些优化,总结如下: 字节码精简 :优化代码,直到编译后的字节码最少,这样,CPU缓存可以加载更多的程序代码; 优化代理和拦截器:减少代码,例如HikariCP的Statement proxy只有100行代码,只有BoneCP的十分之一; 自定义数组类型(FastStatementList)代替ArrayList:避免每次get()调用都要进行range check,避免调用remove()时的从头到尾的扫描; 自定义集合类型(ConcurrentBag:提高并发读写的效率; 其他针对BoneCP缺陷的优化,比如对于耗时超过一个CPU时间片的方法调用的研究(但没说具体怎么优化) HikariCP为什么这么快   JDBC连接池的实现并不复杂,主要是对JDBC中几个核心对象Connection、Statement、PreparedStatement、CallableStatement以及ResultSet的封装与动态代理。接下来从几个方面来看看HikariCP为什么这么快:   优化并精简字节码  

2020春招——JVM复习总结篇

≡放荡痞女 提交于 2020-02-19 05:00:40
一. 基本概念: JVM是可运行Java代码的假想计算机 ,包括一套字 节码指令集、一组寄存器、一个栈、一个垃圾回收堆 和 一个存储方法域 。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。 二. 运行过程: 我们都知道 Java 源文件,通过编译器,能够生产相应的.Class 文件,也就是字节码文件,而字节码文件又通过 Java 虚拟机中的解释器,编译成特定机器上的机器码 。也就是如下: ① Java 源文件—->编译器—->字节码文件 ② 字节码文件—->JVM—->机器码 每一种平台的解释器是不同的,但是实现的虚拟机是相同的,这也就是 Java 为什么能够跨平台的原因了 ,当一个程序从开始运行,这时虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享。 三. 线程 这里所说的线程指程序执行过程中的一个线程实体。JVM 允许一个应用并发执行多个线程。Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。 当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可用的 CPU 上。当原生线程初始化完毕,就会调用 Java 线程的 run() 方法

java语言风格

萝らか妹 提交于 2020-02-19 00:44:03
Java编程语言的风格十分接近C语言、C++语言。Java是一个纯粹的面向对象的程序设计语言,它继承了C++语言面向对象技术的核心。Java舍弃了C语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 Java不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的性能。编辑Java源代码可以使用任何无格式的纯文本编辑器,在Windows操作系统上可以使用微软记事本(Notepad)、EditPlus等程序,在Linux平台上可使用vi工具等。在记事本中输入如下代码:public class HelloWorld {//Java程序的入口方法,程序将从这里开始执行public static void main(String[]

JVM内存结构

和自甴很熟 提交于 2020-02-18 22:20:51
所有的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设置每个线程的堆栈大小。

JVM 初始

淺唱寂寞╮ 提交于 2020-02-18 19:35:43
  我们刚学习java的时候,从来没有想过new一个对象后,需要我们手动去管理过他的内存空间释放,因为我们知道java有GC垃圾回收器这哥们的存在,他会帮我们处理好一切,这就好比我是皇帝,我想在哪建个行宫就在哪建,至于打扫战场的事儿,跟我没有关系,有总管专门去处理这件事情,似乎我们也极少碰见过内存溢出或者内存泄露这种事,看上去似乎是那么的洒脱,可问题就出在这里,因为这就相当于我们把内存管理的权限下放了,下放给了jvm虚拟机,而一旦出现内存泄露或者内存溢出时,如果你不对你这个总管的工作原理以及内部运作机制不了解,解决这个问题将会比较困难。   我们写的java程序运行在jvm中,而jvm虚拟机会根据不同的需求,把它自己管理的内存区划分为几个重要的区,每个区域的作用也更不相同。 一,JVM运行时内存   1,方法区   程序里面写的变量,静态变量,已被jvm加载的类信息等都会存在这个片区,该片区被所有线程共享。   2,本地方法栈   为本地方法提供相关的一系列服务,需要注意的是该区也会抛出内存溢出和泄露的异常(什么是本地方法?有时java应用需要与java外面的环境交互,比如用java写的程序需要与一些底层系统或某系硬件交互时,本地方法正是这样的一种交流机制,它为我们提供了一个非常简洁的接口封装,直接调用即可,不需要关注底层的实现细节。)   3,程序计数器   该区占用内存空间较小

面试中遇到的问题

…衆ロ難τιáo~ 提交于 2020-02-17 11:54:03
1.唯一索引和主键索引,哪个快? 2.innodb和myisam储存引擎的区别 3.hashMap的数据结构,红黑树为啥快 4.索引的类型和结构 5.分布式事务 6.分布式锁 7.jvm除了调整参数,还有什么调优方法 8.redis持久化机制 9.mybatis的$和#的区别 10.hibernate和mybatis的区别 11.线程池高效的原理 12.ConccurentHashMap原理 13.java1.8新特性,流用过吗 14.用过微服务的哪些组件 15.http的请求流程 16.http头有哪些参数 17.常见的数据结构了解吗 18.redis删除的时候真的删除了吗(只是先标记,定时清除) 19.redis过期策略(定时随机删除过期的,其余的用到的时候再删除) 18.开发流程是怎样的 19.带新人遇到的一些问题 20.遇到过解决的最大的问题 21.java有几种序列化方法 22.IOC和AOP 23.AOP的代理模式是怎么实现的,不是动态代理(字节码技术,cglib字节码放在永久堆里,操作速度快,但是过多会造成内存区满,造成内存溢出所有spring默认用动态代理,没有接口采用cglib字节码) 24.项目中用到了哪些设计模式 来源: https://www.cnblogs.com/bobofei/p/12320903.html

反射

风流意气都作罢 提交于 2020-02-17 09:34:18
概念 反射 :将类的各个组成部分封装成其他对象 java代码在计算机中经历的阶段 首先书写Java代码,然后Java代码通过编译称为字节码文件(类名.class)存储在硬盘中(disk)。 然后,将硬盘中的字节码加载进内存。 Java中有一个Class类,用来描述字节码文件。类似下面,将成员变量,构造函数和方法分别封装成数组。 public class Class { public Field [ ] ; //成员变量 public Construct [ ] ; //构造函数 publid Method [ ] ; //方法 } 最后,new 一个对象使用。 反射的优点 可以在代码执行过程中调用 例如编译器中的方法提示功能。可以将相关的方法放在Method数组中,使用时打印 解耦 代码 1、获取Class 2、Field:设置和获得值 3、Construct 4、Method Person类 public class Person { public String age ; private String name ; public Person ( ) { super ( ) ; // TODO Auto-generated constructor stub } } 1、获取Class public static Class getPersonClass ( ) { //1

第一篇:初识Python

可紊 提交于 2020-02-17 07:32:14
一 本节目标 二 了解编程语言 2.1 为什么要编程? 2.2 什么是编程语言? 2.3 编程语言分哪些种类? 三 python简介 3.1 Python的前世今身 3.2 Python可以应用于众多领域 3.3 python是一种怎样的语言 3.4 为何选择Python 3.5 Python解释器的种类 3.6 python解释器的发展史 四 python环境 五 python入门 5.1 第一句python代码 5.2 文件头 5.3 注释 5.4 执行脚本传入参数 5.5 了解pyc文件 六 变量 6.1 为何要有变量 6.2 变量的声明与引用 6.3 标识符命令规范: 6.4 变量的赋值 七 输入输出 八 简单的运算符 九 流程控制 9.1 条件语句 9.2 循环语句 十 本节练习 一 本节目标 了解编程语言 了解python及与其他语言的优劣对比 安装python解释器及环境变量配置、运行python交互式环境 打印hello world程序 初识变量、用户输入,流程控制,while循环 二 了解编程语言 2.1 为什么要编程? 解放人力 :让机器(比如计算机)按照人们事先为其编写好的程序自发地去工作 2.2 什么是编程语言? 人----------->汉语--------------->中国人 八格牙路----------->日本人 汪汪汪------------->狗