字节码

类加载机制学习

给你一囗甜甜゛ 提交于 2020-03-06 10:15:50
简单讲下JVM中的类加载过程 JVM中的类加载和卸载的时机? 如何理解JVM中不同类加载器的概念和作用? 简单讲下JVM中的双亲委派模型? 什么情况下会破坏双亲委派模型?为什么?可否举个例子? Tomcat中的类加载机制有了解吗?为什么这么设计? 实际开发中有遇到哪些类加载器相关的问题?你又是如何解决的? JVM之上的弱类型语言例如Groovy是如何实现?简单讲下动态类加载机制? 类的加载和卸载 JVM是虚拟机的一种,它的指令集语言是字节码,字节码构成的文件是class文件。平常我们写的Java文件,需要编译为class文件才能交给JVM运行。可以这么说:C语言代码——>二进制文件——>计算机硬件,就相当于Java代码——>字节码文件——>JVM。JVM将指定的class文件读取到内存里,并运行该class文件里的Java程序的过程,就称之为类的加载;反之,将某个class文件的运行时数据从JVM中移除的过程,就称之为类的卸载。 class文件的运行时数据就是C++对象,也称为kclass对象,这些运行时数据在JDK7之前是放在永久代(PermGen),JDK8之后则放在元空间(Metaspace)。 类的生命周期 Java类从被虚拟机加载开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析

Java的运行原理

允我心安 提交于 2020-03-05 03:20:16
在 Java 中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在 Java 中,这种供虚拟机理解的代码叫做 字节码 (ByteCode)(class文件的内容) ,它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。 Java 源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。 跨平台: 话说,在北京,一般都是讲北京话的,上海,一般都是将上海话,广东,广东话... 现有一公文发出,要全国执行,该当如何?——先统一翻译成普通话。各地在将普通话版本翻译成当地的方言。 这里,北京、上海就是不同类型的机器windows,linux... 编译(javac)就是将公文翻译成普通话的过程,而编译出的.class文件,就是公文的普通话版本。 在执行的时候,各地的翻译就是jvm,负责将.class转换成本地能够理解的方言来执行。 *.jav a→ *.class →机器码 java 编译器 ( 编译 ) → 虚拟机 ( 解释执行 ) → 解释器 ( 翻译 ) →

Java开发环境的配置与Hello World

狂风中的少年 提交于 2020-03-05 00:54:45
一、Java开发需要做的准备 Java程序的执行过程是首先由Java编译器将以.java为后缀的Java源文件编译成.class字节码文件。然后字节码文件便可以由JVM虚拟机进行加载并执行。 在初学Java的时候,由于我们的电脑默认上不带有JVM虚拟机和Java编译器,所以我们首先需要在电脑上安装内部含有Java编译器、JVM虚拟机等其他Java开发相关组件的Java开发工具集(Java Development Kit),也就是我们常说的JDK。 1.1安装JDK Java目前隶属于Oracle公司旗下,在Oracle公司官网的Downloads目录下,可以找到JDK的下载链接。推荐初学者尝试从官网进行JDK的下载(本文的最后也附上了一些相关资源的下载链接,供读者下载)。 在下载的过程中,要注意一下下载的JDK版本。在不同的版本中,对于一些工具和特性的使用要求有所不同,故在下载版本的选择上,请开发者依据自己的需求进行选择并下载。 在下载过后,点击下载的启动文件,按照顺序点击下一步,耐心等待到安装完成(在安装过程中安装路径可以自己指定,但是一定要记住自己选择的安装路径)。安装完毕后,在cmd中输入 java –version 若出现关于Java的版本相关信息,则JDK已经安装成功。如下图所示。 虽然已经成功的将JDK安装到本机,但是由于未设置环境变量

Python——函数

