浅谈Java虚拟机(5):垃圾回收机制之垃圾收集

上一篇文章介绍了垃圾回收机制中是如何通过对象引用判断对象是否死亡。本文将继续介绍,接下来垃圾收集器会如何回收这些已经死亡的对象。垃圾收集器的实现有多种多样,针对不同的应用场景可以使用对应的垃圾收集器来进行垃圾回收。

浅谈Java虚拟机(4):垃圾回收机制之对象引用

Java语言的成功很大一部分也得益于它的垃圾回收机制,这与C++等语言的内存回收方式发生了巨大的改变。了解过C++语言的应该要很清楚当我们有不用的对象时,我们必须进行手动的释放内存。但是写Java的程序员通常都不用理会那些不再使用的对象,在Java虚拟机中有一个充当『保姆』角色的垃圾回收器,由它来负责为我们打扫产生的垃圾。

前面文章介绍过虚拟机中的内存模型,内存回收当然也是基于这模型来进行。我们清楚知道不同的内存划分区域具有不同的职责。如:程序计数器、Java栈、本地方法栈三个区域都是与线程相关的,随线程而生、随线程而灭。而栈中的栈帧一开始所需要的内存空间在类结构确定的时候就知道大小了,随着方法执行的结束,对应的栈帧也就自然跟着回收了。这几个区域的内存分配和回收都是相对确定的,不需要而外来进行回收。垃圾回收器所关心的是那些动态分配的内存,如在Java堆和方法区上的内存。

浅谈Java虚拟机(3):类是如何加载的

上一篇文章介绍了Java的内存模型,对JVM的内存组织结构和各个内存区域有一个整体的了解。本文将详细描述Java虚拟机中的类加载器,类加载器负责将.class后缀的字节码文件加载到内存中,只有加载到内存了,才能让后面的执行引擎进行执行。接下来,让我们看看Java类加载器是如何进行加载的。

刚接触计算机的时候,我们都会被告知计算机的世界里只有0和1,如果要在计算机上运行,程序编译后应该也都是0和1才对,不然计算机是不能认识的。但是为什么虚拟机加载的是.class后缀的字节码文件呢?前一章,我们讲到了Java的平台无关性,既然要做到平台无关性,那么就必须抽象出一套自己的指令处理系统,而编译处理的字节码中的命令正是虚拟机能识别的指令。有人也把虚拟机称为解释器,就是负责解释执行字节码文件中的指令。

浅谈Java虚拟机(2):虚拟机内存模型

前面第一篇文章已经简单的介绍了下Java虚拟机,接下来要介绍下Java虚拟机内存模型。当我们运行一个Java程序时,其实是创建了一个Java虚拟机的实例,并且通过该实例来加载执行我们编写的Java代码。有过Java开发经验的程序员们,应该在某次运行Java程序时,遇到过OutOfMemory或者StackOverflow的异常。这说明我们不正确的使用了内存空间,例如:无限递归调用同一个方法。本文将介绍Java虚拟机是如何对内存进行划分使用的。

浅谈Java虚拟机(1):前瞻

刚上大学时,学校里教的程序设计语言就是Java,这也是我在编程世界中的第一母语。当你还没有学过任何编程知识的时候,听到Java一词时,感觉它好高端,同时又是遥不可及。在其他同学那,从学长们的口中了解到的,更是它的恐怖,学起来很难,挂的人很多,诸如此类。几年的学习后,庆幸自己能够将Java成为自己的编程利器。从开始的课程设计,到Android逐渐流行后,手机App开发,再到后来的Java Web开发,接触到了了不起的Spring框架,甚至目前许多大数据开源项目都是用Java编写的。可以说,在各个地方Java总能大展手脚。这里,我不去评判不同程序设计语言的好坏,我只是想慢慢揭开我所热爱的编程语言那神秘的面纱,去了解它背后的原理。

我的前端学习之路(二)

上次分享『我的前端学习之路(一)』的文章已经过了半年了,这半年来都没有好好花时间来写文章。期间自己独立完成了两个完整的项目,后面也会分享写这两个项目的一些经验。最近才比较有点时间静下来,前几天刚把自己的个人博客迁到了阿里云上。当然,用了国内的服务器就得好好做个守法的公民,为个人博客网站进行了备案。备案也没有想象中的麻烦,除了需要上传照片。回归正题,上一篇文章,回顾了下,主要是分享了关于前端一些学习的方法,侧重学习资源的获取。这一部分也是比较重要的,作为一个前端开发者,我觉得学习新知识的能力要强,掌握了好的学习方法,不管前端技术更新得如何迅速,也能迎头赶上。掌握了学习的方法,还有一个最重要的部分,就是形成一套属于自己的前端知识体系。

前端的知识回归到本源,就是最通常讲的三部分:HTML、CSS、JavaScript。只有掌握了这最基础的三部分,才能在前端的路上走得更远。下面将列一下每个部分需要掌握的一些要点。

MySQL高可用性之Keepalived双主热备

MySQL高可用性是保障MySQL在某台服务器上停止运行,其他机器的MySQL可以接管服务,保证MySQL服务可用。MySQL自身提供了多个服务之间相互备份的功能,但只进行备份的话,还需要一个能够在提供MySQL服务切换的机制。

Keepalived的作用是可以检测某台机器的服务出现故障,从集群中剔除,并将可用的服务作为当前服务,能够实现自动切换。是基于VRRP协议来实现高可用方案,通常还可以配合负载均衡技术(如:nginx、lvs)一起工作来实现集群高可用性。

这里采用了简单的双主热备方式,选取了两台运行MySQL的服务器,分别为ubuntuM1(172.17.2.31)和ubuntuM2(172.17.2.32)。这里以ubuntuM1为主1,即优先级更高。

谈谈JavaScript中的数组

数组在任何编程语言中都十分重要,作为最基础的数据结构,数组也常被用来实现其他的高级数据结构。比如,通过控制数组的存取方式来实现栈、优先队列等数据结构的特性。不同的编程语言对数组的创建、操作都各有不同。就我个人接触的语言中,JavaScript对于数组的定义是最为奇特的。其实用奇葩来形容也是可以的,跟其他语言来比可以这么来说。像Java编程语言中,定义一个数组,通常是要声明数组长度的。如果超过定义长度访问,会报OutOfBoundsException错误。一般称这样的数组声明是静态的,静态声明数组就是一开始就确定该数组占用的内存空间大小。在Java中数组中存放的数据类型也必需是一致的,不能有的字符有的数字。然而,在JavaScript的世界里,这些都变了。我们可以动态的改变某个数组的长度,并且不用管数组里存的数据类型,可以是数字、字符、对象混着来。这一切都变得毫无章法,这或许是脚本语言要体现的一个特点吧,不要太多条条框框束缚,让一切变得易操作。当然,不同语言各有利弊,关键看使用场景,不同场景对于编程语言的设计出发点都不同。下面就来好好谈谈JavaScript中的数组。