作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/6486852.html 一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收.除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此.所以,垃圾回收是必须的. 二.哪些内存需要回收? 哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓"要回收的垃圾"无非就是那些不可能再被任何途径使用的对象.那么如何找到这些对象? 1.引用计数法 这…
垃圾收集器 新生代收集器 1.Serial收集器 特点: 单线程工作,收集的时候就会停止其他所有工作线程,用户不可知不可控,会使得用户界面出现停顿. 简单高效,是所有收集器中额外内存消耗最少的. 没有线程交互的开销,单线程收集效率高. 对于客户端模式下的虚拟机是一个很好的选择. 采用标记复制算法. 2.ParNew收集器 是Serial收集器的多线程版本.采用多条GC线程并行地清理垃圾.任然需要在清理过程中停止一切用户线程. 特点: 多线程执行,适合多处理器环境,单处理器效率不如Serial.…
在主流的商用程序语言中大多都是用根搜索算法(GC Roots Tracing)判断对象是否存活,比如java,c#等.当从GC Roots到某个对象不可达,则证明此对象是不可用的,将要被回收. 商业虚拟机都采用分代收集算法,根据对象的存活周期的不同将内存分为几块:新生代,老年代. 新生代,每次垃圾收集都会有大批量对象死去,只有少量存活,所以适合采用“复制算法”: 老年代,对象存活率比较高,没有额外的分配担保,所以一般采用“标记-清理”活着“标记-整理”算法: 1.标记-清除 缺点: 效率低下,标…
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 摘要:代理的基本构成.InvocationHandler.JDK动态代理----通过接口.cglib动态代理----通过类继承 class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.J…
前言 上篇文章已经给大家介绍了 JVM 的架构和运行时数据区 (内存区域),本篇文章将给大家介绍 JVM 的重点内容--垃圾收集.众所周知,相比 C / C++ 等语言,Java 可以省去手动管理内存的繁琐操作,很大程度上解放了 Java 程序员的生产力,而这正是得益于 JVM 的垃圾收集机制和内存分配策略.我们平时写程序时并感知不到这一点,但是如果是在生产环境中,JVM 的不同配置对于服务器性能的影响是非常大的,所以掌握 JVM 调优是高级 Java 工程师的必备技能.正所谓"基础不牢,地动山…
本文摘自深入理解 Java 虚拟机第三版 垃圾收集发生的区域 之前我们介绍过 Java 内存运行时区域的各个部分,其中程序计数器.虚拟机栈.本地方法栈三个区域随线程共存亡.栈中的每一个栈帧分配多少内存基本上在类结构确定下来时就已知,因此这几个区域的内存分配和回收都具有确定性,不需要考虑如何回收的问题,当方法结束或线程结束,内存自然也跟着回收了 而 Java 堆和方法区这两个区域则有显著的不确定性,只有在程序运行时我们才能知道程序究竟创建了哪些对象,创建了多少对象,所以这部分内存的分配和回收是动态…
一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 状态值说明 Green - everything is good (cluster is fully functional),即最佳状态Yellow - all data is available but some replicas are not yet allocated (cluster i…
本文摘自深入理解 Java 虚拟机第三版 概述 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有的区域则是依赖用户线程的启动和结束而创建和销毁.因此,我们可以根据这个特点将区域划为为线程公有区域和线程私有区域两部分 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.字节码解释器…
流的概念 JAVA程序通过流来完成输入/输出.流是生产或消费信息的抽象,流通过JAVA的输入输出与物理设备链接,尽管与它们链接的物理设备不尽相同,所有流的行为具有相同的方式.这样就意味一个输入流能够抽象多种不同类型的输入:从磁盘文件.从键盘或从网络套接字:同样,一个输出流可以输出到控制台.磁盘文件或相连的网络. 在我们平时接触的输入/输出流中,有这样一个概念必须要弄明白,何谓输入.何谓输出?讨论这个问题的前提是要知道以什么为参考物,这个参考物就是程序或者内存.输入:就是从磁盘文件或者网络等外部的…
img { border: solid 1px } 一.前言 ThreadLocal这个对象就是为多线程而生的,没有了多线程ThreadLocal就没有存在的必要了.可以将任何你想在每个线程独享的对象放置其中,并在任何时候取出来. 二.基本用法 ThreadLocal的使用方法其实特别简单: 在某个类(相当于工厂类,因为当获取不到的时候你要创建一个给它)中创建静态的ThreadLocal. 在别的地方调用它的set和get方法用来存放对象. 下面展示一个样例: package yiwangzhi…