该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

介绍下 Java 内存区域(运行时数据区)

Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么)

对象的访问定位的两种方式(句柄和直接指针两种方式)

拓展问题:

String类和常量池

8种基本类型的包装类和常量池

Java程序员必看文档

1 概述

对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。

2 运行时数据区域

Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。

这些组成部分一些事线程私有的,其他的则是线程共享的。

线程私有的:

程序计数器

虚拟机栈

本地方法栈

线程共享的:

方法区

直接内存

2.1 程序计数器

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完。

2.2 Java 虚拟机栈

与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是 Java 方法执行的内存模型。

Java 内存可以粗糙的区分为堆内存(Heap)和栈内存(Stack),其中栈就是现在说的虚拟机栈,或者说是虚拟机栈中局部变量表部分。

2.3 本地方法栈

和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。

2.4 堆

Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。

Java 堆是垃圾收集器管理的主要区域,因此也被称作GC堆(Garbage Collected Heap).从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以Java堆还可以细分为:新生代和老年代:在细致一点有:Eden空间、From Survivor、To Survivor空间等。进一步划分的目的是更好地回收内存,或者更快地分配内存。

2.5 方法区

方法区与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。

HotSpot 虚拟机中方法区也常被称为 “永久代”,本质上两者并不等价。仅仅是因为 HotSpot 虚拟机设计团队用永久代来实现方法区而已,这样 HotSpot 虚拟机的垃圾收集器就可以像管理 Java 堆一样管理这部分内存了。但是这并不是一个好主意,因为这样更容易遇到内存溢出问题。

相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入方法区后就“永久存在”了。

2.6 运行时常量池

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

既然运行时常量池时方法区的一部分,自然受到方法区内存的限制,当常量池无法再申请到内存时会抛出 OutOfMemoryError 异常。

JDK1.7及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。同时在 jdk 1.8中移除整个永久代,取而代之的是一个叫元空间(Metaspace)的区域

2.7 直接内存

直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。而且也可能导致OutOfMemoryError异常出现。

JDK1.4中新加入的 NIO(New Input/Output) 类,引入了一种基于通道(Channel) 与缓存区(Buffer) 的 I/O 方式,它可以直接使用Native函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样就能在一些场景中显著提高性能,因为避免了在 Java 堆和 Native 堆之间来回复制数据。

本机直接内存的分配不会收到 Java 堆的限制,但是,既然是内存就会受到本机总内存大小以及处理器寻址空间的限制。

3 HotSpot 虚拟机对象探秘

通过上面的介绍我们大概知道了虚拟机的内存情况,下面我们来详细的了解一下 HotSpot 虚拟机在 Java 堆中对象分配、布局和访问的全过程。

3.1 对象的创建

下图便是 Java 对象的创建过程,我建议最好是能默写出来,并且要掌握每一步在做什么。

java主要内存区域_可能是把Java内存区域讲的最清楚的一篇文章相关推荐

  1. java执行sql文件_面试官:MyBatis SQL是如何执行的?把这篇文章甩给他

    初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...

  2. 【Java问题】全网无法解决你的的IDEA中文乱码问题,不妨来看这篇文章

    [Java问题]全网无法解决你的的IDEA中文乱码问题,不妨来看这篇文章 1. 如果你试了所有的方法解决不了,你就默认使用GBK即可 这个方式是我试了全网几乎所有的都不行的解决方案 File -> ...

  3. java docx 内存溢出_第2章 Java内存区域与内存溢出异常

    本章主要介绍了Java的内存区域以及会触发对应区域内存溢出的触发条件及表现结果.同时还对java对象的内存布局进行了简单的讲解. 2.2 运行时数据区域: 比较直观的一张图来表示: Java虚拟机运行 ...

  4. java eden区_(转)可能是把Java内存区域讲的最清楚的一篇文章

    写在前面 本节常见面试题: 问题答案在文中都有提到 如何判断对象是否死亡(两种方法). 简单的介绍一下强引用.软引用.弱引用.虚引用(虚引用与软引用和弱引用的区别.使用软引用能带来的好处). 如何判断 ...

  5. java jvm 内存参数_深入详解JVM内存模型与JVM参数详细配置

    对于大多数应用来说,Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块.Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建. JVM内存结构 由上图可以清楚的看到 ...

  6. 写java线程导致电脑内存不足_如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码...

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  7. [No0000187]可能是把Java内存区域讲的最清楚的一篇文章

    写在前面(常见面试题) 基本问题: 介绍下 Java 内存区域(运行时数据区) Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄和直接指针 ...

  8. java虚拟机手动内存分配_《深入理解java虚拟机》-垃圾收集器与内存分配策略

    如何判断对象已死? 引用计数算法 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1:当引用失效时,计数器减1:其中计数器为0的对象是不可能再被使用的已死对象. 引用计数算法的实现很简单 ...

  9. C语言与JAVA内存管理_深入理解C语言内存管理

    之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少. 问题不能拖,我这就来学习一下吧,争取一次搞定. 在任何程序设计环境及 ...

最新文章

  1. 关于分页的解决方案收集
  2. AI技术诠释全新智能,多方位优化样样贴心
  3. hadoop2 作业执行过程之作业提交
  4. 常见的和端口,IP相关的企业面试题
  5. LAMP源码编译安装配置+wordpress
  6. 【转】开源机器学习之RWeka
  7. Android+Java中使用RSA加密实现接口调用时的校验功能
  8. JavaScript中Window.event详解
  9. PCL——PCD文件格式分析
  10. spring-页面模板配置
  11. 记一次奇怪的debug:Tomcat部署网站每一个页面第一次打开404刷新后才正常显示...
  12. 【一天一个挨打小技巧】暴力磁力种子磁力链接下载
  13. 一拳超人最强之男手游辅助脚本 快速升级提高提高战力
  14. android 修改图片的宽高
  15. STM32 DHT11
  16. 进化计算——进化规划(EP)
  17. 提高github下载速度的方法
  18. 注意力机制如何助力GAN生成更高质量的图像?
  19. 基础知识(HTML + CSS)整理
  20. Gensim官方教程翻译(五)——英文维基百科的实验

热门文章

  1. Eclipse里代码自动完成 auto completion的快捷键设置
  2. SAP ABAP关键字在Chrome浏览器里高亮显示的实现原理 - How is ABAP keyword highlight implemented in Chrome
  3. Service group - get entity set
  4. why always WebContent is added as prefix of url when repository request served
  5. SAP CRM系统里关于订单货币单位为日元的一些调试和配置关键点
  6. 如何在Chrome development tool里查看C4C前台发送的未经 GZIP 压缩之前的请求细节
  7. html5能火多久,html5有多火?看完这个你就知道了!
  8. JVM内存结构|虚拟机栈
  9. 【测评】想买投影仪,预算又不多,该怎么选?——三款高性价比投影仪PK测评
  10. java 中 statent,【行为型模式】状态模式(state)之23种java设计模式