参考资料

本文参考:《深入理解Java虚拟机》作者 周志明 知识产权归作者所有

走近java

  1. java组成部分:java语言、各平台虚拟机、Class文件结构、java api 类库、第三方类库
  2. Jre包括jvm和api
  3. java 未来展望:模块化、混合语言、多核并行、丰富语法、64位虚拟机

自动内存管理机制

PC程序计数器

PC:程序计数器,用于记录和控制下一条需要执行的字节码的位置,分支、循环、跳转、异常处理、线程恢复都需要依赖PC完成。
PC 是每个线程私有的,如果执行的是java方法,该值是字节码指令的地址,如果是native方法,该值是Undefined

Java虚拟机栈

JVM Stack 线程私有,用于存放栈帧 Frame 包括局部变量表、操作数栈、动态链接、方法出口等信息,如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常,如果Stack可以动态扩展,扩展到无法申请到足够的内存时,抛出OutOfMemory'Error异常。-Xss 设置栈容量

Java堆

Heap 堆是线程共享 用于分配对象实例 -Xms10m 初始大小 -Xmx20m 最大大小 也包括线程私有的分配缓冲区 TLAB
方法区 Method Area 线程共享 用于存储被JVM加载的类信息、常量、静态变量、JIT后的代码,又叫做非堆 Non-Heap,永久代,-XX:PermSize=64M JVM初始分配的非堆内存,-XX:MetaspaceSize,class metadata的初始空间配额,以bytes为单位,jdk1.7,符号引用(Symbols)转移到了native heap;字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap;在JDK8中,classe metadata(the virtual machines internal presentation of Java class),被存储在叫做Metaspace的native memory。

运行时常量池

常量池是方法区的一部分,由Class文件解析后完成。

DirectMemory 或 Native Memory

JDK1.4引入的NIO可以使用Native函数直接分配堆外内存,然后通过DirectByteBuffer对象对这块内存直接操作,避免了在Heap和NativeHeap直接来回复制数据,在设置-Xmx参数时要注意留出NativeMemory空间。

JDK1.6的intern方法把首次出现的字符串实例复制到永久代中,并返回已复制的实例引用

JDK1.7的intern方法不会再复制实例、而只是在常量池中记录首次出现的实例引用,因此intern返回的引用和调用者是同一个引用。

创建对象分配内存方式:

  1. 指针碰撞,移动已使用内存和空闲内存之间的指针,前提是已使用和空闲内存比较规整。
  2. 空闲列表,记录可用内存块及大小。
  3. 内存分配的同步问题:使用CAS + 失败重试 保证内存分配的原子性,或利用TLAB,现在TLAB上分配,使用完分配新的TLAB时才需要同步
  4. 分配完成后内存空间全部初始化为零值

对象的内存布局

布局:对象头Header、实例数据Instance Data 对齐填充 Padding 疑问:为什么JVM对象地址要8字节对齐?
对象头包括MarkWord和类型指针,MarkWord 32bit or 64bit 包括哈希码、GC分代年龄、锁状态标记、线程持有的锁、偏向线程ID、偏向时间戳
类型指针是非必须的、以来虚拟机实现、如果是Java数组、对象头还包括数组长度。
实例数据:父类变量在子类变量之前。CompactFields = true 子类较窄变量会插到父类变量的空隙之间。

对象的访问定位

  1. 使用句柄访问:在Java堆中划分出一块内存做句柄池 reference中存储的是对象的句柄地址,而句柄中包含了对象实例地址和类型数据地址
  2. 使用对象指针访问:reference中存储的是对象地址,需要考虑的是对象布局中如何放置访问类型数据的指针

各种区域溢出现象

Java堆溢出 -XX:+HeapDumpOnOutOfMemoryError ava.lang.OutOfMemoryError: Java heap space
使用Eclipse Memory Analyzer 进行分析,内存泄露 查看泄露对象到GC Roots的引用链

Stack溢出 stack length unable to create new native thread

方法区和运行时常量池溢出 提示PermGen space

DirectMemory溢出时明显的特征是dump文件中看不见明显的异常、文件很小,请检查是否有NIO调用。

