木西笔记

个人博客

新的开始

使用 Hexo 搭建博客的新的体验

Hexo Hexo被称为是最佳的静态博客程序之一,然而其繁琐的环境搭建、构建,发布过程,让很多人望之却步.转而使用了传统的WordPress等博客程序,抛开维护成本不说,本着折腾一切的心态 最终研究出了一套完善的自动部署方案。 如何实现优雅的发布 就目前而言,Hexo发布的方式有以下几种: 原始方式,即在本地搭建相关环境,编写md文件后,手动hexo g生成静态文件,然后通过hexo ...

Java垃圾回收详解(7)

G1 详解之一 G1 垃圾回收的过程

G1 概要 G1 的特点 Garbage First G1的设计原则是"首先收集尽可能多的垃圾(Garbage First)"。因此,G1并不会等内存耗尽(串行、并行)或者快耗尽(CMS)的时候开始垃圾收集,而是在内部采用了启发式算法,在老年代找出具有高收集收益的分区进行收集。同时G1可以根据用户设置的暂停时间目标自动调整年轻代和总堆大小,暂停目标越短年轻代空间越小、总空...

Java垃圾回收详解(3)

GC Roots分析

概诉 上一篇介绍了GC的各种垃圾收集器的算法,本节详细讨论几个细节问题。 GC Roots详解 GC ROOTs包含了那些对象 虚拟机栈(栈帧中的本地变量表)中引用的对象。 方法区中类静态属性引用的对象。 方法区中常量引用的对象。 本地方法栈中 JNI (即 native 方法)引用的对象。 分代回收算法中非当前GC年代的其他对象。 如何识别“垃圾对象”? 为什么需要引用? 如前所述:在...

Java垃圾回收详解(2)

GC方式介绍

为什么需要GC? 当程序创建对象、数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中,当这块内存不再被任何引用变量引用时,这块内存就变成垃圾,等待垃圾回收机制进行回收。在C和C++中,垃圾的回收是由程序员来手动执行,虽然实时性比较好,但由于内存分配和回收代码繁琐,较容易出错,内存泄露问题比较常见。于是一些语言如Java、python、Go等,通过程序实现了自...

Java垃圾回收详解(1)

对象内存申请

Java虚拟机内存管理 Java虚拟机把内存分为几个不同的数据区,如下: Java栈 JVM规范要求:每个Java线程拥有自己私有独享的JVM栈,JVM栈随着线程启动产生,线程结束而消亡。栈区内存由编译器自动分配释放,线程在执行一个方法时会创建一个对应的栈帧(Stack Frame),栈以帧为单位保存线程的状态,栈帧负责存储局部变量变量表、操作数栈、动态链接和方法返回地址等信息。 栈帧 ...

源码分析系列(1)

hashMap 源码分析

MAP 类继承图 HashMap: KV结构,高效 无序 key为null,但是只允许有一个key为null,再次说明, HashMap不是线程安全的。 LinkedHashMap: LinkedHashMap是HashMap的子类,它将保持记录的插入顺序。 TreeMap: TreeMap实现了SortedMap接口,很明显,他将对插入的记录排序, HashMap 内部结构 首先来看...

Java内存模型(2)-- Java对象内存布局

Java对象内存布局

Java对象内存布局 我们知道在Java中基本数据类型的大小,例如int类型占4个字节、long类型占8个字节,那么Integer对象和Long对象会占用多少内存呢?本文介绍一下Java对象在堆中的内存结构以及对象大小的计算。 对象的内存布局 一个Java对象在内存中包括对象头、实例数据和补齐填充3个部分: 对象头 Mark Word:包含一系列的标记位,比如轻量级锁的标记位,偏向锁标记...