`
welcomezhang
  • 浏览: 16863 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

了解java内存区域

阅读更多

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。 



 

 

1.程序计数器(线程私有)

一块较小的内存空间,存储当前线程所执行的字节码行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

 

 

2.Java虚拟机栈(线程私有)

描述的是Java方法执行的内存模型。每个方法执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型)。当JVM运行每个线程时,会为每个线程分配一个java虚拟机栈。包含执行当前方法的相关调用信息、当前方法的变量信息。

如果线程请求栈的深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;无法申请到内存抛出OutOfMemoryError异常(只由-Xss参数设置)。

 

3.本地方法栈(线程私有)

本地方法栈与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法,而本地栈则为虚拟机使用到的Native方法服务。

native方法:http://ghsea.iteye.com/blog/72543 

 

4.Java堆(线程共享)

虚拟机启动时创建,此区域的唯一目的就是存放对象实例,是垃圾收集器管理的主要区域。很多时候也被称作“GC堆”,由于现在收集器基本都采用分代收集算法,所以Java堆中还可以细分为:新生代和老年代;再细致一点的有Eden空间、From Survivor空间、To Survivor空间等。 

在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制),有可能抛出OutOfMemoryError。

 

5.方法区(线程共享)

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据,又称“非堆”或者“永久代”,在java 8中逐步取消了,转而替换是metaspace(元数据区)。

这区域的内存回收目标主要是针对常量池的回收和对类型的卸载,可能抛出OutOfMemoryError。

 

6. 运行时常量池(线程共享)

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

 

7.直接内存

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

 

在JDK1.4中新加入了NIO类,引入了一种基于通道与缓存区(buffer)的I/O方式,它可以使用 Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作,避免了在Java堆和Native堆中来回复制数据(可以通过-XX:MaxDirectMemorySize指定,如果不指定,则默认与Java堆最大值(-Xmx)一样)。

  • 大小: 641.6 KB
分享到:
评论

相关推荐

    简单了解JAVA内存区域效果知识

    主要介绍了简单了解JAVA内存区域效果知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java内存与垃圾回收调优.docx

    Java内存与垃圾回收调优,Java内存与垃圾回收的调优是一个重要的主题,特别是在高性能和大规模的应用程序中。以下是一些关键的调优建议和步骤: 理解内存结构: Java堆是主要的内存区域,用于存储对象实例。 堆内存...

    第一章 Java内存区域.md

    本文为java虚拟机内存模型概述,参考了《深入了解java虚拟机》与几篇博客整合而成。

    学习JVM之java内存区域与异常

    关于JVM内存区域的知识对于初学者来说其实是很重要的,了解Java内存分配的原理,这对于以后JAVA的学习会有更深刻的理解。下面来看看详细介绍。

    java内存管理(堆、栈、方法区)

    首先我们要了解我们为什么要学习java虚拟机的内存管理,不是java的gc垃圾回收机制都帮我们...Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下图所示:我认为我们最重要的是了解栈内存(Stack)和堆内存

    Java后端面试问题整理.docx

    • 熟悉JVM内存区域,常用引用类型,垃圾回收机制、算法以及常见的GC垃圾收集器(Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1) • 熟悉常用IO模型(BIO、NIO、AIO),熟悉JVM类加载过程与...

    操作系统 linux 请求分页 模拟内存管理实验报告java(内含源码)

    通过实现一个操作系统的内存管理的模拟系统,观察内存空闲分区管理、内存分配和回收过程,了解内存管理技术等特点,掌握内存管理中的分配、回收和置换算法,加深对请求调页系统的原理和实现过程的理解。

    电脑硬盘内存管理

    电脑硬盘管理器:分析文件夹大小,...分析文件夹,清晰的了解文件夹生产了多少垃圾,占用多少内存; 查找大文件;根据文件夹内存大小快速过滤。 清晰了解自己的硬盘,了解自己的电脑,避免垃圾的生成 硬盘分析助手1.2

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    【JVM和性能优化】1.Java内存区域

    JVM是编译后的代码跟操作系统交流的最终路径,了解Java虚拟机的好处如下: 写出更好更健壮的代码 提高Java的性能,排除问题。 面试必问,要对知识有一定对深度。 JVM历史 Java虚拟机有若干的版本查看自己Java虚拟机...

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    深入了解Java之虚拟机内存

    在讨论JVM内存区域分析之前,先来看一下Java程序具体执行的过程:   Java程序执行过程  Java 程序的执行过程:Java 源代码文件(.Java文件)-> Java Compiler(Java编译器)->Java 字节码文件(.class文件...

    java内存区域

    了解Java GC机制,必须先清楚在JVM中内存区域的划分。在Java运行时的数据区里,由JVM管理的内存区域分为下图几个模块:1,程序计数器(Program Counter Register):程序计数器是一个比较小的内存区域,用于指示当前...

    jdk1.8的jvm内存模型——实习生必须了解的

    因为马上要准备实习面试了,而jvm又是面试常考的,我现在来总结一下jvm相关知识,而...这是大家所熟知的java内存模型,分为5个区域,下面说说我对他的认识: 1.程序计数器:首先它是线程私有的,是一个比较小的内存区

    Java虚拟机

    第2章 Java内存区域与内存溢出异常 2.1 概述 2.2 运行时数据区域 2.2.1 程序计数器 2.2.2 Java虚拟机栈 2.2.3 本地方法栈 2.2.4 Java堆 2.2.5 方法区 2.2.6 运行时常量池 2.2.7 直接内存 2.3 HotSpot...

    [java]读书笔记整理:一切都是对象

    如果java让对象继续存在,那么靠什么才能防止这些对象填满内存空间,进而阻塞你的程序呢?这正是C++里可能发生的问题。这也是java神奇之处所在。Java有个“垃圾回收器”,用来监视用new创建的所有对象,并辨别哪些...

    求你了,别再说Java对象都是在堆内存上分配空间的了!

    Java作为一种面向对象的,跨平台语言,其...1、堆是线程共享的内存区域,栈是线程独享的内存区域。 2、堆中主要存放对象实例,栈中主要存放各种基本数据类型、对象的引用。 但是,作者可以很负责任的告诉大家,以上两

    你真的了解Java中的数组吗1

    而在较低的层面上,站在计算机的角度,对象就是堆内存中的一个区域,在这个内存块中封装了一些数据(即类中定义的各个属性值),所以,对象是用来封装数据的。//数组中保

Global site tag (gtag.js) - Google Analytics