前面介绍了垃圾回收算法,接下来我们介绍垃圾收集器和内存分配的策略。有没有一种牛逼的收集器像银弹一样适配所有场景?很明显,不可能有,不然我也没必要单独搞一篇文章来介绍垃圾收集器了。熟悉不同收集器的优缺点,在实际的场景中灵活运用,才是王道。 在开始介绍垃圾收集器前,我们可以剧透几点: 根据不同分代的特点,收集器可能不同。有些收集器可以同时用于新生代和老年代,而有些时候,则需要分别为新生代或老年代选用合适的收集器。一般来说,新生代收集器的收集频率较高,应选用性能高效的收集器;而老年代收集器收集次数相对较少,对空间较为敏感,应当避免选择基于复制算法的收集器。 在垃圾收集执行的时刻,应用程序需要暂停运 ...
【JVM从小白学成大佬】4.Java虚拟机何谓垃圾及垃圾回收算法
在Java中内存是由虚拟机自动管理的,虚拟机在内存中划出一片区域,作为满足程序内存分配请求的空间。内存的创建仍然是由程序猿来显示指定的,但是对象的释放却对程序猿是透明的。就是解放了程序猿手动回收内存的工作,交给垃圾回收器来自动回收。 在虚拟机中,释放哪些不再被使用的对象所占空间的过程称为垃圾收集(Garbage Collection,GC)。负责垃圾收集的程序模块,成为垃圾收集器(Garbage Collector)。 既然虚拟机已经帮我们把垃圾自动处理了,为什么还要去了解GC和内存分配呢? 当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对虚拟机 ...
【JVM从小白学成大佬】3.深入解析强引用、软引用、弱引用、幻象引用
关于强引用、软引用、弱引用、幻象引用的区别,在很多公司的面试题中经常出现,可能有些小伙伴觉得这个知识点比较冷门,其实大家在开发中经常用到,如new一个对象的时候就是强引用的应用。 在java语言中,除了原始数据类型(boolean、byte、short、char、int、float、double、long)的变量,其他所有都是所谓的引用类型,指向各种不同的对象。理解这些引用的区别,对于掌握java对象生命周期和JVM内部相关机制非常有帮助。也有助于更深刻的理解底层对象生命周期、垃圾收集机制等,对设计可靠的缓存框架、诊断应用OOM等问题也大有裨益。 这四种应用主要的区别体现在对象不同的可达性状态 ...
Java中List求并集、交集、差集、无重复并集
在实际的开发过程中,某些特定场合,可能会遇到处理list求并集、交集、差集、无重复并集的问题。在实际的项目开发中,非常容易在这些小细节上出错,特此总结如下: package com.model;import java.util.ArrayList;import java.util.List;public class ListTest { public static void main(String[] args) { List<String> list1 = new ArrayList<>(); list1.add("11111111111" ...
程序猿菜鸟打怪升级—一路火花带闪电
此篇文章为segmentfault中秋约稿时写的。 各位小伙伴,大家好!我是猿人谷,一名搬砖老菜鸟。蓦然回首这几年的打怪升级历程,不再是之前的年轻气盛,也没有百感交集,内心却像湖面躺着那株莲花一般,平静,荡不起半点涟漪。 总结从事搬砖行业的这几年,感觉就是:平台白发银披风,一生都在征战中。初入行时,真的连菜鸟都算不上,顶多是只菜虫。当时听到什么c++,Objective-c,大数据,神经网络。。。。。。真的明白自己就两件事不会:这也不会,那也不会。凭着内心的一股倔强,拼命的学,没日没夜的学算法,刷poj,玩命似的向所有人证明:哥真的不是菜鸟。只记得当时内心非常希望有人能叫我一声大佬!过了这 ...
【ZooKeeper系列】3.ZooKeeper源码环境搭建
在系列的前两篇文章中,介绍了ZooKeeper环境的搭建(包括单机版、伪集群和集群),对创建、删除、修改节点等场景用命令行的方式进行了测试,让大家对ZooKeeper环境搭建及常用命令行有初步的认识,也为搭建ZooKeeper的开发环境、生产环境起到了抛砖引玉的作用。也介绍了用Java来实现API的调用,包括节点的增、删、改、查。通过对这两篇的学习,让大家对ZooKeeper的使用有了初步认识,也可用于实现系列后面篇章要介绍的命名服务、集群管理、分布式锁、负载均衡、分布式队列等。 在前两篇中,强调了阅读英文文档的重要性,也带领大家解读了部分官方文档,想传达出的理念是ZooKeeper没有想象中 ...
【ZooKeeper系列】2.用Java实现ZooKeeper API的调用
温馨提示:在这里我再次提个小要求,希望大家能习惯看官方文档,文档虽然是英文但用词都比较简单,基本都能看懂文档表达的意思。授之以鱼不如授之以渔的道理相信大家都明白,也希望通过猿人谷的这个ZooKeeper系列,让大家入门、到熟悉,举一反三后能精通ZooKeeper。 在前一篇我们介绍了ZooKeeper单机版、伪集群和集群环境搭建 ,通过命令行的方式做了节点的创建、删除、更新、获取节点信息的测试。Zookeeper 的目的是为客户端构建复杂的协调功能提供简单、高效的核心 API,这一篇我们用Java通过ZooKeeper提供的API接口来实现这些增删改查的功能。 1 简介org.apache ...
【ZooKeeper系列】1.ZooKeeper单机版、伪集群和集群环境搭建
ZooKeeper安装模式主要有3种: 单机版(Standalone模式)模式:仅有一个ZooKeeper服务 伪集群模式:单机多个ZooKeeper服务 集群模式:多机多ZooKeeper服务 1 单机版(Standalone模式)安装ZooKeeper官网下载地址:http://zookeeper.apache.org/releases.html#download 如图所示进行操作:注意一点,如果不想当小白鼠,请务必下稳定版(stable release),非稳定版安装时可能出各种未知的异常。以3.4.14版本为例,在Centos系统下进行安装,之前写一些软件的安装教程时,有人留言说希 ...
【JVM从小白学成大佬】2.Java虚拟机运行时数据区
这里我们先说句题外话,相信大家在面试中经常被问到介绍Java内存模型,我在面试别人时也会经常问这个问题。但是,往往都会令我比较尴尬,我还话音未落,面试者就会“背诵”一段(Java虚拟机是由堆、方法区、虚拟机栈,吧啦吧啦。。。),估计心里还一脸自豪的想幸好哥提前在网上搜过,早有准备。每每这个时候,我都不忍心打断,因为“背诵”的真的太顺畅了! 这也怪不得面试者,首先Java虚拟机方面的知识,对中高级程序猿来说,工作中正面接触Java虚拟机的东西不多。其次,这个其次咱得好好唠唠,网上搜个Java内存模型,度娘推的第一页大都是介绍Java运行时数据区的,起到了一定的误导作用,大写的尴尬。 本篇将给各位 ...
【JVM从小白学成大佬】1.开篇
JVM的重要性毋庸置疑,可以毫不夸张的说Java虚拟机是整个Java平台的基石。 JVM方面的知识,也一直是BAT等大厂面试考核的重点。特别是JVM调优,故障排查性能调优,你知道该从哪些方面入手吗? 此专栏结合自己对JVM的理解,从java运行时数据区、java内存模型(JMM)、什么是垃圾回收,垃圾回收算法、垃圾收集器、内存分配与回收策略等,也会介绍安全点、安全区域等知识点。 相信学习完专栏,在面试时被问到JVM,你定能跟面试官侃侃而谈,话聊人生! 关于JVM的历史以及重要性我就不做介绍,网上能搜到一大堆。我们就直接上干货,希望能最简单直白语言来深入浅出,一步步揭开JVM的神秘面纱。 本专 ...