前言
本文是介绍对象与垃圾回收机制。
目录
一、虚拟机中对象的创建过程
对象的分配
虚拟机遇到一条new指令时,首先检查是否被类加载器加载,如果没有,那必须先执行相应的类加载过程。类加载就是把class加载到JVM的运行时数据区的过程。
一般从两个维度出发:线程私有和线程共享。到每一个内存区域的细节点。
程序计数器:是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。
Java 虚拟机栈:是基于线程的。哪怕你只有一个 main() 方法,也是以线程的方式运行的。在线程的生命周期中,参与计算的数据会频繁地入栈和出栈,栈的生命周期是和线程一样的。
栈里的每条数据,就是栈帧。在每个 Java 方法被调用的时候,都会创建一个栈帧,并入栈。一旦完成相应的调用,则出栈。所有的栈帧都出栈后,线程也就结束了。每个栈帧,都包含四个区域:局部变量表、操作数栈、动态连接、返回地址。
本地方法栈:是和虚拟机栈非常相似的一个区域,它服务的对象是 native 方法。
堆:是 JVM 上最大的内存区域,我们申请的几乎所有的对象,都是在这里存储的。我们常说的垃圾回收,操作的对象就是堆。
方法区:这个区域存储的内容,包括:类的信息、常量池、静态变量、编译后的代码。
线程间通信的实现,主要通过共享对字段的访问和引用字段所引用的对象。线程之间的通信机制有两种,共享内存和消息传递。
通过共享内存对字段的访问和引用字段所引用的对象。这种通信形式非常有效,但可能出现两种错误:thread interference (线程干扰) 和 memory consistency errors (内存一致性错误)。防止这些错误所需的工具是 synchronization (同步)。
同步是围绕称为 intrinsic lock (内部锁) 或 monitor lock (监视器锁) 的内部实体构建的。(API 规范通常将此实体简称为“监视器”。)内部锁在同步的两个方面都发挥作用:强制对对象状态进行独占访问,并建立对可见性至关重要的 happens-before 关系。
本文是介绍 Java 基本 I/O 。
I/O(Input/Outpu) 即输入/输出 。从计算机结构的视角来看的话, I/O 描述了计算机系统与外部设备之间通信的过程。从应用程序的视角来看的话,应用程序对操作系统的内核发起 IO 调用(系统调用),操作系统负责的内核执行具体的 IO 操作。
为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为 用户空间(User space) 和 内核空间(Kernel space ) 。用户进程想要执行 IO 操作的话,必须通过 系统调用 来间接访问内核空间。
当应用程序发起 I/O 调用后,会经历两个步骤:
在开发过程中接触最多的就是磁盘 IO(读写文件)和 网络 IO(网络请求和响应)。UNIX 系统下, IO 模型一共有5种: 同步阻塞 I/O、同步非阻塞 I/O、I/O多路复用、信号驱动 I/O和异步I/O。