Java的对象头结构
对象除了我们自定义的一些属性外,在HotSpot虚拟机中,对象在内存中还可以分为三个区域:对象头、实例数据、对齐填充,这三个区域组成起来才是一个完整的对象。本文将对于对象头部分的结构进行讨论。 1. 对象的内存布局对象在内存中可以分为三个区域,分别为对象头、实例数据、对齐填充。 对象头: 为本文的讨论重点,下文将会讨论; 实例数据: 存放类的属性数据信息,包括父类的属性信息; 对齐填充: 由于虚拟机要求 对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐。 2. 对象头对象头中存储了对象是很多java内部的信息,如hash码、对象所属的年代、对象锁、锁状态标志、偏向锁(线程)ID、偏向时间等,Java对象头一般占有2个机器码。 在32位虚拟机中,1个机器码等于4字节,也就是32bit,在64位虚拟机中,1个机器码是8个字节,也就是64bit 其中,如果对象是数组类型,则需要三个机器码。因为JVM虚拟机可以通过Java对象的元数据信息确定Java对象的大小,但是无法从数组的元数据来确认数组的大小,所以用一块区域用来记录数组长度。 HotSp...
Netty入门
二. Netty 入门1. 概述1.1 Netty 是什么?12Netty is an asynchronous event-driven network application frameworkfor rapid development of maintainable high performance protocol servers & clients. Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端 1.2 Netty 的作者 他还是另一个著名网络应用框架 Mina 的重要贡献者 1.3 Netty 的地位Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位 以下的框架都使用了 Netty,因为它们有网络通信需求! Cassandra - nosql 数据库 Spark - 大数据分布式计算框架 Hadoop - 大数据分布式存储框架 RocketMQ - ali 开源的消息队列 ElasticSearch - 搜索引擎 gRPC - rpc 框架 Dubb...
Java内存模型(JMM)
本文要讨论的是Java内存模型(JMM)。它的名字和JVM内存结构(见[[运行时内存详解]])很像,但是他们两个并不在一个层面,解决的问题也不一样。 Java 内存模型定义了 Java 语言如何与内存进行交互,具体地说是 Java 语言运行时的变量,如何与我们的硬件内存进行交互的。 而 JVM 内存模型,指的是 JVM 内存是如何划分的。 JMM是并发编程的基础,只有对JMM有一定了解才能更好的理解Java的一些高级特性,如:volatile等。因此本文将从以下几点进行讨论: 为什么要有Java内存模型? Java内存模型是什么? 并发编程的三个重要特性 1. 为什么要有Java内存模型?Java是从JDK1.5之后才开始使用新的Java内存模型。一般来说,编程语言是可以直接使用操作系统的内存模型的。但是由于Java是一个跨平台的语言,要求JVM层面屏蔽掉不同操作系统和不同硬件的差异。因此自定义了一套Java内存模型。 Java虚拟机规范中定义的Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java...
ReentrantLock详解(一)—— 加锁和解锁
本文将从以下角度来介绍ReentrantLock: ReentrantLock介绍; ReentrantLock与synchronized的关系; ReentrantLock的原理; 1. ReentrantLock介绍JDK1.5新增了并发包,里面包含Lock接口,与synchronized关键字一样能实现同步功能。但相比synchronized,Lock更加灵活,可以手动获取、释放锁,而ReentrantLock就是Lock的一个实现类。接下来先介绍其基本使用。 1.1 ReentrantLock的基本使用以下是一段是使用5个线程,并发对count做加一操作。使用ReentrantLock来保证线程安全。 123456789101112131415161718192021222324252627282930class AddRunnable implements Runnable{ @Override public void run() { for (int i = 0; i < 10000; i++) ...
ReentrantLock详解(二)
上一篇[[ReentrantLock详解(一)—— 加锁和解锁]]讲了ReentrantLock的基本使用,和比较基础的加解锁原理以及流程。本文来继续讨论剩下的一些比较重要的部分。有: 公平锁和非公平锁的实现区别; 绑定条件阻塞和唤醒的实现,解析AQS中的ConditionObject; 1. 公平锁和非公平锁^b9c966 ReentrantLock在创建的时候,可以指定其是否为公平锁。默认为非公平锁(非公平锁的性能相对较高),构造函数传false则为公平锁。 123public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); } 两者大部分实现都是一致的,只有在加锁的时候略有区别。源码如下: 1.1 公平锁1234567891011121314151617181920212223242526272829303132// 由于之前的文章已经讨论过公平锁的源码,因此不再重复注释。final void lock() {...
ReentrantReadWriteLock详解
本文来讨论ReentrantReadWriteLock的实现原理。本文的内容客观上看不算太难,但是内容相对较多,需要有一定AQS的基础,如:AQS、独占锁、共享锁等。这些内容可以参考之前的一些文章,如:[[ReentrantLock详解(一)—— 加锁和解锁|ReentrantLock详解]]、[[CountDownLatch详解]]、[[CyclicBarrier详解]]等。 1. ReentrantReadWriteLock是什么?翻译过来,名为读写锁。其中有两个锁示例,用于分别对读操作和写操作进行同步控制。其中读锁是共享锁,可以同时被多个线程同时使用,写锁是独占锁,只能由一个线程持有。且持有写锁的时候可以获取读锁,但是持有读锁的时候无法持有写锁。 OK,现在还是老规矩,直接看看JavaDoc中给出的例子: 1234567891011121314151617181920212223242526272829303132class CachedData { Object data; volatile boolean cacheValid; fina...
Mac解决 "已损坏,无法打开。 你应该将它移到废纸篓"
1、 允许“任何来源”开启苹果从macOS Sierra 10.12 开始,已经去除了允许“任何来源”的选项,如果不开启“任何来源”的选项,会直接影响到无法运行的第三方应用。 所以开启“任何来源”的方法如下: 打开【启动台】,选择【终端】,输入: 1sudo spctl --master-disable 然后回车,继续输入密码(密码输入时是不可见的),然后回车。 接着打开【系统偏好设置】,选择【安全性与隐私】,选择【通用】,可以看到【任何来源】已经选定。 接着打开文件进行安装。 2、 若发现还是显示“已损坏,无法打开您应该将它移到废纸篓”,不急,接下来用这种方法: 在终端粘贴复制输入命令(注意最后有一个空格): 1sudo xattr -r -d com.apple.quarantine 先不要按回车!先不要按回车!先不要按回车!先不要按回车! 然后打开 **“访达”(Finder)**进入 “应用程序” 目录,找到该软件图标,将图标拖到刚才的终端窗口里面,会得到如下组合(如图所示): 1sudo xattr -r -d com.apple.quarantine /App...
ThreadLocal详解
在多线程环境下,解决线程安全问题的方案主要分三个方案:互斥同步(如Syncrhonize)、非阻塞同步(如CAS)、线程封闭(局部变量、ThreadLocal)。本文将讨论其中的ThreadLocal的实现原理。 1. ThreadLocal是什么ThreadLocal是一个线程级别的变量,主要用于多线程环境下,无需线程间共享的变量。当每个线程都维护属于自己线程的变量,线程间是隔离的,那么也就彻底消除了线程间的竞争,消除了线程安全问题。 ThreadLocal的使用方法很简单,如下: 1234567891011121314151617public static void main(String[] args) throws InterruptedException { ThreadLocal<Integer> threadLocal = new ThreadLocal<>(); ExecutorService service = Executors.newSingleThreadExecutor(); s...
Learning to Classify A Flow Based Relation Network for Encrypted Traffic Classification
加密流量分类的挑战性问题: 网络数据的不平衡性 模型对真实数据的泛化能力 模型对数据大小的过度依赖。 1、概念介绍1.1 流量加密背景加密技术虽然保护了互联网用户的自由、隐私和匿名性,但也用户避开了防火墙的检测,绕过了监控系统。 由此导致的问题: 攻击者通过加密恶意软件流量来匿名入侵和攻击系统。 犯罪分子使用隐私增强工具(例如Tor)穿透黑暗网络,在那里他们可以购买毒品、武器和伪造的文件(如护照、驾照、提供合同杀手的媒体)来吸引客户. 1.2 流量分类技术的发展(综述部分) 基于端口号 基于有效载荷,也就是DPI方法。1,2只能针对非加密流量 基于流统计特征的方法,分类性能取决于人类的特征工程 基于深度学习的方法: 优点:端到端、具有相当高的学习能力 缺点: 不能解决数据中类的不均衡问题 训练好的模型不能很好适用于真是流量环境,泛化能力差 过分依赖数据集的大小与数据分布的好坏 1.4 文章核心观点引入对于一个新奇概念的样本,人类可以轻易根据对事物共同变化模式的了解,想象该样本在其他环境的样子。如果机器从辨别出在不同环境(原文这里称作幻觉(hallucinat...
扫盲——脏读、不可重复读、幻读
MySQL的InnoDB存储引擎是支持多个事物并发执行的,这虽然提高了性能,但同时也带来了一些并发的问题。具体来说就是:脏读、不可重复读、幻读。本文来解释这几种现象是什么意思。 1. 脏读脏读就是在事务A中可以读到未提交的事务B中的数据。这些数据由于是未提交的,那么也可能会回滚。因此事务A可能会读到一些不存在的数据,这就是脏读。 事务A 事务B 开始事务 开始事务 更新数据x 查询到未提交的x数据 回滚数据 2. 不可重复读不可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况。举个例子: 事务A 事务B 开始事务 开始事务 第一次查询数据x 修改数据x 提交事务 第二次查询数据x 这种情况下,就会出现在同一个事务内,多次查询同一条数据结果不一致的情况。 3. 幻读幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。例如:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,...