深入理解JVM自动内存管理机制

Posted lcmlyj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解JVM自动内存管理机制相关的知识,希望对你有一定的参考价值。

2.1 C、C++内存管理是由开发人员管理,而Java则交给了JVM进行自动管理

2.2 JVM运行时数据区:方法区、堆(运行时线程共享),虚拟机栈、本地方法栈、程序计数器(运行时线程隔离,私有)

  2.2.1 程序计数器(Program Counter Register):每一个线程都独有一个程序计数器,并且分配了一块线程私有的小块内存,程序运行时,这个计数器会记录字节码文件运行的行数,当线程切换时,则通过这个行数继续执行下面的操作

  2.2.2 虚拟机栈(Java Virtual Machine Stacks):

  (1)虚拟机栈是描述Java方法运行的内存模型(栈帧做着分配和调度的事情),一般描述的“栈”就是这个虚拟机栈,还指的是局部变量表,包括各种基本数据类型(boolear,byte,char,short,int,long,float,double),还有引用对象的地址;

  (2)StackOverFlowError和OutOfMemerryError都和虚拟机栈有关,前者是当线程请求的栈深度大于虚拟机所允许的深度时的异常,后者是动态扩展虚拟机栈深度之后还是超大了会出现的异常;

  2.2.3 本地方法栈(Native Method Stacks):和虚拟机栈高度相似,只不过虚拟机栈用于执行Java方法字节码分配的内存,而本地方法栈是用于本地方法,它和虚拟机栈会抛出同样的异常;关于本地方法:https://www.cnblogs.com/chen-jack/p/7904510.html

  2.2.4 堆(Java Heap):存放对象实例,线程共享,垃圾回收(新生代、老年代),内存分配可以通过-Xmx和-Xms来分配(既可扩展也可固定),超出分配的大小会出现OutOfMemeryError异常;

  2.2.5 方法区(Method Area):线程共享,存储(常量(final)、静态变量、虚拟机加载的类信息等),永久代(并不准确,只是用永久代去实现方法区,达到回收的效果,Java1.8之后没有永久代了);

  2.2.6 运行时常量池(Runtime Constant Pool)

    

 

以上是关于深入理解JVM自动内存管理机制的主要内容,如果未能解决你的问题,请参考以下文章

深入理解JVM虚拟机:Java运行时数据区域

JVM体系结构-----深入理解内存结构

深入理解JVM之内存区域

深入理解JVM虚拟机6:深入理解JVM类加载机制

深入理解JVM内存分配策略

JVM | 第2部分:虚拟机执行子系统《深入理解 Java 虚拟机》 #yyds干货盘点#