利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题(2) 启动和理解 MDD4J[size=1.0625]为了充分理解如何使用 MDD4J,您需要了解用于描述内存泄漏的几个术语的含义.图 1 通过名为 MyClass 的示例展示了这些术语,此示例具有一个 HashSet,包含字符串对象.图 1. 内存泄漏术语 泄漏根:包含导致泄漏容器的对象链的引用的对象.如果在所有者链中未发现任何类对象,则此术语表示可找到泄漏容器的内存转储中的根对象. 泄漏容…
Java堆外内存管理   1.JVM可以使用的内存分外2种:堆内存和堆外内存: 堆内存完全由JVM负责分配和释放,如果程序没有缺陷代码导致内存泄露,那么就不会遇到java.lang.OutOfMemoryError这个错误. 使用堆外内存,就是为了能直接分配和释放内存,提高效率.JDK5.0之后,代码中能直接操作本地内存的方式有2种:使用未公开的Unsafe和NIO包下ByteBuffer. 使用ByteBuffer分配本地内存则非常简单,直接ByteBuffer.allocateDirect(…
这几天在找一个程序的bug,主要是java虚拟机内存溢出的问题,调研了一些java内存管理的资料,现整理如下: 一.JVM中的对象生命周期 对象的生命周期一般分为7个阶段:创建阶段,应用阶段,不可视阶段,不可到达阶段,可收集阶段,终结阶段,释放阶段. 创建阶段,首先大家看一下,如下两段代码: test1: for( int i=0; i<10000; i++) Object obj=new Object(); test2: Object obj=null; for( int i=0; i<10…
引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题. 可怕的事情还不只如此,有些使用其它语言开发的程序员,给JAVA程序员扣上了一个“不懂内存”的帽子,这着实有点让人难以接受.毕竟JAVA当中没有malloc和delete.没有析构函数.没有指针,刚开始接触JAVA的程序员们又怎么可能接触内存这一部分呢,更何况有不少JAVA…
Java数组的内存管理 Java语言是典型的静态语言,因此Java的数组是静态的,即当数组被初始化之后,该数组的长度是不可变的.Java程序中的数组必须经初始化才能使用.所谓初始化,就是当数组对象的元素分配内存空间,并未每个数组元素指定初始值. 数组的初始化有以下两种方式: 静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度. 动态初始化:初始化时由程序员只指定数组长度,由系统为数组元素分配初始值. Java的数组变量是一种引用类型的变量,数组变量并不是数组本身,它只是…
引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题. 可怕的事情还不只如此,有些使用其它语言开发的程序员,给JAVA程序员扣上了一个“不懂内存”的帽子,这着实有点让人难以接受.毕竟JAVA当中没有malloc和delete.没有析构函数.没有指针,刚开始接触JAVA的程序员们又怎么可能接触内存这一部分呢,更何况有不少JAVA…
Java垃圾回收机制(GC) 1.1 GC机制作用 1.2 堆内存3代分布(年轻代.老年代.持久代) 1.3 GC分类 1.4 GC过程 Java应用内存问题分析 2.1 Java内存划分 2.2 Java常见内存问题 2.3 ML(内存泄露) OOM(内存溢出)问题现象及分析 2.4 IBM DUMP分析工具使用介绍 Java应用CPU.线程问题分析 Java垃圾回收机制(GC) 1.GC机制作用 1.1 JVM自动检测和释放不再使用的对象内存 1.2 Java 运行时JVM会执行 GC,不再…
前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的. 先让我们来看张图 有些文章中对线程隔离区还称之为线程独占区,其实是一个意思了.下面让我们来详细介绍下这五部分: 运行时数据区 Java虚拟机在知心Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都拥有自己的用途,并随着JVM进程的启动或者用户线程的启动和结束建立和销毁. 先让我们了解下进程和线程的区别: 进程是资源分配的最小单位,线程是程序执行的…
运行时数据区域 其中右侧三个一起的部分是每个线程一份,左侧两个是所有线程共享的. 程序计数器(Program Counter Register) 英文名称叫Program Counter Register.如果翻译为程序寄存器更加合理. 因为这块内存区域很小,功能也类似于寄存器.所以还是翻译寄存器比较靠谱. 在虚拟机的概念模型中(仅仅是概念模型,虚拟机可以通过一些更高效的方式来实现),字节码解释器会通过改变程序计数器的值来选取下一条需要执行的字节码指令. 因为CPU是要轮转的,在切换回来之后,J…
Overview 走近Java:介绍Java发展史 第二部分:自动内存管理机制 程序员把内存控制的权利交给了Java虚拟机,从而可以在编码时享受自动内存管理.但另一方面一旦出现内存泄漏和溢出等问题,就需要了解一些底层的知识来进行错误排查. 自动内存管理机制:介绍内存是如何划分的. 垃圾收集器与内存分配策略:分析垃圾收集算法. 虚拟机性能监控与故障处理工具 调优案例分析与实战 第三部分:虚拟机执行子系统 类文件系统:介绍Class文件结构的各个组成部分. 虚拟机类加载机制:介绍类加载过程的各个阶段…
Java是在JVM所虚拟出的内存环境中运行的.内存分为栈(stack)和堆(heap)两部分.我们将分别考察这两个区域. 栈 在Java中,JVM中的栈记录了线程的方法调用.每个线程拥有一个栈.在某个线程的运行过程中,如果有新的方法调用,那么该线程对应的栈就会增加一个存储单元,即帧(frame).在frame中,保存有该方法调用的参数.局部变量和返回地址. 调用栈 Java的参数和局部变量只能是基本类型的变量(比如int),或者对象的引用(reference).因此,在栈中,只保存有基本类型的变…
1.java程序的执行过程      java源文件->解析器->class文件->java类加载器->java运行时数据区->执行引擎 2.我们接下来看一下java运行时数据区      包含程序计数器,虚拟机栈,本地方法栈,方法区,堆,其中程序计数器,虚拟机栈,本地方法区属于指令,方法区和堆属于数据.  一.程序计数器        用来指示程序执行哪一条指令,这跟汇编语言的程序计数器的功能在逻辑上是一样的.JVM规范中规定,如果线程执行的是非native方法,则程序计数…
Java语言中 的垃圾收集器相对于以前的其他语言优势是什么? 过去的语言需要程序员显示的进行分配内存.释放内存.这种做法可能会引起“内存泄漏”,即由于某种原因是分配给程序的内存无法释放,如果该任务不断的重复进行,程序的内存将会耗尽而导致程序异常终止,甚至无法继续工作,相比之下:Java语言不要求程序员显示的调用内存分配和释放内存,避免了很多潜在的问题.Java在创建对象的时候会自动的分配内存,并当对象的引用不存在的时候释放这块内存. Java中使用被称为垃圾收集器的技术来监视Java程序的运行,…
一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部分: 1.类加载器(ClassLoader):在JVM启动时或者在类运行时将需要的class加载到JVM中.(右图表示了从java源文件到JVM的整个过程,可配合理解. 关于类的加载机制,可以参考http://blog.csdn.net/tonytfjing/article/details/47212291) 2.执行引擎:负责执行class文件中包含的字节码指令(执行引擎的工作机…
众所周知,Java程序员写的代码是没有办法控制Java对象的内存释放的,完全有JVM暗箱操作. 虽然程序员把内存的释放的任务都交给了Java虚拟机,但是并不代表Java程序就不存在内存泄漏. 反而,某程度上,当出现内存泄漏,Debug会变得难度更大. 所以,Java程序员,有必要去了解Java虚拟机对于内存的管理以及垃圾回收的机制. Java虚拟机是如何判断一个对象可以回收? 当一个对象没有被任何其他所引用时,这个对象被Java虚拟机视为可回收. 早起的虚拟机,使用引用计数的方法判断对象是否可回…
一.内存分配 1.JVM体系结构 2.运行时数据区域 3.内存分配二.内存回收 1.垃圾收集算法 2.垃圾收集器三.相关参考一.内存分配JVM体系结构 在了解自动内存管理的内存分配之前,我们先看下JVM的体系结构.代码编译的结果是从本地机器码转变为字节码,经过类加载器加载到虚拟机后才能执行程序.JVM的体系结构主要如下图所示: JVM体系结构 运行时数据区域 在上图中我们可以清楚地看到,JVM在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域,分别是程序计数器.Java虚拟机栈…
问题及答案来源自<Java程序员面试笔试宝典>第四章 Java基础知识 4.8Java平台与内存管理 1.为什么说Java是平台独立性语言? 平台独立性是指可以在一个平台上编写和编译程序,然后在其他平台上运行 保证Java具有平台独立性的机制为中间码和JVM(Java虚拟机),Java程序编译后不是生成了可执行代码,而是 生成了中间码,不同的平台有不同的JVM,由JVM来把中间码翻译成硬件平台能执行的代码(解释执行) 由上述过程可以看出JVM不具有平台独立性,与硬件平台相关 JVM执行中间码(…
1,对象回收前会调用finalize()方法,尝试自救,只能调用一次 2,上面横向对比c++的析构函数,但是java有良好的内存管理,而且try/catch做得比较好 3,回收一个常量,1,对象的实例都没有,2,类加载也没有了,3,java.lang.object也没有相关对象 4,gc含义“3324K->123K(322K)"含义是该内存区域用——>gc后已用(一共多少) 5,新生代(eden区和survivor空间比例是8:1,gc的复制算法参考:https://blog.csd…
注:这篇内容极其混乱 推荐学习这篇博客.博客的地址:http://kenby.iteye.com/blog/1423989 基本元素item item是Memcached中记录存储的基本单元,用户向memcached写入的key value键值对信息都以item的形式存入Memcached中. item基本结构 首先用一张图来描述item的基本结构: 图 1-1 item的基本机构 图片来自博客,画的非常的清晰.从图片中可以看到,item主要有两个部分构成:item的元数据(属性)部分+item…
java heap space是一个很蛋疼的问题,如果开发调试时遇到还好,如果是在项目上线后运行一段时间后,才抛出该异常,那真的很悲剧(那你得找代码中到底是哪里内存泄露了),这真是一个悲伤的故事. 1.java head space堆内存溢出 分  析 发生这种问题的原因是java虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了,与Heap space有关. 解决方法: 1. 增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小.如:set JAV…
运行时数据区域 jdk 1.8之前与之后的内存模型有差异,方法区有变化(https://cloud.tencent.com/developer/article/1470519). java的内存数据区域划分: 程序计数器 虚拟机栈 本地方法栈 堆 方法区 程序计数器(Program Counter Register) 理解为当前线程所执行的字节码的行号指示器,字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常.线程恢复等基础功能依赖于此. 每个线程独…
一  java内存区域与内存溢出异常(OOM) 1)运行时数据区域划分        1.程序计数器(Program Conuter Register) 程序计数器是一块较小的内存空间,它是当前线程执行字节码的行号指示器,字节码解释工作器就是通过改变这个计数器的值来选取下一条需要执行的指令.在虚拟机的模型里,字节码指示器就是通过改变程序计数器的值来指定下一条需要执行的指令.分支,循环等基础功能就是依赖程序计数器来完成的. 由于java虚拟机的多线程是通过轮流切换并分配处理器执行时间来完成,一个处…
1.使用new创建对象,在堆内存分配对象空间.初始化: 2.在方法栈中定义局部变量,吃用对堆内存中对象的引用: 3.方法执行完返回,栈内存自动释放,局部变量销毁: 4.如果堆内存中对象没有变量引用它,成为垃圾,有垃圾回收器回收,释放所占堆内存 5.Java垃圾回收器 (1)Java运行时系统有一个垃圾回收线程负责清除不再使用的对象,俗称垃圾回收器: (2)垃圾回收器定期扫描内存,对于被使用的对象加上标记,按可能的路径扫描结束后清除未加标记的对象 (3)被回收的对象是: a.不再被任何变量引用的对…
1.Serial收集器 优点,是简单而高效,单线程避免了线程交互的开销. 缺点,进行垃圾回收时需要Stop the world(暂停所有用户线程). 2.ParNew收集器 它是Serial收集器的多线程版本,新生代才有多线程并行收集.是CMS收集器(下文会介绍)的默认新生代收集器. ParNew在单CPU的情况下,会比Serial收集器效率更差,因为多线程交互的开销. 但是,如今的计算机普遍是多CPU多核,而ParNew默认的线程数量是CPU的数量.因此它更加适应潮流. 3.Parallel…
Java岗位面试,JVM是对程序员基本功考察,通常会问你对JVM了解吗?  可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义  |  有哪些GC算法  以及年轻代和老年代各自特点等等 1) JVM内存划分: ①  方法区 (线程共享)  常量  静态变量  JIT(即时编译器)编译后代码也在方法区存放 ② 堆内存(线程共享) 垃圾回收的主要场地 ③  程序计数器  当前线程执行的字节码的位置指示器 ④   Java虚拟机栈(栈内存) :保存局部变量,基本数据类型以及堆内存中…
32位系统中有4GB的虚拟地址空间 每个进程有一个地址空间,共4GB,(具体分为低2GB的用户地址空间+高2GB的内核地址空间) 各个进程的用户地址空间不同,属于各进程专有,内核地址空间部分则几乎完全相同 虚拟地址如0x11111111,  看似这8个数字是一个整体,其实是由三部分组成的,是一个三维地址,将这个32位的值拆开,高10位表示二级页表号,中间10位表示二级页表中的页号,最后12位表示页内偏移(2^12=4kb),因此,一个虚拟地址实际上是一个三维地址,指明了本虚拟地址在哪个二级页表,…
内存管理是计算机编程中的一个重要问题,一般来说,内存管理主要包括内存分配和内存回收两个部分.不同的编程语言有不同的内存管理机制,本文在对比C++和Java语言内存管理机制的不同的基础上,浅析java中的内存分配和内存回收机制,包括java对象初始化及其内存分配,内存回收方法及其注意事项等-- java与C++内存管理机制对比 在C++中,所有的对象都会被销毁,局部对象的销毁发生在以右花括号为界的对象作用域的末尾处,而程序猿new出来的对象则应该主动调用delete操作符从而调用析构函数去回收对象…
文章首发于公众号:BaronTalk 书籍真的是常读常新,古人说「书读百遍其义自见」还是很有道理的.周志明老师的这本<深入理解 Java 虚拟机>我细读了不下三遍,每一次阅读都有新的收获,每一次阅读对 Java 虚拟机的理解就更进一步.因而萌生了将读书笔记整理成文的想法,一是想检验下自己的学习成果,对学习内容进行一次系统性的复盘:二是给还没接触过这部好作品的同学推荐下,在阅读这部佳作之前能通过我的文章一窥书中的精华. 原想着一篇文章就够了,但写着写着就发现篇幅大大超出了预期.看来还是功力不够,…
原创文章,转载请标明出处! 目录 一.背景 二.运行时内存区域概述 1.官方描述 2.中文翻译 3.内存区域简述 4.运行时数据区简图 5.运行时数据区详图 三.JVM线程 JVM数据区域与线程关系 1.官方描述 2.中文解释 3.关系图 四.PC寄存器 1.官方解释 2.中文翻译 3.概述 3.什么是上下文切换? 4.什么是CPU时间片? 5.为什么PC寄存器是"线程私有"的? 五.虚拟机栈 1.官方解释 2.中文解释 3.概述 4.栈的结构 5.栈的存储 6.栈的运行原理 7.局部…
java内存管理 简介 首先我们要了解我们为什么要学习java虚拟机的内存管理,不是java的gc垃圾回收机制都帮我们释放了内存了吗?但是在写程序的过程中却也往往因为不懂内存管理而造成了一些不容易察觉到的内存问题,并且在内存问题出现的时候,也不能很快的定位并解决.因此,了解并掌握Java的内存管理是我们必须要做的是事,也只有这样才能写出更好的程序,更好地优化程序的性能. 概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁…