热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jAVA内存区域划分

http:bbs.itheima.comthread-51574-1-1.html在CC开发中,自己需要进行内存管理,而java由于JVM的自动内存管理


http://bbs.itheima.com/thread-51574-1-1.html

在C/C++开发中,自己需要进行内存管理,而java由于JVM的自动内存管理机制的帮助,不在需要为每一个new操作写配对的delete和free代码了,但由于内存泄露和益出方面的问题,在这小结下java内存区域中的一些知识。

    java虚拟机运行时数据区如下:

主要包括五个部分:程序计数器、java虚拟机栈、本地方法栈、java堆、方法区(运行时常量池)。
(1)程序计数器(线程私有):
    程序计数器是一块较小的内存空间,它的作用可以看做事当前线程所执行的字节码的行号指示器。如执行字节码指令、分支、循环、跳转、异常处理、线程恢复等基础功能。
   JVM一次能支持很多线程执行。每一个JVM线程有它自己的程序计数器。在任何时候,一个JVM的线程都正在执行当前线程的方法代码。如果这个方法是一个java方法,程序计数器记录的是正在执行的虚拟机字节码指令的地址。如果线程正在执行本地方法,程序计数器的值为未定义。JVM程序计数器足以存储一个返回地址或一个本地指针。

(2)java虚拟机栈(线程私有):
    每个JVM的线程在创建的时候,都会创建一个栈。一个栈包含很多栈桢。栈帧用来存储局部变量表(存放了编译器的各种基本数据类型如boolean、byte、char、short、int、float、long、double;对象引用(不同虚拟机存储的不同如指向对象起始地址的引用指针或者是代表对象的句柄);returnaddress类型)、操作栈、动态链接、方法出口等信息。
  在java虚拟机规范中,对这个区域规定了两种异常状况:
      a。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。
      b.如果VM栈可以动态扩展,当扩展时无法申请到足够内存(或者在初始化新线程时没有足够内存在创建栈)则抛出OutOfMemoryError异常。

(3) 本地方法栈:
    本地方法栈和java虚拟机栈的作用类似。只是java虚拟机栈为执行java方法(也就是字节码)服务,本地方法栈则为虚拟机使用到的native方法服务。
  在java虚拟机规范中,对这个区域规定了两种异常状况:
      a。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。
      b.如果VM栈可以动态扩展,当扩展时无法申请到足够内存(或者在初始化新线程时没有足够内存在创建栈)则抛出OutOfMemoryError异常。

(4)java堆
       JVM有一个在所有线程内共享的堆。堆是给所有类的实例和数组分配内存的运行时数据区。 堆在虚拟机启动的时候创建,堆中储存的对象通过一个自动存储管理系统(垃圾回收器)进行回收。 对象从不明确的被分配(JVM从不指明对象的释放)。JVM加上没有(JVM不指定特定的自动存储管理系统)自动存储管理系统的特别的类型,(开发者可根据系统要求自主选择)并且这个存储管理技术可能被选择按照实现的系统需求。
    java堆是垃圾收集器管理的主要区域,也被称为“GC堆”。
      堆要么是固定大小,要么按计算需要扩展。如果一个大的堆变得多余或许会收缩。堆的内存不需要相邻。使用者可以设置堆内存的大小,如果堆能够动态的扩展。控制最大最小堆内存。
堆会出现以下异常:
    如果内存溢出(若计算所需堆内存不足),则抛出OutOfMemoryError 

(5)方法区
      JVM的方法区是所有线程共享的,方法区类似于传统语言编译代码时的存储区域或类似于操作系统进程的文本段。他存储内容包括:每一个类的结构,如运行时常量池,字段和方法的数据;方法和构造器的代码,如用于类,实例和接口初始化的特殊方法。这个方法区在JVM启动的时候被创建,一般情况下JVM不会选择对方法区进行垃圾回收或者压缩,这个版本的JVM规范没有强制规定方法区的位置和管理编译后代码的策略。方法区可固定大小,或按需伸缩。方法区的内存不需要相邻。
   运行时常量池(方法区的一部分):
      运行时常量池是类和接口运行时的常量池表,它在字节码文件里。它包含几类常量。 在编译时期识别的数值常量,在运行区识别的方法或引用字段。运行区常量池类似于传统语言的字符表,但它比传统字符表所存储的范围更广。每一个运行区常量池从方法区分配内存。当类和接口被JVM创建时相应的常量池也被创建。
       运行区常量池包括以下异常:
  当类和接口创建时,如果运行区常量池所需内存不足,则抛出OutOfMemoryError。

推荐阅读
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • 深入解析JVM内存模型与分配机制
    本文详细探讨了JVM内存结构的主要组成部分,包括Java虚拟机栈、Java堆、方法区等,并深入分析了HotSpot虚拟机的分代收集策略及其对不同内存区域的管理方式。 ... [详细]
  • 解决Jenkins编译过程中ERROR: Failed to Parse POMs的问题
    在使用Jenkins进行自动化构建时,有时会遇到“ERROR: Failed to parse POMs”的错误。本文将详细分析该问题的原因,并提供有效的解决方案。 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 探讨了一个包含纯虚函数的C++代码片段,分析了其中的语法错误及逻辑问题,并提出了修正方案。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • 尽管在WPF中工作了一段时间,但在菜单控件的样式设置上遇到了一些基础问题,特别是关于如何正确配置前景色和背景色。 ... [详细]
  • ASP.NET 进度条实现详解
    本文介绍了如何在ASP.NET中使用HTML和JavaScript创建一个动态更新的进度条,并通过Default.aspx页面进行展示。 ... [详细]
  • Vue CLI 基础入门指南
    本文详细介绍了 Vue CLI 的基础使用方法,包括环境搭建、项目创建、常见配置及路由管理等内容,适合初学者快速掌握 Vue 开发环境。 ... [详细]
  • 本文探讨了如何在 Spring MVC 框架下,通过自定义注解和拦截器机制来实现细粒度的权限管理功能。 ... [详细]
  • 本文提供了一种有效的方法来解决当Android Studio因电脑意外重启而导致的所有import语句出现错误的问题。通过清除缓存和重建项目结构,可以快速恢复开发环境。 ... [详细]
  • 深入解析Java中的空指针异常及其预防策略
    空指针异常(NullPointerException,简称NPE)是Java编程中最常见的异常之一。尽管其成因显而易见,但开发人员往往容易忽视或未能及时采取措施。本文将详细介绍如何有效避免空指针异常,帮助开发者提升代码质量。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • 本文探讨了Java中线程的多种终止方式及其状态转换,提供了关于如何安全有效地终止线程的指导。 ... [详细]
author-avatar
xiuhuashuai
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有