这一生的挚爱 提交于 2020-03-04 16:29:12
函数 注意哈,这里的所有的概念的原理,其实和很多的其它编程语言是一样的。只是语法上不一样 1.概述 所谓 函数 ,就是把 具有独立功能的代码块 组织为一个小模块,在需要的时候 调用 函数的使用包含两个步骤: 定义函数 —— 封装 独立的功能 调用函数 —— 享受 封装 的成果 函数的作用 ,在开发程序时,使用函数可以提高编写的效率以及代码的 重用 2.定义函数 定义函数的格式如下: def 函数名(): 函数封装的代码 …… def 是英文 define 的缩写 函数名称 应该能够表达 函数封装代码 的功能,方便后续的调用 函数名称 的命名应该 符合 标识符的命名规则 可以由 字母 、 下划线 和 数字 组成 不能以数字开头 不能与关键字重名 调用函数很简单的,通过 函数名() 即可完成对函数的调用 注意哈,这个也也需要你注意, 缩进的代码块 代码实例 name = "老李" # 解释器知道这里定义了一个函数 def say_hello(): print("hello 1") print("hello 2") print("hello 3") print(name) # 只有在调用函数时,之前定义的函数才会被执行 # 函数执行完成之后,会重新回到之前的程序中,继续执行后续的代码 say_hello() print(name) 3. 我们有没有像js中的预处理呢? 能否将 函数调用

JVM 内存结构模型

南楼画角 提交于 2020-03-04 03:32:44
文章目录 JVM 内存结构模型 JVM 内存区域 程序计数器 PC 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 JAVA8 与元空间 执行引擎 JVM 内存结构模型 JVM 虚拟机主要由 4 个部分组成: Class Loader: 依据特定的格式,将 class 文件加载到内存 Execution Engine: 解析字节码文件并提交给操作系统执行 Native Interface: Java 本地接口,融合不同语言开发的原生库为 Java 所用 Runtime Data Area: JVM 内存结构模型 JVM 内存区域 线程私有 程序计数器 PC、虚拟机栈、本地方法栈 线程共享 方法区、堆、直接内存(非运行时数据区) 线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在 Hotspot VM 内) ,每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应)。 线程共享区域随虚拟机的启动/关闭而创建/销毁 直接内存并不是 JVM 运行时数据区的一部分 ,但也会被频繁的使用:在 JDK 1.4 引入的 NIO 提供了基于 Channel 与 Buffer 的 IO 方式,它可以使用 Native 函数库直接分配堆外内存,然后使用 DirectByteBuffer 对象作为这块内存的引用进行操作,这样就避免了在

Java必知必会的20种常用类库和API

醉酒当歌 提交于 2020-03-04 02:56:34
转载: https://blog.csdn.net/u011001084/article/details/79216958   个人感觉工具类对日常开发是很重要的,所以推荐一下这篇文章,虽然有的类库过时了   本文总结了日志、JSON解析、单测、XML解析、字节码处理、数据库连接池、集合类、邮件、加密、嵌入式SQL数据库、JDBC故障诊断以及序列化等20个方面的常用类库。 都是你日常开发经常可能要用到的,现在不用不要紧,但是你要知道有这么一篇文章可以供你参考。 一、日志相关类库   日志库是很常见的,因为你在每一个项目中都需要他们。打印日志是服务器端应用中最重要的事情,因为日志是你了解你的程序发生了什么的唯一途径。尽管JDK附带自己的日志库, 但是还是有很多更好的选择可用,例如 Log4j、SLF4j 和LogBack。   Java开发人员应该熟悉日志记录的利弊, 并且了解为什么SLF4J要比Log4J要好。 二、JSON解析库   在当今世界的web服务和物联网中(IoT),JSON已经取代了XML,成为从客户端到服务器传送信息的首选协议。有一个好消息和一个坏消息。坏消息 是JDK没有提供JSON库。 好消息是有许多优秀的第三方库可以用来解析和创建JSON消息,如Jackson、Gson    个人感觉fastjson也挺好的 三、单元测试库   单元测试技术的使用

(二)java快速入门

被刻印的时光 ゝ 提交于 2020-03-03 18:51:50
文章目录 一、java简介 1、安装JDK 2、第一个java程序 3、使用IDE工具开发 4、利用IDE工具演示第一个java程序 二、java程序基础 三、流程制作 四、数组操作 一、java简介 1、安装JDK 因为Java程序必须运行在JVM之上,所以,我们第一件事情就是安装JDK。 Oracle的官网 现在需要登陆下载,可以用下面提供的下载jdk8的版本(目前应用比较多的基本都是8的版本) 链接:https://pan.baidu.com/s/1CfhayA2iIaoZrE-OMEMOjw 提取码:fdd9 设置环境变量( ps:这里主要注意给定的jdk,jre等路径一定不要有中文,最好也不要带空格字符 ) 这个可以参考百度搜索:安装jdk1.8并配置环境变量 配置完后,cmd键入 java -version 出现如下字样,代表成功安装jdk运行环境。 2、第一个java程序 我们来编写第一个Java程序。 打开记事本,输入以下代码: public class Test { public static void main ( String [ ] args ) { System . out . println ( "Hello, world!" ) ; } } 保存该文件,修改文件名为Test.java,然后win+R输入cmd,打开dos命令界面,输入以下命令运行程序:

