Talk is Cheap, Show me the Code! <<网站首页文章列表

  • JVM——Java内存模型

    前言大部分Java程序员(包括我自己)大部分时间接触的都还是单线程代码,虽然JVM本身是支持多线程并发执行的。在JVM中,多个线程在执行代码(操作变量或对象)的时候,都是通过操作共享的主内存来实现的。多线程并发可能通过多个硬件处理器实现,也可能是在单处理器上通过切换CPU时钟实现,或者是在多个处理器上切换CPU时钟实现。对于程序员来说,只能通过创建一个Thread类的实例对象来创建一个线程;每个线程都会存在一个与之对于的实例对象。通过实例对象的start()方法来启动对应的线程:java//每个线程都是通过创建Thread的实例对象来定义的Thread firstThread new Thread();//只有调用的线程的start方法,才能启动线程(不管是这里的主动调用或者其他组件的隐式调用)firstThread.start();如果没有对多线程操作进行合理的同步(synchronized、volatile等)控制,就会出现一些匪夷所思的问题。本章会介绍Java多线程编码相关的语义,比如共享内存中多线程对变量进行更新之后的可见性。许多硬件体系结构中也存在类似内存模型的概念,而我们本章讨论的是Java语言中的内存模型,称为Java programming language memory model(JMM),下文简称内存模型。---- 同步(Synchronization)Java为多线程通信提供了不同级别的同步机制,最常用的就是同步原语(synchronized)了,它是通过监视器(准确的说是monitors,下文都称为监视器)实现的。每个Java对象(包括常见的类实例对象和Class对象)都有一个对应的监视器,同一个时刻只能有一个线程进获得某一个对象的监视器锁。此时,其它在尝试获得该监视器锁的线程都会堵塞,直到该锁被释放。特别注意的是,这种方式实现的锁是非公平锁:同一个线程可以多次重复获得同

    内存模型   JVM   2019-03-29 浏览(425) 阅读原文>>
  • JVM——初探内存结构(基于JDK8)

    Java是一门通用的、支持并发的面向对象的编程语言。它借鉴了C和C++的语法,但是舍弃了一些令它们变得复杂的、不安全的容易使人产生迷惑的特性。而JVM(Java Virtual Machine)则是Java平台的基石。正因为它,Java平台才能使用少量的编译代码就能实现跨硬件、跨操作系统特性,而且让用户免受恶意程序的攻击。虽然是一个虚拟的计算机器,但JVM与真实的物理计算机一样,也有自己的指令集,也会在运行时操作不同的内存区域。通过虚拟机来实现编程语言是很常见的,比如UCSD Pascal语言就是通过P-Code虚拟机实现的。第一个JVM原型是由Sun公司实现的。----- JVM内存结构——运行时数据区(Run-Time Data Areas)JVM规范定义了在程序运行期间的若干个不同的运行时数据区(内存)。有些区域的生命周期与JVM一致,随着JVM的启动而创建,又随着JVM的退出而销毁。有些区域是线程私有的,线程私有的数据区生命周期与线程的生命周期一致。+ 程序计数器(Program Counter Register)+ Java虚拟机栈(Java Virtual Machine Stacks)+ Java堆(Java Heap)+ 方法区(Method Area) + 运行时常量池(Runtime Constant Pool)+ 本地方法栈(Native Method Stacks)![图片](https://oomabc.com/staticsrc/img/201903/22/1553244569400192ca2a5a24840d6948c14e4137ac2d1.jpg)--- 程序计数器(Program Counter Register)JVM的能支持多线程并发,就是通过线程轮流切换并分配CPU时间来实现的。每个JVM线程都有各自独立的程序计数器,只有这样才能在多线程轮流切换之后恢复到正确的执行位置。同一时刻,只有一个线程可以执行当前方法对应的机器指令。如果当前执行的不是native方法,则程序计数器的值就是当前正在执行的JVM指令的内

    JVM   Java   内存结构   JDK8   2019-03-28 浏览(470) 阅读原文>>
  • JVM——Java类的加载机制以及生命周期

    一、什么是类的加载类的加载,就是将.class文件中的二进制数据读取到内存中,其实是存放于运行时的方法区。然后在堆中创建一个java.lang.Class对象(该对象封装了符合方法区定义的数据结构),同时向用户提供访问方法区内的数据结构的接口。JVM允许类加载器对某个类进行预加载。预加载过程发生错误(.class文件缺失或者有错误),类加载器需要在程序首次主动使用该类时报告错误(LinkageError),如果程序一直没有主动使用这个类,则类加载器不会报告这个错误。类加载器的加载方式:本地文件系统、网络.class文件、压缩包中的.class文件、Java源文件动态编译的.class文件。 二、类的生命周期类的生命周期包括加载、验证、准备、解析、初始化五个阶段。其中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的。而解析可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。 加载(Loading):查找对应目录中的类,并加载二进制字节流 1. 通过classpath和类的完整签名来读取对应的二进制字节流。 2. 将二进制字节流所代表的存储结构转化为方法区的数据结构。 3. 在堆中生成一个代表这个类的java.lang.Class对象,作为访问方法区数据结构的入口。此阶段结束之后,JVM外部的二进制字节流文件就按照规范存储在方法区了,而且堆中存在一个可以访问这些方法区中的数据的对象。 -------- 连接-验证(Linking-Verification):确保被加载的类的正确性(符合当前虚拟机版本规范,且不会造成危害) 1. 文件格式验证:验证字节流是

    JVM   类加载   ClassLoader   Java   2019-03-15 浏览(884) 阅读原文>>
  • 1 
    blogTest
    分享文章
     
    使用APP的"扫一扫"功能,扫描左边的二维码,即可将网页分享给别人。
    你也可以扫描右边本博客的小程序二维码,实时关注最新文章。