Sweep

Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析

被刻印的时光 ゝ 提交于 2021-02-20 07:38:42
原文地址:http://www.javatang.com 一个典型的thread dump文件主要由一下几个部分组成: 上图将JVM上的线程堆栈信息和线程信息做了详细的拆解。 第一部分:Full thread dump identifier 这一部分是内容最开始的部分,展示了快照文件的生成时间和JVM的版本信息。 2017-10-19 10:46:44 Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.79-b02 mixed mode): 第二部分:Java EE middleware, third party & custom application Threads 这是整个文件的核心部分,里面展示了JavaEE容器(如tomcat、resin等)、自己的程序中所使用的线程信息。这一部分详细的含义见 Java内存泄漏分析系列之四:jstack生成的Thread Dump日志线程状态分析 。 "resin-22129" daemon prio=10 tid=0x00007fbe5c34e000 nid=0x4cb1 waiting on condition [0x00007fbe4ff7c000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe

详细讲述python的垃圾回收机制(GC)

点点圈 提交于 2021-02-18 14:22:40
2019年即将过去,回顾2019,比较火的一句金语,你能想到啥?请看图 , 我想大家此刻的心情会是这样的 哈哈哈,借着这句金语,今天我给大家分享一下关于Python的垃圾回收机制,本着热爱分享的原则,还是囫囵吞枣地做下记录分享吧。.   首先还是做一下概述吧: 我们都知道, 在做python的语言编程中, 相较于java, c++, 我们似乎很少去考虑到去做垃圾回收,内存释放的工作, 其实是python内部已经做了相应的回收机制, 不用我们自己操心去做内存释放.但是还是有必要了解一下.可以更加深入的了解python这门优美的语言的魅力. 一、概述:   python的GC模块主要运用了“引用计数(reference counting)”来跟踪和回收垃圾。在引用计数的基础上,还可以通过标记清除(mark and sweep)解决容器( 这里的容器值指的不是docker,而是数组,字典,元组这样的对象 )对象可能产生的循环引用的问题。通过“分代回收(generation collection)”以空间换取时间来进一步提高垃圾回收的效率。 二、垃圾回收三种机制   1、引用计数   在Python中,大多数对象的生命周期都是通过对象的引用计数来管理的, 广义上讲,它也是一种垃圾回收机制,而且是一种最直观最简单的垃圾回收机制。   原理: 当一个对象被创建引用或者被复制的时候

深入探讨Hotspot虚拟机在Java堆中对象创建、布局和访问的过程

≯℡__Kan透↙ 提交于 2021-02-16 16:23:40
在我们了解了JVM的运行时数据区划分后,我们需要进一步了解JVM内存中数据进一步的细节,例如对象是如何创建的,如何布局,及如何访问这些对象。接下来会从3个部分来探讨下Java堆中对象的创建及其访问过程。 对象的创建 检查 ,JVM收到 new 指令,首先去检查是否能在常量池中定位到一个 class 的符号引用,并检查这个引用代表的 class 是否被加载、解析和初始化过,如果没有则执行类加载过程。 分配内存 ,类加载通过后,JVM会为这个 class 分配内存。分配内存有两种方式,一种叫 指针碰撞 ,一种叫 空闲列表 指针碰撞 :假设heap是绝对连续规整的,空闲的内存和已使用的内存各在一边,中间放置一个指针作为分界点的指示器,分配内存时只需要把指针挪向空闲内存的那边即可。 空闲列表 :如果heap不是规整的,空闲内存和已使用的内存交错分布,JVM会维护一个列表,记录哪些内存时可用的,分配内存是从列表里找一块足够存放对象的内存分配给它。 选择哪种分配方式由JVM所采用的垃圾收集器是否带有压缩整理的功能决定,因此在使用 Serial 、 ParNew 等带有Compact过程的收集器时,系统采用的分配算法是指针碰撞,而使用 CMS 这种基于Mark-Sweep算法的收集器时,通常采用空闲列表。 在分配内存过程中可能由于并发引起线程不安全的问题,JVM有两种解决方案,一、采用CAS

深入理解java虚拟机

纵然是瞬间 提交于 2021-02-04 17:52:58
目录:     一、运行时数据区域     二、对象创建,以及内存的分配     三、对象的内存布局     四、对象的访问定位     五、对象已死吗     六、再谈引用     七、回收方法区     八、JVM内存分代策略     九、垃圾收集算法     十、垃圾收集器     十一、class类文件的结构     十二、类加载时机     十三、类加载过程     十四、类加载器(启动类加载器、扩展类加载器、应用程序类加载器、还有自定义的加载器哦)     十五、类的实例化顺序 一、运行时数据区域 二、对象创建,以及内存的分配 1)分配策略(在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。选择哪种分配方式由Java堆是否规整决定,而Java堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定) “指针碰撞”(Bump the Pointer):假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离。 “空闲列表”(Free List):如果Java堆中的内存并不是规整的,已使用的内存和空闲的内存相互交错

滴滴海外市业务面试经历

大憨熊 提交于 2021-02-03 12:43:44
滴滴海外部现在正处在发展阶段,需要的人会更多些。但是他们的面试还是要有一定的深度扩展,很遗憾我没有达到公司的要求。现在对我面试中遇到的问题总结下。 1,java多线程 ConcurrentHashMap 分段锁具体实现 2,线程间的通信机制有哪些。 3,CyclicBarrier和CountDownLanch之间的区别。 4,Lock接口 tryLock具体实现 5,线程池种类,你用过哪种线程池,各个线程池的特点,实现机制 6,阻塞队列实现原理,LinkedBlockingQueue为啥用两把锁 7,GC算法有哪些。 8,HashMap,HashSet,TreeSet,TreeMap实现 9,优先级队列是如何实现的。 10,JVM的结构 11,垃圾回收算法 12CMS实现机制 stop the world在CMS下的具体实现。 而CMS主要分为 initial Mark, Concurrent Mark, ReMark,Concurrent Sweep等阶段,initial Mark和Remark占整体的时间比较较小,它们会Stop the world. Concurrent Mark和Concurrent Sweep会和用户线程一起运行。虽然CMS减少了stop the world的次数,不可避免地让整体GC的时间拉长了 13, Linux里面的命令 14

大学期间必须知道的JVM知识

ぃ、小莉子 提交于 2021-02-02 13:00:15
真正没有资格谈明天的人,是那个不懂得珍惜今日的人。 你好,我是梦阳辰,期待与你相遇! 概述 它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。所以,JAVA虚拟机JVM是属于JRE的,而现在我们安装JDK时也附带安装了JRE(当然也可以单独安装JRE)。 Java虚拟机主要分为五大模块:类装载器子系统、运行时数据区、执行引擎、本地方法接口和垃圾收集模块。 JVM是运行在操作系统之上的,它与硬件没有直接的交互 JVM体系结构概览 亮色区域: 线程共享 存在垃圾回收 01.类装载器ClassLoader 负责 加载class文件 ,class文件在文件开头 有特定的文件标示 , 将class文件字节码内容加载到内存中,并将这些内容转换成 方法区 中的运行时数据结构并且ClassLoader 只负责class文件的加载 ,至于它是否可以运行,则由Execution Engine决定。 类装载器类似于快递公司。 **特定标识:**cafe babe 类装载器的种类 虚拟机自带的加载器 启动类加载器(Bootstrap) C++扩展类加载器(Extension) ava应用程序类加载器

深入理解 Java 垃圾回收机制

拈花ヽ惹草 提交于 2021-01-15 06:56:59
http://www.cnblogs.com/andy-zcx/p/5522836.html 深入理解 Java 垃圾回收机制 一:垃圾回收机制的意义 java 语言中一个显著的特点就是引入了java回收机制,是c++程序员最头疼的内存管理的问题迎刃而解,它使得java程序员在编写程序的时候不在考虑内存管理。由于有个垃圾回收机制,java中的额对象不在有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存; 内存泄露:指该内存空间使用完毕后未回收,在不涉及复杂数据结构的一般情况下,java的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有是也将其称为“对象游离”; 二:垃圾回收机制的算法 java语言规范没有明确的说明JVM 使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做两件基本事情:(1)发现无用的信息对象;(2)回收将无用对象占用的内存空间。使该空间可被程序再次使用。 1。引用计数法(Reference Counting Collector) 1.1:算法分析: 引用计数算法是垃圾回收器中的早起策略,在这种方法中,堆中的每个对象实例都有一个引用计数器,点一个对象被创建时,且该对象实例分配给一个变量,该变量计数设置为1 ,当任何其他变量赋值为这个对象的引用时,计数加1 ,(a=b

垃圾收集器

