首页 > 系统相关 >Java内存区域

Java内存区域

时间:2023-06-27 15:33:30浏览次数:42  
标签:Java 虚拟机 区域 线程 内存 方法

Java内存区域_方法区

JVM内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【Java堆、方法区】、直接内存。

线程私有数据区域生命周期与线程相同,依赖用户线程的启动/结束而创建/销毁(在HotspotVM内,每个线程都与操作系统的本地线程直接映射,因此部分内存区域的存/否跟随本地线程的生/死对应)。

线程共享区域随虚拟机的启动/关闭而创建/销毁。

直接内存并不是JVM运行时数据区的一部分,但也会被频繁的使用:在JDK 1.4引入的NIO提供了基于Channel与Buffer的IO方式,它可以使用Native函数库直接分配堆外内存,然后使用DirectByteBuffer对象作为这块内存的引用进行操作,这样就避免了在Java堆和Native堆来回复制数据,因此在一些场景中可以显著提高性能。

Java内存区域_Java_02


程序计数器(线程私有):一块较小的内存空间,是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程私有”的内存。

正在执行Java方法的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。如果是Native方法,则为空。

这个内存区域是唯一一个虚拟机中没有规定任何OutOfMemoryError情况的区域。

虚拟机栈(线程私有):是描述Java方法执行的内存区域,每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

栈帧(Frame)是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接(Dynamic Linking)、方法返回值和异常分派(Dispath Exception)。栈帧随着方法调用而创建,随着方法结束而销毁---无论方法是正常完成还是异常完成(抛出了在方法内未被捕获的异常)都算作方法结束。

本地方法区(线程私有):和Java Stack作用类似,区别是虚拟机栈未执行Java方法服务,而本地方法栈则为Native方法服务,如果一个VM实现使用C-linkage模型来支持Native调用,那么该栈将会是一个C栈,但HotSpot VM直接就把本地方法栈和虚拟机栈合为一。

堆(Heap-线程共享)-运行时数据区:是被线程共享的一块内存区域,创建的对象和数组都保存在Java堆内存中,也是垃圾回收期进行垃圾收集的最重要的内存区域。由于现在VM采用分代收集算法,因此Java堆从GC的角度还可以细分为:新生代(Eden区、From Survivor区和To Survivor区)和老年代。

方法区/永久代(线程共享):永久代(Permanent Generation),用于存储被JVM加载的类信息、常量、静态变量、即时编译器后的代码等数据。HotSpotVM把GC分代收集扩展至方法区,即使用Java堆的永久代来实现方法区,这样HotSpot的垃圾收集器就可以像管理Java堆一样管理这部分内存,而不必为方法区开发专门的内存管理器(永久代的内存回收的主要目标是针对常量池的回收和类型的卸载,因此收益一般很小)

运行时常量池(Runtime Constant Pool)是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。Java虚拟机对Class文件的每一部分(自然也包括常量池)的格式都有严格的规定,每一个字节用于存储那种数据都必须符合规范上的要求,这样才会被虚拟机认可、装载和执行。


标签:Java,虚拟机,区域,线程,内存,方法
From: https://blog.51cto.com/u_11315052/6563486

相关文章

  • java线程监控-jstack+jvisualvm
    Java线程监控一.Jstasck1.查找进程ps-ef|greptomcat-oa2.使用jstack监控jstack2429二、jvisualvm1.tomcat应用环境配置1.1tomcat环境配置修改tomcat中,catalina.sh文件cd/usr/src/tomcat-pinter/binvicatalina.sh在第二行添加如下:JAVA_OPTS="-Dcom.sun.mana......
  • Building a Dice Game using JavaScript Javascript构建一个dice game 项目
    WewillbebuildingaDiceGameProjectusingHTML,CSS,andJavaScript.TheDiceGameisbasedonatwo-player.Bothplayersrollthediceandtheplayerwhogetsthehighestphasevaluewillwinthegame.ImagesofDicePhases: Thelistofdicephasesi......
  • Selenium基础:cookie javascript调用 屏幕截图 09
    1、cookie操作 绕过登录get_cookies():以字典形式返回cookie所有信息get_cookies(name):返回cookie字典中key为name的值add_cookie(cookie_dict):手动添加cookie。cookie_dict为字典数据格式,cookie_dict中必须有name和value值delete_cookie(name):删除cookie字典中key为name的......
  • Excel JavaScript API for PivotTables
    WorkwithPivotTablesusingtheExcelJavaScriptAPI-OfficeAdd-ins|MicrosoftLearnPivotTablesstreamlinelargerdatasets.Theyallowthequickmanipulationofgroupeddata.TheExcelJavaScriptAPIletsyouradd-increatePivotTablesandinteractw......
  • Design a Drum-kit web app using JavaScript Javascript设计drum-kit项目
    Weallmusthaveseenadrumkitinsomeconcertorelsewhere,itisacollectionofdrums,cymbalsandotherpercussioninstruments.Buthaveyoueverimaginedmakingthatdrumkitonyourownvirtuallywiththehelpofsomescriptinglanguage?Well,so......
  • 在Androidstudio 中 通过jni java 和c++相互调用实现方法
    在Androidstudio中通过jnijava和c++相互调用实现方法1.创建javanative方法类publicclassNativeAPI{privatestaticfinalStringTAG=APP_TAG+"TestJni";static{System.loadLibrary("testnative");}//从c++so中获取字符串publicna......
  • Java-hashcode与equals
    1.如果hashcode()不相同,两个对象一定不是同一个对象2.如果hashcode()相同,两个对象不一定上同一个对象,需要进一步判别equals3.如果equals相同,应当认为两个对象就是相同对象由于hashcode方法仅返回一个值,equals里面有若干逻辑,因此,部分集合类的判断中,会优先判断hashcode,如果相同再......
  • Java
    hashcode()、equals()1.如果hashcode()不相同,两个对象一定不是同一个对象2.如果hashcode()相同,两个对象不一定上同一个对象,需要进一步判别equals3.如果equals相同,应当认为两个对象就是相同对象由于hashcode方法仅返回一个值,equals里面有若干逻辑,因此,部分集合类的判断中,会优先......
  • java中 如何判断字符串为空
    在Java中,可以使用以下方法来判断字符串是否为空:使用length()方法判断长度是否为0:Stringstr="hello";if(str.length()==0){System.out.println("字符串为空");}使用isEmpty()方法判断是否为空字符串:Stringstr="hello";if(str.isEmpty()){System.out.printl......
  • java中 如何判断字符串为空
    在Java中,可以使用以下方法来判断字符串是否为空:使用length()方法判断长度是否为0:Stringstr="hello";if(str.length()==0){System.out.println("字符串为空");}使用isEmpty()方法判断是否为空字符串:Stringstr="hello";if(str.isEmpty()){System.out.printl......