字节码

Java内存管理:Java内存区域 JVM运行时数据区

情到浓时终转凉″ 提交于 2019-12-01 15:28:41
Java内存管理:Java内存区域 JVM运行时数据区 在前面的一些文章了解到javac编译的大体过程、Class文件结构、以及JVM字节码指令。 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些,然后分别介绍它们的特点,并指出给出一些HotSpot虚拟机实现的不同点和调整参数。 1、Java内存区域概述 1-2、C/C++与Java程序开发的内存管理 在内存管理领域,C/C++程序开发与Java程序开发有着完全不同的理念: 1、C/C++程序开发 自己管理内存是一项基础的工作; 自已分配内存,但也得自己来及时回收; 比较自由,但多了些工作量,且容易出现内存泄露和内存溢出等问题; 2、Java程序开发 JVM管理内存,不需要自己手动分配内存和释放内存; 不容易出现内存泄露和内存溢出; 一旦出现问题不容易排查,所以得了解JVM是怎么使用内存; 1-2、Java内存区域与JVM运行时数据区 如上图, Java虚拟机规范定义了字节码执行期间使用的各种 运行时数据区 ,即JVM在执行Java程序的过程中,会把它管理的内存划分为若干个不同的数据区域,包括: 程序计数器、java虚拟机栈、本地方法栈、java堆、方法区、运行时常量池; 从线程共享角度来说,可以分为两类: 1、所有线程共享的数据区 方法区、运行时常量池、java堆;

java 内存区域介绍

浪尽此生 提交于 2019-12-01 15:27:41
java 内存区域介绍 java 虚拟机运行时数据区 程序计数器 javac编译器完成了词法分析、语法分析到抽象语法树,再遍历树生成线性指令流。 程序计数器是一块较小的内存空间,可以看成当前线程的线性指令流的行号指示器,字节码解释器通过改变这个值来选取下一条需要执行的字节码指令。 由于java线程是抢占式的,且一个处理器同一时间只会执行一条线程中的指令,为了线程切换能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,保证线程之间计数器互不影响。 如果执行的是java方法,计数器记录的是正在执行的虚拟机字节码指令的地址,如果是native方法,这个计数器的值为空 执行引擎 根据程序计数器,栈,堆进行调用。 java对方法指令的解释执行,执行方式为经典 诺依曼体系中的FDX循环方式,即获取下一条指令,解码并分派,然后执行。实现FDX循环时有switch-thread,token_thread,direct-thread,subroutine-thread,inline-threading switch-thread 是最简单的形式: token-thread java并没有在解释器做太复杂的处理用的就是token-thread direct-thread,subroutine-thread,inline-threading请自行查阅资料查询 本地方法栈 包括本地方法接口

Java 反射

浪尽此生 提交于 2019-12-01 13:48:06
前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码) JAVA反射机制 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种 动态获取 的信息以及 动态调用 对象的方法的功能称为java语言的反射机制。 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。 反射就是把java类中的各种成分映射成一个个的Java对象。 在加载类时,通过.java文件创建一个Class对象,一个类多次加载也只有一个Class对象。 Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。(包括基本数据类型) Class 没有公共构造方法。 Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了。 获取字节码文件对象(Class)的三种方法 通过 getClass(),object是一个引用变量,指向堆中对象 通过 类名.class 通过类的全限定名(即路径,包+"."+类名),调用静态方法Class.forName

Java基础知识点总结1 (面试宝典)

