java

7.2 jvm之io字节流

字节输入流 字节输入流概括 值得注意的地方有: Level 2的输入流,大多数都会指明数据源的形式:例如ByteArray,File,Piped Level 3的输入流,则不会出现具体的数据源名字,而是以功能取代:例如Buffered,LineNumber 所以说Level 3的输入流是对Level 2输入流的“封装和过滤”。实际上Level 3的输入流,都继承于FilterInputStream的输入流。 input stream介绍 ByteArrayInputStream 从内存中每次读取一个字节的数据,然后保存到内置的缓冲区中。维持一个计数器用来记录从数据源中读入的字节数目。 调用该输入流的close()方法不会产生任何实际的作用。因为它“关闭”的对象是---内存。

  • developer
4 min read
java

7.1 jvm之io字符流

字符输入流 字符输入流概括 Level 2的输入流,大多数都会指明数据源的形式:例如CharArray,String,File Level 3的输入流,则不会在出现具体的数据源名字,而是以功能取代。例如:Buffered,LineNumber 但是和基于字节的输入流结构不同,FileInputStream是直接继承于InputStream类(基础类)的。但是FileReader却是继承于InputStreamReader的。看看下面的结构: java.io.Reader (implements java.io.Closeable, java.lang.Readable) java.io.

  • developer
5 min read
other

乐观锁与悲观锁

悲观锁 悲观锁是指在用读取锁锁定一块代码的时候,另一个读取锁依然可以进入该代码块,而写锁不可以进入.在用写锁锁定一段代码的时候,读锁和写锁都不能进入该代码块. 乐观锁 乐观锁其实就是写锁优先机制,读锁在锁定某一代码块的时候,如果没有写锁竞争,那么就会获得该锁的权限,如果进行锁定的时候发现有写锁正在竞争,那么就会抛出例外,需要重新操作进行锁定.竞争标志则是 long stamp = lock.tryOptimisticRead();//有竞争返回0 lock.validate(stamp);//有竞争返回true 悲观锁示例 package Test; import java.util.concurrent.locks.ReadWriteLock;

  • 凯文
3 min read
linux

Linux中的终端、控制台、tty、pty

tty(终端设备的统称): tty一词源于teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。 终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。 pty(伪终端,虚拟终端): 但是如果我们远程telnet到主机或使用xterm时不也需要一个终端交互么?是的,这就是虚拟终端pty(pseudo-tty) pts/ptmx(pts/ptmx结合使用,进而实现pty): pts(pseudo-terminal slave)是pty的实现方法,与ptmx(pseudo-terminal master)配合使用实现pty。 终端特殊设备 在Linux系统的设备特殊文件目录/

  • network
4 min read
java

JVM8调优

在JVM里的内存空间,从大的层面划分,主要有新生代空间(Young)和老年代空间(Old),其中Young空间,又被分为2个部分和3个板块,分别是1个Egen区,和2个Survivor区 Eden区域是用来存放使用new或者newInstance等方式创建的对象,默认都是存放在Eden区,除非这个对象太大,或者超过了设定的阈值-XX:PretenureSizeThresold,这样的对象会被直接分配到Old区域 2个Survivor(幸存)区,一般称S0,S1,理论上他们是一样大的 在不断创建对象的过程中,Eden区会满,这时候会开始做Young GC也叫Minor GC,而Young空间的第一次GC就是找出Eden区中,幸存活着的对象,然后将这些对象,放到S0,或S1区中的其中一个,假设第一次选择了S0,

  • 凯文
2 min read
linux

linux权限

