一对象的创建 Java语言是一门面向对象语言,在程序运行过程中无时无刻都有新的对象被创建出来。在Java程序中,创建对象的方式有多种,除了最常用的new关键字外,我们还可以通过反射机制、Object.clone方法、反序列化以及Unsafe.allocateInstance方法来新建对象。 其中,Object.clone方法和反序列化通过直接复制已有的数据,来初始化新建对象的实例字段。Unsafe.allocateInstance方法则没有初始化实例对象字段。而new语句和反射机制则是通过调...

  qbian   2019年11月11日   1062   2   0 javajvmjava-ee

一运行时数据区域 ![JVM内存模型](https://static.developers.pub/JVM内存模型.png) 类加载器加载的class字节码保存到JVM内存的方法区,实例化类对象时在堆内存中生成对象信息,调用对象的方法时会在栈内存将方法进行压栈,如果发生线程切换,会将当前线程栈内存中调用信息保存到程序计数器中,当前线程获得CPU执行权时,将程序计数器中上次调用信息获取到,继续上次的位置接着执行。 二详解 2.1方法区 方法区是线程共享的一块内存区域,它用于存储已被虚拟机...

  qbian   2019年11月11日   1021   2   0 javajvmjava-ee

一什么是类加载器 通过一个类的全限定名去获取描述此类的二进制字节流的动作被称为类加载器。这个动作被放到了Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。 二类与类加载器 类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类加载阶段。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性。也就是比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类是来源同一个clas...

  qbian   2019年11月11日   42   2   0 javajvmjava-ee

一什么是类加载 上一章我们了解了class文件存储结构,在class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能被运行和使用。而虚拟机是如何加载这些class文件的? 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 JVM中类型的加载和连接过程都是在程序运行期间完成的,这样会在类加载时稍微增加一些性能开销,但是却能为Java应用程序提供高度的灵活性,Java中天生可以动态扩...

  qbian   2019年11月11日   35   2   0 javajvmjava-ee

各种不同平台的虚拟机与所有平台都统一使用的程序存储格式---字节码(ByteCode)是构成平台无关性的基石。 一.class文件的来源 计算机只认识0和1,所以我们写的程序需要被编译器翻译成由0和1构成的二进制格式才能被计算机执行。 JVM只认识.class字节码,所以想要在JVM上运行的所有语言都需要编译为JVM能识别的字节码格式。 二具体结构 2.1结构 整个class文件的结构基本保持了我们编写java源码程序的上下结构,其本质上就是一张表,如果所示: 名称|数量|描述 ---|---|--- magic|1|魔数 minor_version|1|次版本号 major_v...

  qbian   2019年11月11日   30   2   0 javajvmjava-ee

一什么是打包 打包是将项目中编写的类、以及依赖第三方的jar包,合并到一个jar或war包内,并在打包后的项目的配置文件中指定入口类文件路径,以便JVM能够找到入口类并加载运行项目。 二为什么要打包 一个项目的开发可能会有很多人参与,产生大量的Java源码文件以及配置文件,类之间会相互调用从而配合完成某个功能。 项目中还会依赖第三方包提供的功能jar包,如数据库驱动包、数据库连接池druid、数据库访问层框架mybatis、IOC容器spring、RPC远程调用dubbo、注册中心zoo...

  qbian   2019年11月11日   43   2   0 javajvmjava-ee

代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步 一什么是编译 编译是将一种抽象程度更高的语言转换为更贴近计算机能够识别的语言的过程。 在Java中存在两次编译,不过我们今天说的是其中的第一次编译,就是将.java源程序编译为.class字节码文件的过程。 二为什么要编译 2.1高级语言 在说为什么要编译之前我们先说一下什么是高级语言。 高级语言是相对的,如果比较的对象是最底层的机器码的话,C、C、Java等都是高级语言,如果比较的对象是...

  qbian   2019年11月11日   52   2   0 javajvmjava-ee

一Java变量类型 1.1图解 ![Java数据类型](https://static.developers.pub/Java数据类型.png) 1.2描述 Java中的变量可以分为两大类: 基本数据类型:主要用来支持数值计算,因为使用基本类型能够在执行效率以及内存使用上提升软件性能(只需要保存数值,不需要保存指针)。 引用数据类型:可再分为数组类型、类类型、接口类型,主要用来支持面向对象的数据模型设计。 二基本类型 类型|值域|默认值 ---|---|--- boolean|{f...

  qbian   2019年11月11日   34   2   0 javajvmjava-ee

一JDK组成架构 1.1图解 ![JDK组成架构](https://static.developers.pub/JDK组成架构.png) 1.2描述 上图的JDK组成架构可以看出,JDK由两部分组成。 一部分是Java工具包:javac、jar、javadoc等。 javac:编译器,将源程序.java编译成字节码.class文件; jar:打包工具,将相关的类文件或第三方jar包打包成一个jar文件; javadoc:文档生成器,从源码中将符合javadoc规范的注释提取文档; ...

  qbian   2019年11月11日   45   2   0 javajvmjava-ee

一标记-清除算法 该算法的工作过程和其名字一样,分为标记和清除两个阶段;首先标记GCRoots不可达的对象为待回收状态,在标记完成后统一回收所有被标记的对象。 ![标记-清除算法](https://static.developers.pub/标记-清除.png) 1.1不足之处 1.效率不高,标记和清除两个阶段的效率都不高; 2.空间零碎,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能导致后面无法分配大对象,然后提前触发垃圾回收动作; 二复制算法 复制算法是为了解决标记-清...

  qbian   2019年11月11日   1028   1   0 javajvmjava-ee