JVM学习笔记一:内存管理的更多相关文章

  1. linux kernel学习笔记-5内存管理_转

    void * kmalloc(size_t size, gfp_t gfp_mask); kmalloc()第一个参数是要分配的块的大小,第一个参数为分配标志,用于控制kmalloc()的行为. km ...

  2. XV6学习笔记(2) :内存管理

    XV6学习笔记(2) :内存管理 在学习笔记1中,完成了对于pc启动和加载的过程.目前已经可以开始在c语言代码中运行了,而当前已经开启了分页模式,不过是两个4mb的大的内存页,而没有开启小的内存页.接 ...

  3. JVM读书笔记之内存管理

    对于从事C.C++程序开发人员来说,在内存管理领域,他们既是拥有最高权力的“皇帝”又是从事最基础工作的“劳动人民”--既拥有每一个对象的“所有权”,又负责每一个对象生命开始到终结的维护责任. 对于Ja ...

  4. COCOS学习笔记--Cocod2dx内存管理(三)-Coco2d-x内存执行原理

    通过上两篇博客.我们对Cocos引用计数和Ref类.PoolManager类以及AutoreleasePool类已有所了解,那么接下来就通过举栗子来进一步看看Coco2d-x内存执行原理是如何的. / ...

  5. 嵌入式linux学习笔记1—内存管理MMU之虚拟地址到物理地址的转化

    一.内存管理基本知识 1.S3C2440最多会用到两级页表:以段的方式进行转换时只用到一级页表,以页的方式进行转换时用到两级页表.页的大小有三种:大页(64KB),小页(4KB),极小页(1KB).条 ...

  6. Linux内核学习笔记——内核内存管理方式

    一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...

  7. ios学习笔记之内存管理

    一,内存管理类型定义      1,基本类型  任何C的类型,eg:      int,short,char,long,long long,struct,enum,union等属于基本类型或结构体   ...

  8. Cocos2D-X2.2.3学习笔记3(内存管理)

    本章节介绍例如以下: 1.C/C++内存管理机制 2.引用计数机制 3.自己主动释放机制 1.C/C++内存管理机制 相信仅仅要懂oop的都知道NEW这个keyword吧,这个通俗点说事实上就是创建对 ...

  9. arm-linux学习笔记3-linux内存管理与文件操作

    配置好linux系统之后需要vim配置一下,有助于我们的编程,主要的配置如下 在/etc/vim/vimrc文件中 "显示行号 set number "自动缩进 set autoi ...

  10. 《C#高级编程》学习笔记----c#内存管理--栈VS堆

    本文转载自Netprawn,原文英文版地址 尽管在.net framework中我们不太需要关注内存管理和垃圾回收这方面的问题,但是出于提高我们应用程序性能的目的,在我们的脑子里还是需要有这方面的意识 ...

随机推荐

  1. 东北育才 DAY2组合数取mod (comb)

    组合数取模(comb) [问题描述] 计算C(m,n)mod 9901的值 [输入格式] 从文件comb.in中输入数据. 输入的第一行包含两个整数,m和n [输出格式] 输出到文件comb.out中 ...

  2. JAVA项目省市县加载兼容浏览器异常

    最近同僚遇到个在IE8及IE8以下浏览器上出现地址加载问题,初始加载没问题,问题出在事件上. 先来一段初始加载地址的代码:(也可以修改或者增加第二个事件地址) var select1 = new Li ...

  3. 原生js实现Ajax的原理。

    Ajax(Asynchronous JavaScript and XML)表示异步的js与xml. 有别于传统web的同步开发方式. 原理:通过XMLHttpRequest对象向服务器发送异步请求,从 ...

  4. javaScript高级程序设计笔记 2

    Undefinde Null Boolean Number String    基本类型 Object    引用类型 只有引用类型才能动态的添加属性 赋值基本类型和引用类型也不相同,复制的基本类型的 ...

  5. Python基础-类变量和实例变量

    Python基础-类变量和实例变量 写在前面 如非特别说明,下文均基于Python3 大纲: 1. 类变量和实例变量 在Python Tutorial中对于类变量和实例变量是这样描述的: Genera ...

  6. Resetting Frame Animation

      最近在做个小项目的时候,需要用到帧动画.对应着某种状态,该动画可以停止和再次播放.我们知道,通过函数 someAnimObj.start() someAnimObj.stop() 可以很容易地实现 ...

  7. Python3.5学习笔记-列表、元组、字典

    Python中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建.在Python中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型 ...

  8. 15个必须知道的 Chrome 开发技巧

    在 Web 开发者中,Chrome 是使用最广泛的浏览器.六周一次的发布周期和一套强大的不断扩大开发功能,使其成为了web开发者必备的工具.你可能已经熟悉了它的部分功能,如使用 console 和 d ...

  9. (转载)Java多线程的监控分析工具(VisualVM)

    原文链接:http://blog.csdn.net/chendc201/article/details/22905511 在Java多线程程序运行时,多数情况下我们不知道到底发生了什么,只有出了错误的 ...

  10. JavaWeb 后端 <十三> 之 监听器 JSTL国际化

    1. 监听器 1.1   概述 监听器: 主要是用来监听特定对象的创建或销毁.属性的变化的! 是一个实现特定接口的普通java类! 对象: 自己创建自己用 (不用监听) 别人创建自己用 (需要监听) ...