0%

前言

本文是介绍对象与垃圾回收机制。

目录

一、虚拟机中对象的创建过程

对象的分配

虚拟机遇到一条new指令时,首先检查是否被类加载器加载,如果没有,那必须先执行相应的类加载过程。类加载就是把class加载到JVM的运行时数据区的过程。

Read more »

前言

本文是介绍Android虚拟机与类加载机制。

目录

一、Android虚拟机

虚拟机是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。虚拟机有自己完善的硬件架构,如处理器、堆栈等,还具有相应的指令系统。

JVM虚拟机是什么

不是真实的物理机,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机。它没有寄存器,所以指令集是使用Java栈来存储中间数据,这样做的目的就是为了保持Java虚拟机的指令集尽量的紧凑,同时也便于JAVA虚拟机在那些只有很少通用寄存器的平台上实现。所以,JVM本质上就是一个程序。

Read more »

前言

本文是介绍阻塞队列和线程池。

目录

一、阻塞队列

队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。

Read more »

JVM内存结构说一下

一般从两个维度出发:线程私有和线程共享。到每一个内存区域的细节点。

程序计数器:是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。

Java 虚拟机栈:是基于线程的。哪怕你只有一个 main() 方法,也是以线程的方式运行的。在线程的生命周期中,参与计算的数据会频繁地入栈和出栈,栈的生命周期是和线程一样的。
栈里的每条数据,就是栈帧。在每个 Java 方法被调用的时候,都会创建一个栈帧,并入栈。一旦完成相应的调用,则出栈。所有的栈帧都出栈后,线程也就结束了。每个栈帧,都包含四个区域:局部变量表、操作数栈、动态连接、返回地址。
本地方法栈:是和虚拟机栈非常相似的一个区域,它服务的对象是 native 方法。

堆:是 JVM 上最大的内存区域,我们申请的几乎所有的对象,都是在这里存储的。我们常说的垃圾回收,操作的对象就是堆。
方法区:这个区域存储的内容,包括:类的信息、常量池、静态变量、编译后的代码。

Read more »

前言

本文是介绍 JVM(Java Virtual Machine)。

目录

一、JVM

JVM 全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机。它能识别 .class后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。

JVM工作

Java 程序不一样,使用 javac 编译成 .class 文件之后,还需要使用 Java 命令去主动执行它,操作系统并不认识这些 .class 文件。所以JVM就是一个翻译,将 .class 文件字节码翻译成机器识别的二进制机器码。

Read more »

sychronied修饰普通方法和静态方法的区别?什么是可见性?

对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的class对象上的。我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。

但是有一点必须注意的是,其实类锁只是一个概念上的东西,并不是真实存在的,类锁其实锁的是每个类的对应的class对象。类锁和对象锁之间也是互不干扰的。

Read more »

前言

本文是介绍AbstractQueueSynchronizer。

目录

一、概念

队列同步器AbstractQueuedSynchronizer(以下简称同步器或AQS),是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过维护一个双向链表FIFO队列来完成资源获取线程的排队工作。它能够成为实现大部分同步需求的基础。

Read more »

前言

实现原子操作可以使用锁(synchronized)和CAS,synchronized锁基于阻塞的重量级锁的机制,CAS是一种不会阻塞线程,更有效,更加灵活的机制。

目录

一、原子操作

在编程中,atomic (原子) 动作是一次性完全发生的动作(一个或多个操作)。原子动作不能在中间停止:它要么完全发生,要么根本不发生。

Read more »

前言

线程间通信的实现,主要通过共享对字段的访问和引用字段所引用的对象。线程之间的通信机制有两种,共享内存和消息传递。

目录

一、概念

线程共享

通过共享内存对字段的访问和引用字段所引用的对象。这种通信形式非常有效,但可能出现两种错误:thread interference (线程干扰)memory consistency errors (内存一致性错误)。防止这些错误所需的工具是 synchronization (同步)

同步

同步是围绕称为 intrinsic lock (内部锁)monitor lock (监视器锁) 的内部实体构建的。(API 规范通常将此实体简称为“监视器”。)内部锁在同步的两个方面都发挥作用:强制对对象状态进行独占访问,并建立对可见性至关重要的 happens-before 关系。

Read more »

前言

本文是介绍 Java 基本 I/O 。

目录

一、IO简介

I/O(Input/Outpu) 即输入/输出 。从计算机结构的视角来看的话, I/O 描述了计算机系统与外部设备之间通信的过程。从应用程序的视角来看的话,应用程序对操作系统的内核发起 IO 调用(系统调用),操作系统负责的内核执行具体的 IO 操作。

为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为 用户空间(User space)内核空间(Kernel space ) 。用户进程想要执行 IO 操作的话,必须通过 系统调用 来间接访问内核空间。

当应用程序发起 I/O 调用后,会经历两个步骤:

  1. 内核等待 I/O 设备准备好数据;
  2. 内核将数据从内核空间拷贝到用户空间。

在开发过程中接触最多的就是磁盘 IO(读写文件)和 网络 IO(网络请求和响应)。UNIX 系统下, IO 模型一共有5种: 同步阻塞 I/O、同步非阻塞 I/O、I/O多路复用、信号驱动 I/O和异步I/O。

Read more »