分为:方法区 ,堆 ,栈 ,本地栈 ,程序计数器


1.程序计数器  

    保存当前线程执行的字节码行号指示器,解释器工作时,都是通过改变计数器的值来获取下一条程序指令,循环、异常、跳转、分支、线程恢复都要依赖程序计数器。

    对于多核系统(实际一个确定时刻,cpu只能执行线程中的一条指令),线程的恢复都是通过计数器来保存的,每个线程都有自己独立的计数器,称为“线程私有的”内存。

    如果线程正在执行的是java方法,则计数器记录的是当前线程的指令地址;如果执行的是本地方法,则保存的是空(undefined)。

    并且计数器是java虚拟机规范中唯一一个没有规定任何OutOfMemoryError的区域,也就是没有限制。

2. java栈

    与程序计数器相同,也是线程私有,生命周期与线程相同。
    每个方法在执行时,都会创建个栈帧,用于保存局部变量表、操作数栈、方法入口等信息。局部变量表用于保存基本数据类型、对象引用,局部变量表一特点是在编译期间内存大小是可知的,也就是固定的。

    局部变量表 是一组变量值存储空间,用于存放方法参数和方法内的局部变量

3. 本地方法栈
    
    与java栈非常相似,不同的是java栈是为执行java方法服务的,本地方法栈是为虚拟机执行本地方法服务的

4. java堆

    java堆是jvm中管理内存中最大的一块,是所有线程共享的,唯一的目的就是保存对象实例。java堆是gc回收的主要区域。java虚拟机规范规定,java堆可以处于不连续的物理内存空间,逻辑上是连续的。

5. 方法区

    与java 一样,是所有线程共享的,存储已被jvm 加载的类信息、常量、静态变量、即时编译器编译后的代码,即永久代(Permanent Generation) 。

    除了和java堆一样,不需要连续的物理内存空间,还可以选择不实现垃圾回收机制。虽然gc在这区域出现很少,但不代表不回收,回收目标主要是针对常量池和对类型的卸载。

6. 运行时常量池

    是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容在类加载后存放在方法区的运行时常量池中。

  • 字面量:较接近java语言 的常量;
  • 符号引用:类和接口的全限定名;方法、字段的名称和描述符;
  • 符号引用:用一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义的定位到目标即可。符号引用与虚拟机实现的内存布局无关,引用的目标并不一定已经加载到内存中。
  • 直接引用:可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用与虚拟机实现的内存布局相关,如果有了直接引用,那引用的目标必定已经在内存中存在。

--描述符:是用来描述字段的数据类型、方法的参数列表(个数、类型、顺序)和方法返回值;

7. 直接内存

    直接内存并不是jvm运行时数据区的一部分,也不是jvm规范中定义的内存区域。在jdk1.4中引入的NIO,引入了一种基于通道与缓冲区的IO方式,可以使用native函数库直接使用对外内存(系统内存),然后通过java堆里的DirectByteBuffer对象作为这块内存的引用进行操作。这样能提高性能,避免了java堆和native堆中来回复制数据。

jvm 内存整理 -----学习的更多相关文章

  1. JVM内存管理学习总结(一)

    I.JVM进程的生命周期 JVM实例的生命周期和java程序的生命周期保持一致,即一个新的程序启动则产生一个新的JVM进程实例,程序结束则JVM进程实例伴随着消失.那么程序启动和程序终止就是JVM实例 ...

  2. jvm内存模型学习心得

    昨天面试了两家,备受打击,问的多的就是jvm内存,然额真的是一头雾水.工作中用到的真是少之又少,面试还得问道, 今天恶补了下,在此作以下总结: jvm分为5部分 1.程序计数器 jvm支持多线程运行, ...

  3. java的线程安全、单例模式、JVM内存结构等知识学习和整理

    知其然,不知其所以然 !在技术的海洋里,前路漫漫,我一直在迷失着自我. 欢迎访问我的csdn博客,我们一同成长! "不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!" 博 ...

  4. java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

  5. 记一次线上事故的JVM内存学习

    今天线上的hadoop集群崩溃了,现象是namenode一直在GC,长时间无法正常服务.最后运维大神各种倒腾内存,GC稳定后,服务正常.虽说全程在打酱油,但是也跟着学习不少的东西. 第一个问题:为什么 ...

  6. 深入理解java虚拟机学习笔记(一)JVM内存模型

    上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...

  7. JVM基础学习(一):JVM内存模型

    在Java进阶知识的学习中,JVM都是避不过去的一关,我个人对于JVM的理解其实就是相当于在操作系统的外层再加了一层中间层,从来屏蔽了具体硬件之间的不同实现,使得Java实现了最重要的特性:一次编译, ...

  8. Jvm 内存浅析 及 GC个人学习总结

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

  9. 【JVM学习笔记一】JVM内存分布

    Overview 学习JVM首先需要了解一下JVM管理的内存是如何分布的,在看了<深入理解Java虚拟机>和一些博文之后,我准备自己记录一下学习的过程. 下图是JVM中运行时数据区的大致示 ...

随机推荐

  1. 【Symmetric Tree】cpp

    题目: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). F ...

  2. sql数据库的表连接方式图文详解

    sql数据库表连接,主要分为:内连接.外连接(左连接.右连接 .全连接).交叉连接,今天统一整合一下,看看他们的区别.   首先建表填充值. 学生表:student(id,姓名,年龄,性别 ) 成绩表 ...

  3. HDU 5695 Gym Class 拓扑排序

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5695 题解: 求出字典序最大的拓扑序.然后把求好的数列翻转过来就是满足条件的数列,然后模拟求一下va ...

  4. linux - 使用curl实现新浪天气API应用

    新浪天气API的使用方法: API地址:http://php.weather.sina.com.cn/xml.php?city=%B1%B1%BE%A9&password=DJOYnieT82 ...

  5. maven 多套环境 配置(开发、测试、预发、正式)

    接上一节继续,项目开发好以后,通常要在多个环境部署,象我们公司多达5种环境:本机环境(local).(开发小组内自测的)开发环境(dev).(提供给测试团队的)测试环境(test).预发布环境(pre ...

  6. eclipse git 整合

    最近朋友都推荐使用github管理自己的项目,而且免费用户可以有5个仓库,恰好我也想了解下git,借此机会学习一下.github官方指南使用独立第三方git工具来进行版本控制,并不借助于eclipse ...

  7. maven 常用5个命令

    1. mvn help:describe 你是否因为记不清某个插件有哪些goal而痛苦过,你是否因为想不起某个goal有哪些参数而苦恼,那就试试这个命令吧,它会告诉你一切的. 参数: 1. -Dplu ...

  8. ssh 远程 centos 乱码

    今天,帮我们同学处理一下中文显示乱码的问题.这个是个国内Linux用户烦恼的问题,由于大部分的Linux发行版都是以英语为主体的,而且英文在通用性和稳定性上都比中文要好一些,各种奇怪的BUG也要少一点 ...

  9. SEO网站优化方案

    学习许多前辈的经验,看到一些比较有价值的seo优化方案,特记录一下,对照自己的操作之路,新人也可借鉴一二,下面是从卢松松博客看到的文章.高手直接跳过,请勿喷水. 一个完整的SEO优化方案主要由四个小组 ...

  10. POJ 1001 Exponentiation(JAVA,BigDecimal->String)

    题目 计算实数a的n次方,具体输出格式看案例 import java.util.*; import java.math.*; public class Main { public static voi ...