在 JDK 1.8 版本之前,HashMap 底层的数据结构是数组 + 链表,如下图: 在 1.8 及以后是数组 + 链表 + 红黑树 重要的几个变量 DEFAULT_INITIAL_CAPACITY = 1 « 4; Hash 表默认初始容量 MAXIMUM_CAPACITY = 1 « 30; 最大 Hash 表容量 DEFAULT_LOAD_FACTOR = 0.75f;默认加载因子 TREEIFY_THRESHOLD = 8;链表转
并发编程之Atomic和Unsafe魔法类
原子操作 原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在多处理器上实现原子操作就变得有点复杂 处理器会保证基本内
并发编程之Semaphore和CountDownLatch的用法
Semaphore Semaphore 是信号量的意思,它的作用是控制访问特定资源的线程数目,底层依赖 AQS 的状态 State,是在生产当中比较常用的一个工具类。 可以理解为许可证,或者令牌。线程想要访问某部分资源时,必须先获取一个许可证,才能
并发编程AQS原理
JDK1.5以前只有synchronized同步锁,并且效率非常低,大神Doug Lea自己写了一套并发框架,这套框架的核心就在于AbstractQueuedSynchronizer类(即AQS),性能
yml配置文件读取
import ( "fmt" "github.com/spf13/viper" "os" "path/filepath" ) type Config struct { DesDir string SourceFiles []string } func loadConfig()(con Config){ home := os.Getenv("HOME") viper.SetConfigFile(filepath.Join(home,"config","syncFile.yml")) viper.SetConfigType("yml") err := viper.ReadInConfig() checkErr(err) err = viper.Unmarshal(&con) checkErr(err) fmt.Printf("config: %v\n", con) return con } func checkErr(err error){ if err != nil { panic(err) } }
bat脚本后台运行exe
新建start.bat文件,输入如下命令: Set ws = CreateObject("Wscript.Shell") ws.run "cmd /c D:/1.exe",vbhide
GC日志详解
对于 java 应用我们可以通过一些配置把程序运行过程中的 gc 日志全部打印出来,然后分析 gc 日志得到关键性指标,分析 GC 原因,调优 JVM 参数: 开启 GC 日志相关参数 java -jar ‐Xloggc:./gc‐%t.log ‐XX:+Prin
java常量池
Class常量池 Class常量池可以理解为class文件中的资源仓库,class 文件中除了包含类信息,方法,字段,接口信息之外还有常量池信息,用于存放编译期生成的各种字面量和符号引用。 如下: 常量池主要
并发编程中的可见性,原子性,有序性问题
java内存模型 (JMM) 这种模型和 jvm 中的堆不同, JMM 是抽象概念,不真实存在。它是一种规范,指定了程序中的各变量的访问方式 主内存 JMM 规定所有变量都存放在主内存,主内存是所有线程共享的,但是线程的操作在线程
JVM调优工具
jps 查看启动的 java 进程 jmap 实例个数与内存占用 看内存信息,实例个数以及占用内存大小 [C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][] 堆信息 jump -heap 17680 导出堆内存占用信
G1垃圾收集器
G1 (Garbage-First) 是一款面向服务器的垃圾收集器,主要针对多颗处理器及大容量内存的机器,具备极短的 GC 停顿时间和高吞吐量的特征. G1 堆内存划分 G1 不像 CMS 那样,老年代和年轻代不再有明显的区分。而是将内存分为很多和区域(Reg
CMS垃圾回收器与三色标记算法
垃圾收集算法 整体可以分为以下几种算法: 标记复制算法 标记整理算法 标记清除算法 分代收集理论 目前的虚拟机的垃圾回收器都是采用分代收集算法,一般根据对象存活周期的不同,将内存分为几块,一般将java堆分为新生
查看ES集群信息
健康信息 命令 curl-X GET"localhost:9200/_cluster/health" 结果
jvm对象的内存分配与回收
对象分配过程简略流程图 对象栈上分配 我们都知道对象分配在堆上,当对象没有被引用时就会当成垃圾回收,如果对象数量比较多,会给GC带来较大的压力,影响性能,为了减少临时对象在堆内的分配次数,JVM 通过逃逸分
jvm中对象的创建过程
1. 类加载检查 虚拟机遇到一条 new 指令时,首先检查这个指令的参数能否在常量池中找到一个类符号引用,并且检查这个符号引用代表的类是否已经被加载,解析,初始化过。如果没有必须先执行类的加载初始化过程。 2. 分配内存