JVM内存模型基础

狂风中的少年 提交于 2020-03-03 15:24:18
1. JVM 线程私有内存 : 程序计数器(Program Counter Register):保留当前线程执行方法 Java虚拟机栈(JVM Stack):方法的栈帧 本地方法栈(Native Method Stack):存储native方法信息 多线程共享内存 : 堆(Heap):存储对象和数组 方法区(Method Area):存储类结构/常量/静态变量,运行时常量池:属于方法区 1.1. 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的 行号指示器 。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 1.2. Heap Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域用来 存放对象实例 ,几乎所有的对象实例都在这里分配内存,垃圾回收器也主要在堆内工作。 java堆:分为新生代和老年代, 老年代进行fullGC: 或者使用system.gc 老年代满后 java heap详解 java性能调优的目的 :

Java面试复习

爱⌒轻易说出口 提交于 2020-03-03 13:37:39
1、面向对象和面向过程的区别     面向过程:性能高,消耗的资源少,一般用于嵌入式开发(单片机)    面向过程: 易扩展、维护、服用,有继承、封装、多态性质,可以降低系统的耦合,性能比面向过程低 2、Java语言的特点    面向对象、与平台无关,安全可靠,支持多线程和网络编程,编译与解释并行 3、什么是JVM, JDK, JRE?   JVM是Java虚拟机,运行Java字节码的,JVM对不同系统开发不同的虚拟机,目的使用相同的字节码,JVM再将字节码转换成二进制的机器码   字节码就是后缀为.class的文件,因为字节码运行在虚拟机上,无关处理器和操作系统,所以一次编译可以在不同操作系统上运行      JDK是Java Development Kit,简单理解就是开发者用的,包含了JRE,还有编译器,能够创建和编译程序   JRE是Java Run environmen Java运行时环境,包含JVM和Java类库,和一些其它基础组件,但不能开发Java程序 4、Oracle JDK 与 Open JDK的区别   Oracle JDK每三年发布一次,而Open JDK每三个月发布一次   Oracle JDK并不完全开源,而Open JDK完全开源   Oracle JDK比Open JDK更加稳定,性能更好,商业软件还是选择稳定的比较好 5、 Java和C++的区别

java程序运行过程和内存分析

ぃ、小莉子 提交于 2020-03-03 02:51:59
java程序运行过程和内存分析 java程序运行过程和内存分析 Java程序运行分析概括 内存分析 - 方法区 - 虚拟栈 - 程序计数器 - 堆 - 本地方法区 案例分析 java程序运行过程和内存分析 此篇文章是个人看了一些资料得出的总结,如有不准确,烦请指正。仅供参考。 Java程序运行分析概括 当运行一个Java 程序时。需要经过编译和运行两个阶段。而这里涉及到的内存,是指在运行时,程序的内存划分。编译阶段由编译器将Java文件编译成字节码文件。而运行一个程序时,首先会启动一个java虚拟机进程。java虚拟机包括类装载器和执行引擎。然后进行 加载 - 连接 - 初始化这三个过程。这里区分一下初始化和实例化这两个概念。初始化是针对类的,而实例化是针对对象的。下面粗略概览一下运行过程。 编译阶段 将java文件由编译器编译为字节码文件 运行阶段 1、加载 通过类的名称获取字节码文件的二进制字节流,并转换为静态存储结构存放于 方法区 ,并生成唯一的class对象。作为访问方法区中该数据类型的访问接口。 2、连接 -验证:确保被加载类的正确性(即使编译正确,但字节码文件也有可能被修改) -准备:为类的静态变量分配内存,并将其初始化为默认值。 -解析:把类的符号引用转换为直接引用。 3、初始化 为类的的初始化赋予正确的初始值和分配内存空间,初始化一般通过显示的直接赋值