木西笔记

个人博客

深入理解java泛型

泛型是什么一说到泛型,大伙肯定不会陌生,我们代码里面有很多类似这样的语句: 1List<T> list=new ArrayList<T> ArrayList就是个泛型类,我们通过设定不同的类型,可以往集合里面存储不同类型的数据类型(而且只能存储设定的数据类型,这是泛型的优势之一)。“泛型”简单的意思就是泛指的类型(参数化类型)。想象下这样的场景:如果我们现在要写一个容...

JVM 替换PermGem 为 Meta Space

背景 永久代(PermGen)在哪里?根据,hotspot jvm结构如下(虚拟机栈和本地方法栈合一起了): 上图引自网络,但有个问题:方法区和heap堆都是线程共享的内存区域。 关于方法区和永久代: 在HotSpot JVM中,这次讨论的永久代,就是上图的方法区(JVM规范中称为方法区)。《Java虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。在其他JVM上...

新的开始

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

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

Java垃圾回收详解(7)

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

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

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

Java对象内存布局

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