主宰稳场 提交于 2019-12-01 13:13:15
java基础知识是校招面试,笔试必考的,考察语言的基本功。找一份好的工作,语言+计算机基础知识(计算机网络+操作系统+数据库+linux)+数据结构与算法+项目+实习。只要把这几个个个击破,应该很容易。 Java基础知识点总结 每部分内容会重点写一些常见知识点,方便复习和记忆,但并不是全部内容。 面向对象三大特性 继承:一般类只能单继承,内部类实现多继承,接口可以多继承 封装:访问权限控制public > protected > 包 > private 内部类也是一种封装 多态:编译时多态,体现在向上转型和向下转型,通过引用类型判断调用哪个方法(静态分派)。 运行时多态,体现在同名函数通过不同参数实现多种方法(动态分派)。 基本数据类型 1. 基本类型位数,自动装箱,常量池。 2. 例如byte类型是1byte也就是8位,可以表示的数字是-128到127,因为还有一个0,加起来一共是256,也就是2的八次方。 32位和64位机器的int是4个字节也就是32位,char是1个字节就是8位,float是4个字节,double是8个字节,long是8个字节。 3. 基本数据类型的包装类只在数字范围-128到127中用到常量池,会自动拆箱装箱,其余数字范围的包装类则会新建实例。 String及包装类 1. String类型是final类型,在堆中分配空间后内存地址不可变。 2.

课堂笔记2th

房东的猫 提交于 2019-12-01 10:17:11
上课笔记 2th https://mubu.com/doc/2gxvIvVLG0 (老师笔记网址) 1. python python 运行过程 把源代码转化成字节码(机器不能识别) 也可能不产生 pyc, 只是字节码 把转化好的字节码转发到 Python 虚拟机( PVM )中执行 2. 编译型, c c++ 一次性把你的代码编译成机器能够识别的二进制码,速度快,跨平台性不好 3. 解释型, python (不是纯粹的解释,也有一个编译过程, pyc 文件机器不能识别,还需要虚拟机去逐条解释) 在代码实行时,一条一条的解释成机器能够识别的二进制码,比较编译型会慢一些,跨平台性好 4. 混合型, Java (先编译再解释) 5. python 类型 ( 1 )强类型 强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。 ( 2 )动态型 动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。 ( 3 )解释型 6. 变量, 变量:吧程序运行的中间结果临时的存在内存里,以便以后的代码调运 作用:昵称,起代指内存里某个地址中保存的内容 交互模式纸盒内存打交道, python 交互式进 cmd 打

Java内存区域与内存溢出异常

旧巷老猫 提交于 2019-12-01 08:21:05
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示期。字节码解释器工作时就是通过这个计算器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是Native方法,这个计数器值则为空(Undefined)。 Java虚拟机栈 与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacke)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个帧栈

JVM原理与深度调优

送分小仙女□ 提交于 2019-12-01 08:10:20
什么是jvm jvm是java虚拟机 运行在用户态、通过应用程序实现java代码跨平台、与平台无关、实际上是"一次编译,到处执行" 1.从微观来说编译出来的是字节码!去到哪个平台都能用,只要有那个平台的JDK就可以运行!字码好比是一个人,平台好比为国家,JDK好比这个国家的语言!只要这个人(字节码)有了这个国家的语言(JDK)就可以在这个国家(平台)生活下去。 2.JDK 是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。 3.Java虚拟机(JVM)一种用于计算机设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 4.java编译出来的是一种“java字节码”,由虚拟机去解释执行。 而c和c++则编译成了二进制,直接交由操作系统执行。 5.所谓的一次编译、到处执行,即只需在一个地方编译,在其他各个平台下都可以执行。 6.与平台无关指的是JAVA只运行在自己的JVM上,不需要依赖任何其他的底层类,所以和操作系统没有任何联系,平台是说运行的系统 内存结构图 class文件 class文件径打破了 C 或者C++等语言所遵循的传统

Java内存区域和内存溢出异常