淺唱寂寞╮ 提交于 2021-01-12 18:18:45
GC概念   如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。   GC(Garbage Collection)的工作任务可以分为两类:内存的动态分配和垃圾回收。在内存执行分配之前,GC会先对内存进行划分区域,在上一篇博客中我们知道Java虚拟机使用了分代收集算法,所以堆区里面会被分为新生代和老年代两个区域,新生代又分为Eden空间、From空间和To空间。 空间划分完成后,GC就可以为新对象分配内存空间。   在JDK版本这么多年发展的途中,垃圾收集器也已经出现了多种版本,基于分代的概念,不同的分代空间中活动着不同的GC。   从不同的角度分析垃圾收集器,可以将GC分为不同的类型。 按照线程数分,可分为串行垃圾回收器和并行垃圾回收器。 按照工作模式分,可分为并发式垃圾回收器和独占式垃圾回收器。 按碎片处理方式分,可分为压缩式垃圾回收器和非压缩式垃圾回收器。 按工作内存分,可分为新生代垃圾回收器和老年代垃圾回收器。 下面简单介绍这几个概念 并发式回收器和独占式回收器   并发式垃圾回收器与应用程序线程交替工作,以尽量减少程序的停顿时间。   独占式回收器(Stop the world)一旦运行,就会停止应用程序中的其他所有线程,直到垃圾回收完全结束。 串行回收器和并行回收器   串行回收器是所有垃圾回收器中最古老的的一种

Java之JVM的深入探究(五)--垃圾回收器

萝らか妹 提交于 2021-01-09 21:48:34
预计阅读时间: 9 分钟 我们在上一篇中已经详细的探究了关于JVM的垃圾回收的几种算法,从中我们知道了不同的算法有这不同的优缺点的,然而实际在Java的JVM的并不是单纯的使用其中的某一种算法来实现垃圾回收的,而是将不同的垃圾回收算法包装在不同的垃圾回收器当中,这样用户就可以根据自身的需求,有选择性的使用不同的垃圾回收器,以便让自己的java程序性能到达最佳。 垃圾回收器概述: 垃圾收集器是垃圾回收算法(标记-清除算法、复制算法、标记-整理算法、分代收集算法等)的具体实现,不同商家、不同版本的JVM所提供的垃圾收集器可能会有很在差别,本文主要介绍HotSpot虚拟机中的垃圾收集器。 在探究垃圾回收器之前我们先来回忆下之前探究过的关于JVM内存模型中的Java堆的知识,先来看一下Java堆的结构图如下: java堆内存结构包括:新生代和老年代,其中新生代由一个伊甸区和2个幸存区组成,2个幸存区是大小相同,完全对称的,没有任何差别。我们把它们称为S0区和S1区,也可以称为from区和to区。 JVM的垃圾回收主要是针对以上堆空间的垃圾回收,当然其实也会针对元数据区(永久区)进行垃圾回收,在此我们主要针对堆内存空间的垃圾回收进行探究。 垃圾收集器组合: 下面我们介绍几种常见的垃圾回收器: 1、>>串行收集器: (1)特点:   –它仅仅使用单线程进行垃圾回收   –它是独占式的垃圾回收

Java_垃圾回收算法

ぃ、小莉子 提交于 2021-01-08 20:13:27
参考:《深入理解JAVA虚拟机》第二版 3.3 垃圾收集算法 由于垃圾收集算法的实现涉及大量的程序细节,而且各个平台的虚拟机操作内存的方法又各不相同,只是介绍几种算法的思想及其发展过程。 3.3.1 标记-清除算法 最基础的收集算法是“标记-清除”(Mark-Sweep)算法。 算法分为 标记和清除 两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。后续的收集算法都是基于这种思路并对其不足进行改进而得到的。 它的主要不足有两个: 一个是效率问题,标记和清除两个过程 的效率都不高 ; 一个是空间问题,标记清除之后会产生 大量不连续的内存碎 片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。 3.3.2 复制算法 为了解决效率问题,“复制”(Copying)的收集算法出现了,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。 这样使得每次都是对整个半区进行内存回收,不用考虑内存碎片等复杂情况,实现简单,运行高效。这种算法的代价是将 内存缩小为了原来的一半 ,未免太高了一点。 现在的商业虚拟机都采用这种收集算法来回收新生代,IBM研究表明,新生代中的对象98%是“朝生夕死”的