为了执行权限检查,Linux 区分两类进程:特权进程(其有效用户标识为 0,也就是超级用户 root)和非特权进程(其有效用户标识为非零)。 特权进程绕过所有内核权限检查,而非特权进程则根据进程凭证(通常为有效 UID,有效 GID 和补充组列表)进行完全权限检查。 以常用的 passwd 命令为例,修改用户密码需要具有 root 权限,而普通用户是没有这个权限的。但是实际上普通用户又可以修改自己的密码,这是怎么回事?在 Linux 的权限控制机制中,有一类比较特殊的权限设置,比如 SUID(

  • network
7 min read
docker

通过ip netns操作docker

创建docker容器后本来应该有新的命名空间(如果有独立网络的话),那么可以通过 ip netns 命令查看到命名空间,但是实际上却看不到。 查过资料才发现,ip netns 只能查看到/var/run/netns 下面的网络命名空间。docker 不像openstack neutron 会自动在这个文件创建命名空间名字,需要手动创建。 创建方法是: pid=`docker inspect -f '{{.State.Pid}}' $container_id` ln -s

  • network
1 min read
linux

linux操作系统虚拟内存

概述 虚拟内存 毋庸置疑,虚拟内存绝对是操作系统中最重要的概念之一。我想主要是由于内存的重要”战略地位”。CPU太快,但容量小且功能单一,其他 I/O 硬件支持各种花式功能,可是相对于 CPU,它们又太慢。于是它们之间就需要一种润滑剂来作为缓冲,这就是内存大显身手的地方。 而在现代操作系统中,多任务已是标配。多任务并行,大大提升了 CPU 利用率,但却引出了多个进程对内存操作的冲突问题,虚拟内存概念的提出就是为了解决这个问题。 上图是虚拟内存最简单也是最直观的解释。 操作系统有一块物理内存(中间的部分),有两个进程(实际会更多)P1 和 P2,

  • network
9 min read
network

浏览器请求报错-block:mixed-content

浏览器控制台报错 Mixed Content: The page was loaded over HTTPS,blocked the content must be served over HTTPS.,。。 原因 是浏览器不允许在https页面里嵌入http的请求,现在高版本的浏览器为了用户体验,都不会弹窗报错,只会在控制台上打印一条错误信息。 最简单的解决办法当然就是不要使用http请求,把网站上的http请求都迁移到https。 也可以页面的head中加入: <meta http-equiv="Content-Security-Policy" content="

  • 凯文
1 min read
java

java之AQS

AQS概述 AQS(AbstractQueuedSynchronizer),类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。 在AQS中维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列) AQS在重入锁中的使用 以ReentrantLock为例,state初始化为0,表示未锁定状态 在ReentrantLock中lock()方法,实际上调用的是AQS的acquire(1)方法;而在acquire(1)中实际上会调用tryAcquire()方法,tryAcquire()方法在AQS中是无方法体的,需要自己实现; unlock(

  • developer
7 min read
linux

linux之标准输入输出

IO 要弄清什么是标准输入输出。首先需要弄懂什么是IO。 IO的I是Input的意思,O是output的意思。 意味着输入和输出。 更确切的含义是 I:从外部设备输入到内存 O:从内存输出到外部设备 标准输入、输出 linux中一切设备皆是文件! 因此标准输入和输出更具体的含义是文件。 它们是/dev/stdin这个文件和/dev/stdout这个文件。 也就是说所谓的标准输入和标准输出其实就是两个linux下的文件。 linux的文件类型有: 1、普通文件2、字符设备文件3、块设备文4、目录文件 5、链接文件6、管道文件7、套接字文件 标准输入逻辑上来看: 就是打开/

  • network
7 min read
linux

linux32位系统与64位系统

cpu的区别 32位系统CPU一次可处理32位数据,即一次处理4个字节。 64位系统CPU一次可处理64位数据,即一次处理8个字节。 通俗一点说:32位,就相当于你拥有32个工人,每次能完成32个工人的工作量;64位,就相当于你拥有64个工人,每次能完成64个工人的工作量 总结:由32位系统过渡到64位系统,CPU处理数据能力提升了一倍。 寻址能力 内存中一个地址占用8bit,即一个字节,32位cpu含有32根地址线,寻址能力为2的32次方个字节,相当于4G内存(所以,如果我们装32位系统,安装8G内存实际上是没有用的)。而64位cpu理论上寻址能力为2的64次方个字节,但目前硬件还达不到这个水准,当然我们用不了这么大的内存。 总结 64位CPU有更大的寻址能力。 64位系统下运行64位软件比32位系统运行32位软件要快,但是,64位系统运行32位软件跟32位系统运行32位软件速度应该是一样的。 附1,

  • network
1 min read
network

网络NAT超时时间

NAT超时 因为IPv4地址不足, 或者我们想通过无线路由器上网, 我们的设备可能会处在一个NAT设备的后面, 生活中最常见的NAT设备是家用路由器. NAT设备会在IP封包通过设备时修改源/目的IP地址. 对于家用路由器来说, 使用的是网络地址端口转换(NAPT), 它不仅改IP, 还修改TCP和UDP协议的端口号, 这样就能让内网中的设备共用同一个外网IP. 举个例子, NAPT维护一个类似下表的NAT表 内网地址 外网地址 192.168.0.2:5566 120.132.92.21:9200 192.168.0.3:7788 120.

  • network
1 min read