时光毁灭记忆、已成空白 提交于 2019-12-01 07:24:15
  Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来——《围Java》·周志明   Java程序员将c++中繁琐的delete交给了虚拟机,虽然我们一直创建对象,但从未手动删除过对象,这一切正悄然发生着。我们把内存控制的权利交给了JVM,直到那一天,Java程序员终于想起了曾一度被他们支配的恐怖和被囚禁于鸟笼中的那份屈辱。 一、运行时数据区/内存模型   运行时数据可划分为若干个数据区域,其中有的属于线程共享,而又有些为线程私有。共享区域会随着虚拟机进程的启动而存在,而线程私有的区域会随着线程的启动和结束而建立和销毁。    二、程序计数器(Program Counter Register)   我更喜欢用“寄存器”的概念去理解他,我们知道在CPU中有寄存器用于保存指令地址和保存计算结果。类似的,程序计数器就像一个指针,保存了指向方法区中的方法字节码的地址,程序寄存器只占用很小的内存空间,是线程私有的,可以看做是当前线程所执行的字节码的行号指示器,如果你查看程序字节码,会发现很多指令,程序计数器按顺序存储这些字节码,执行引擎执行计数器中的字节码以实现循环、跳转、分支、线程恢复等操作。由于程序计数器是线程私有的,没一条线程都会有一个独立的程序计数器,所以各个线程之间的程序计数器互不影响,独立存储。如果正在执行的是本地方法

慕课网《JAVA遇见HTML——JSP篇 第二章 JSP基础语法》学习笔记

巧了我就是萌 提交于 2019-12-01 07:20:25
备注:课程网址: https://www.imooc.com/learn/166 2-1:JSP简介 JSP全名为Java Server Pages,Java 服务器端 页面,其根本是一个简化了的Servlet设计,他实现了在Java中使用HTML标签。JSP是一种动态网页技术标准,也是JavaEE的标准。JSP与Servlet一样,是在服务器端执行的。 2-3:JSP页面元素简介及page指令 JSP页面元素构成:指令、表达式、小脚本、声明、注释、静态内容。 JSP指令,共3种。 (1)page指令,通常位于JSP页面的顶端,同一个页面可以有多个page指令。 (2)include指令,将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句。 (3)taglib指令,使用标签库定义新的自定义标签,在JSP页面中启用定制行为。 page指令语法: <%@ page 属性1=“属性值” 属性2=“属性值1,属性值2”... 属性n="属性值n" %> 备注:@和page之间需要有一个空格。 属性 描述 默认值 language 指定JSP页面使用的脚本语言 Java import 通过该属性来引用脚本语言中使用到的类文件 无 contentType 用来指定文件类型和JSP页面所采用的编码方式 text/html,ISO-8859-1 text/html

python 程序的执行过程

天涯浪子 提交于 2019-12-01 07:07:45
Python程序的执行过程 我们都知道,C语言在执行之前需要将源代码编译成可执行的二进制文件,也就是将源代码翻译成机器代码,这种二进制文件一旦生成,即可用于执行。但是,Python是否一样呢?或许很多人都听过,Python和Java都是半编译半解释的语言,那么问题来了,什么又是半编译半解释呢?这还要从C语言开始说起 比方我们现在有一段C语言写成的程序,我们在一台Linux服务器上编译好了,生成可执行的二进制文件,可是我现在想要在一台Windows的机器上执行这个文件,这是不可能的,原因是因为不同平台间的机器代码是不一样的,在Linux机器上生成的二进制可执行文件,是不能拿到Windows上执行的,甚至都是在Linux上编译的文件,但是用的C编译器不同,一样有可能无法执行。所以,这才有了半编译半解释。 半编译半解释保证,一次编译,到处运行。这是Java的承诺,同样适用于Python。半编译半解释会从源代码中产生一组字节码,它并不是机器代码,但是不管是在Linux还是Windows的机器上,同样的源代码产生的字节码都是一样的,同时它还有个虚拟机,虚拟机会一条一条执行字节码,生成可执行的机器代码交给CPU执行。正是因为字节码和虚拟机这两个特性,使得我们的程序可以正常执行在Linux或Windows机器上 那么你一定好奇,Python的编译器和Python的虚拟机在什么地方呢?于是