-
【JVM】直接内存(十二)
摘要:一、直接内存概述 直接内存 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存是在Java堆外的、直接向系统申请的内存区间。 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 通常,访问直接内存的速度会优于Java堆。即读写性能高
阅读全文
-
【JVM】对象的实例化与内存布局(十一)
摘要:一、对象的实例化 对象创建的方式 1.1、new 关键字 ① 最常见的方式就是直接 new 加构造器的方式创建 ② 变形一:XXX(类名). 静态方法,本质这种方式还去调用类中构造器,比如说:单例模式、日历类(Calendar) 和一些工具类等等。 ③ 变形二:XXXBuilder / XXXFac
阅读全文
-
【Java】Java NIO Path和Files(五)
摘要:一、文件I/O基石:Path Java7中文件IO发生了很大的变化,专门引入了很多新的类来取代原来的基于java.io.File的文件IO操作方式: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem; impo
阅读全文
-
【Java】Java NIO之Selector 选择器(四)
摘要:一、Selector(选择器)介绍 Selector 一般称 为选择器 ,当然你也可以翻译为 多路复用器 。它是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel(通道)的状态是否处于可读、可写。如此可以实现单线程管理多个channels,也就是可以管理多个网络链接。 为什么
阅读全文
-
【Java】Java NIO 之 Channel 通道(三)
摘要:一、Channel(通道)介绍 通常来说NIO中的所有IO都是从 Channel(通道) 开始的。 从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。 从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。 数据读取和写入操作图示: Java NIO Channel通道和流非
阅读全文
-
【Java】Java NIO 之 Buffer 缓冲区(二)
摘要:一、Buffer(缓冲区)介绍 1.1、Buffer(缓冲区)介绍 Java NIO Buffers用于和NIO Channel交互。 我们从Channel中读取数据到buffers里,从Buffer把数据写入到Channels. Buffer本质上就是一块内存区,可以用来写入数据,并在稍后读取出来
阅读全文
-
【Java】Java NIO 概览(一)
摘要:一、Java NIO简介 Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作
阅读全文
-
【Java多线程】原子操作的实现原理
摘要:原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。在多处理器上实现原子操作就变得有点复杂。让我们一起来聊一聊在Intel处理器和Java里是如何实现原子操作的。 1. 术语定义 在了解原子操作的实现原理前,先
阅读全文
-
【Java多线程】synchronized 关键字解析(七)
摘要:一、synchronized基础 synchronized关键字在需要原子性、可见性和有序性这三种特性的时候都可以作为其中一种解决方案,看起来是“万能”的。的确,大部分并发控制操作都能使用synchronized来完成。在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重
阅读全文
-
【JVM】运行时数据区总结(十一)
摘要:运行时举例 图解示例 代码 1 public class RuntimeDemo { 2 public static void main(String[] args) { 3 int x = 500; 4 int y = 100; 5 int a = x / y; 6 int b = 50; 7 S
阅读全文
-
【JVM】方法区(十)
摘要:1、栈 堆 方法区的交互关系 从内存结构来看 从线程共享与否的角度来看 栈、堆、方法区的交互关系 下面就涉及了对象的访问定位 Person 类的 .class 信息存放在方法区中 person 变量存放在 Java 栈的局部变量表中 真正的 person 对象存放在 Java 堆中 在 person
阅读全文
-
【Java多线程】CPU多级缓存与缓存一致性(六)
摘要:一、什么是CPU缓存 1. CPU缓存的来历 众所周知,CPU是计算机的大脑,它负责执行程序的指令,而内存负责存数据, 包括程序自身的数据。在很多年前,CPU的频率与内存总线的频率在同一层面上。内存的访问速度仅比寄存器慢一些。但是,这一局面在上世纪90年代被打破了。CPU的频率大大提升,但内存总线的
阅读全文
-
【Java】单例模式双重检查锁(double-checked locking)
摘要:双重锁校验单例 代码如下: 1 public class DoubleCheckedLock { 2 3 // 使用volatile修饰禁止重排序 4 private volatile static DoubleCheckedLock instance; 5 6 private DoubleChec
阅读全文
-
【Java多线程】volatile关键字解析(五)
摘要:一、volatile是什么 volatile在java语言中是一个关键字,用于修饰变量。被volatile修饰的变量后,表示这个变量在不同线程中是共享,编译器与运行时都会注意到这个变量是共享的,因此不会对该变量进行重排序。 volatile关键字的两层语义 一旦一个共享变量(类的成员变量、类的静态成
阅读全文
-
【Java多线程】JMM(Java内存模型)(四)
摘要:什么是JMM JMM即为JAVA 内存模型(java memory model)。因为在不同的硬件生产商和不同的操作系统下,内存的访问逻辑有一定的差异,结果就是当你的代码在某个系统环境下运行良好,并且线程安全,但是换了个系统就出现各种问题。Java内存模型,就是为了屏蔽系统和硬件的差异,让一套代码在
阅读全文
-
【JVM】堆中GC与对象分配内存(九)
摘要:本章节内容接上一章【JVM】堆内部划分与对象分配(八) 五、GC 垃圾回收器 5.1、分代收集思想 Minor GC、Major GC、Full GC 我们都知道,JVM的调优的一个环节,也就是垃圾收集,我们需要尽量的避免垃圾回收,因为在垃圾回收的过程中,容易出现STW(Stop the World
阅读全文
-
【JVM】堆内部划分与对象分配(八)
摘要:一、堆的核心概述 1.1、认识堆内存 堆与进程 堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM 但是进程包含多个线程,他们是共享同一堆空间的 对堆的认识 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。 Java堆区在JVM启动的时候即被创建,其空间大小也就确定了,
阅读全文
-
【Java】Java对象的序列化和反序列化
摘要:对象序列化 对象序列化机制允许把内存中的Java对象转换成与平台无关的二进制流,从而可以保存到磁盘或者进行网络传输,其它程序获得这个二进制流后可以将其恢复成原来的Java对象。 序列化机制可以使对象可以脱离程序的运行而对立存在 序列化的含义和意义 序列化 序列化机制可以使对象可以脱离程序的运行而对立
阅读全文
-
【Java】IO流
摘要:一、IO流基本概念 1.1、比特(Bit)、字节(Byte)、字符(Char) Bit 位,是计算机最小的二进制单位 ,取0或1,主要用于计算机操作。 Byte 字节,是数据的最小单位,由8位bit组成,取值(-128-127),主要用于计算机操作数据。 Char 字符,是用户可读写的最小单位,由1
阅读全文
-
【Vue】Vue 项目搭建(二)
摘要:相关概念 1、npm: Nodejs下的包管理器。 2、webpack: 它主要的用途是通过CommonJS的语法,把所有浏览器端需要发布的静态资源,做相应的准备,比如资源的合并和打包。 3、vue-cli: 用户生成Vue工程模板。(帮你快速开始一个vue的项目,也就是给你一套vue的结构,包含基
阅读全文
-
【Vue】Vue 快速入门(一)
摘要:Vue 快速入门 Vue介绍 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结
阅读全文
-
【JVM】本地方法栈(七)
摘要:一、本地方法栈 本地方法栈的特点 Java虚拟机栈于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。 本地方法栈,也是线程私有的。 允许被实现成固定或者是可动态扩展的内存大小(在内存溢出方面和虚拟机栈相同) 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个
阅读全文
-
【JVM】本地方法接口(六)
摘要:一、本地方法 什么是本地方法? 简单地讲,一个Native Method是一个Java调用非Java代码的接囗 一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。 这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用ext
阅读全文
-
【JVM】虚拟机栈(五)
摘要:一、虚拟机栈概述 1.1、虚拟机栈的出现背景 文档网址 https://docs.oracle.com/javase/specs/jvms/se8/html/index.html 虚拟机栈出现的背景 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存
阅读全文
-
【Java多线程】ThreadLocal的使用和实现原理(三)
摘要:ThreadLocal是什么? ThreadLocal提供线程本地变量,每个线程拥有本地变量的副本,各个线程之间的变量互不干扰。ThreadLocal实现在多线程环境下去保证变量的安全。以下来源于ThreadLocal类的注释。 This class provides thread-local va
阅读全文
-
【JVM】程序计数器(四)
摘要:一、PC 寄存器概述 PC 寄存器介绍 JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。 这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指
阅读全文
-
【JVM】运行时数据区概述及线程(三)
摘要:一、前言 本节主要讲的是运行时数据区,也就是下图中间部分,它是在类加载完成后的阶段 通过前面的:类的加载 --> 验证 --> 准备 --> 解析 --> 初始化,这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区 二、运行时数据区结构 2.1、运行时数据区
阅读全文
-
【JVM】类加载子系统(二)
摘要:一、内存结构概述 如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢? 类加载器 执行引擎 完整框图: 二、类加载子系统 2.1、类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件
阅读全文
-
【JVM】JVM和Java 体系架构(一)
摘要:Java是一门可以跨平台的语言,但是Java本身是不可以实现跨平台的,需要JVM实现跨平台。javac编译好后的class文件,在Windows、Linux、Mac等系统上,只要该系统安装对应的Java虚拟机,class文件都可以运行。达到”一次编译,到处运行”的效果。 一、虚拟机介绍 1.1、虚拟
阅读全文
-
【Java多线程】Java线程生命周期、线程同步、线程通信(二)
摘要:线程生命周期 JDK中用Thread.State类定义了线程的几种状态 要想实现多线程,必须在主线程中创建新的线程对象。Java语言使用Thread类 及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下的五种状态: 新建: 当一个Thread类或其子类的对象被声明并创建时,新生的线程
阅读全文
|