谈起GC,应该是让Java程序员最激动的一项技术,我相信每个Java程序员都有探究GC本质的冲动! 本篇博客围绕三个问题展开: 1.哪些内存需要回收? 2.什么时候回收? 3.如何回收? 哪些内存需要回收 首先回答第一个问题:不再使用的对象需要进行回收,不使用的类也有可能回收。 那么我们如何判断一个对象不再使用呢?主要有以下两种方法。 引用计数算法 定义:给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器就减一;任何时刻计数器为0的对象就是不会被使用的对象。 我们可以看出,引用技术方法实现简单。并且有一些GC中确实使用的是引用计数算法,但是在Java虚拟机中并没有使用这个方法进行内存管理,原因就是一个问题很难被解决—对象之间循环引用。 来看一个例子: class Node { Node next ; } Node a = new Node (); Node b = new Node (); 继续阅读 >>


董恒毅 17/12/20 20:26:28
前面学习了Class文件结构、类的加载机制、字节码执行引擎、对象的创建与销毁,所以我准备从一个Java代码进行切入,详细剖析它的生命历程,将所学的知识真正的用起来,也算是对前面所学的知识进行一个系统的总结。 我们以这份Java代码为例,来剖析一个Java程序的生命历程: interface ClassName { String getClassName(); } class Company implements ClassName { String className; public Company(String className) { this.className = className; } @Override public String getClassName() { return className; } } public class Main { public static v 继续阅读 >>


董恒毅 17/12/17 12:52:20
在前几篇博客中,我们探究了.class文件的本质,类的加载机制,JVM运行时的栈帧结构以及字节码执行时对应操作数栈以及局部变量表的变化。 如果你已经掌握了这些东西,你现在应该会有一种感觉,给你一个Java代码,你可以从JVM的层面上将这个类从javac编译成.class文件开始,到使用java命令运行这个Class文件,然后这个类的运行过程是怎么样的,你可以解释清楚。 但是等等,好像少了点什么?我们好像没有谈及JVM中对象的创建?也就是说,在Java代码中,你new一个对象,这时候都发生哪些事情,这就是今天我所要说的。 对象创建的时机 我们先不说对象创建的具体过程是啥,我们先来谈一谈什么时候JVM会创建对象。 以下5种方式,会使JVM帮助你创建一个对象: 使用new关键字创建对象 Student student = new Student(); 使用Class类的newInstance方法(反射机制) newInstance方法只能调用无参的构造器创建对象。 继续阅读 >>


董恒毅 17/12/12 11:40:51
这篇博客主要带你认识何谓静态链接、动态链接。并且会讲述JVM中分派的知识,让你对Java中的多态实现机制有一个浅显的认识。 前言 从接触Java语言的第一天起,往后,我相信你一定听过什么动态链接啊,动态扩展啊,静态链接啊,它和C++相比有哪些优缺点啊… …如果你只是听说而没有探究过他们,也许你现在仍没办法说出Java语言到底有什么优缺点。 我们知道class文件是源代码经过编译后得到的字节码,如果学过编译原理会知道,这个仅仅完成了一半的工作(词法分析、语法分析、语义分析、中间代码生成),接下来就是实际的运行了。而Java选择的是动态链接的方式,即用到某个类再加载进内存,而不是像C++那样使用静态链接:将所有类加载,不论是否使用到。当然了,孰优孰劣不好判断。静态链接优点在速度,动态链接优点在灵活。 静态链接 那么,首先,咱们先来聊聊静态链接。 如上面的概念所述,在C/C++中静态链接就是在编译期将所有类加载并找到他们的直接引用,不论是否使用到。而在Java中我们知道,编译Jav 继续阅读 >>


董恒毅 17/12/09 22:46:52
本篇博客信息量依旧庞大! 前言 在讨论本文的主题之前,我们先来思考一下:什么是虚拟机字节码执行引擎?它有什么作用? 在说明这个问题之前,我们先来想想之前我们已经学习过的class文件结构与类加载机制。 当一个Java程序写好之后,我们使用javac命令对其进行编译,产生的虚拟机字节码存储在class文件中,我在JVM–解析Class类文件结构一文中详细分析了class文件中字节码的存储格式及其组成。然后我们紧接着说明了JVM–详解类加载机制,你应该了解到—类加载机制就是将class文件中的字节码加载进JVM的方法区并生成这个类的class对象的过程(再次强调不是生成这个类的实例化对象的过程)。 虚拟机字节码执行引擎 那么,现在我们言归正传,解决上面的两个问题: 假设我们现在有这样一个类: public class Demo { public static void main(String[] args) { System.out.println 继续阅读 >>


董恒毅 17/12/08 23:55:35
由于系统重起了,当然本地的仓储和SSH生成的密钥就都没有了,这时如何在本地pull自己在GitHub上的仓储呢? 由于系统重装,~/.ssh文件肯定就没有了,这时候就需要重新生成公钥和密钥。 ssh-keygen -t rsa -C “your_email@example.com” Enter file in which to save the key (/home/XXX/.ssh/id_rsa): Created directory ‘/home/XXX/.ssh’. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/XXX/.ssh/id_rsa. Your public key has been saved in /home/XXX/.ssh/id_rsa.pub. The key fing 继续阅读 >>


董恒毅 17/12/07 00:01:23
原文链接:聊一聊 cookie 作者:championhengyi 发表于 2017/12/04 17:45:03 原文链接 http://blog.csdn.net/championhengyi/article/details/78712027 阅读:104 继续阅读 >>


董恒毅 17/12/04 17:45:03
原文链接:彻底理解js中this的指向 作者:championhengyi 发表于 2017/12/03 11:56:38 原文链接 https://blog.csdn.net/championhengyi/article/details/78700726 阅读:107 继续阅读 >>


董恒毅 17/12/03 11:56:38
原文链接:深入理解javascript中的立即执行函数(function(){…})() 作者:championhengyi 发表于 2017/12/01 22:20:09 原文链接 https://blog.csdn.net/championhengyi/article/details/78691672 阅读:123 继续阅读 >>


董恒毅 17/12/01 22:20:09
这篇博客—干货很多!!! Java虚拟机的体系结构 前面我们探讨了Class文件的结构,如果你还没有学习,将不利于这部分知识的吸收与掌握,所以请移步:JVM–Class类文件结构(一) 学习一个东西之前,我们务必要知道,这东西大概是干什么的,有什么作用。 为了更清楚的阐释类加载机制到底是干什么的,我先将JVM的结构图贴给大家: 如上图,我们要学的类加载机制就是要搞清楚类加载器是如何找到指定的Class文件以及怎样将Class文件装载进内存,以便执行引擎执行Class文件中存在的数据和指令,从而使你的Java程序跑起来。 上面的黑体字就是这玩意大概是干啥的,至于学习它有什么作用,有助于你了解Java源代码是怎么从一个普通的文件变成一个可以正在运行的程序这其中的过程。而且,学习了这部分知识,你再回过头看反射机制,会有一种醍醐灌顶的感觉。 类的生命周期 先来看一下类的生命周期吧: 结合上图,类加载机制主要学习加载、验证、准备、解析、初识化这些过程,然后就是需要了解真正 继续阅读 >>


董恒毅 17/12/01 15:56:09