zoukankan      html  css  js  c++  java
  • Java虚拟机各内存区域的位置及功能的介绍

    Java虚拟机运行时数据区:

    相关区域介绍:

    程序计数器:

      功能:当前线程所执行字节码的行号指示器。若是Java方法记录指令地址,若为Native方法,则不记录

      隔离性:线程隔离

      Error:无

    Java虚拟机栈

      功能:描述Java方法执行的内存区:每个方法执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

      隔离性:线程隔离

      Error:线程请求的栈深度大于虚拟机所允许的深度时,抛出 StackOverflowError 异常;

         动态扩展时无法申请到足够的内存,抛出 OutOfMemoryError 异常。

      局部变量表:局部变量表所需的内存空间在编译期间分配,包含各种基本数据类型,及对象引用。

      操作数栈:操作数栈是一个后入先出栈,其最大深度也是在Code属性中已经确定了的(编译时期确定)。当执行字节码指令时,各种数据类型都会加载到操作数栈中。32位数据数据类型站1个栈容量,64位数据站2个栈容量。虚拟机实现会做一些优化。将两个操作数栈重叠一部分区域,省去额外的参数复制传递。   当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是出栈/入栈操作。例如,在做算术运算的时候是通过操作数栈来进行的,又或者在调用其他方法的时候是通过操作数栈来进行参数传递的。

      动态链接:Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于之前说的直接引用)。这些符号引用有一部分在类加载阶段或者第一次使用的时候就直接转化为直接引用(静态解析)。有的则在每一次运行期间转化为直接引用(动态连接)。

    本地方法栈:

      功能:为虚拟机使用到的Native方法服务。(虚拟机栈为Java方法(也就是字节码)服务)

      隔离性:线程隔离

      Error: StackOverflowError  和 OutOfMemoryError

    Java堆:

      功能:存放对象实例

      隔离性:线程共享

      Error:OutOfMemoryError

      细分:内存回收的角度:新生代、老生代

         内存分配的角度:Java堆中可能划分出多个线程私有的分配缓冲区。

      虚拟机限制:不需要连续内存空间,可以固定大小也可扩展

     

    JVM将内存划分为:
    New(年轻代)
    Tenured(年老代)
    Perm (永久代)
    其中New和Tenured属于堆内存,堆内存会从JVM启动参数(
    -Xmx,-Xms,前者是JVM最大允许分配的堆内存,后者是JVM初始分配的堆内存)指定的内存中分配,Perm不属于堆内存,由虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。 年轻代(New):年轻代用来存放JVM刚分配的Java对象 年老代(Tenured):年轻代中经过垃圾回收没有回收掉的对象将被Copy到年老代 永久代(Perm):永久代存放Class、Method元信息,其大小跟项目的规模、类、方法的量有关,一般设置为128M就足够,设置原则是预留30%的空间。
    New又分为几个部分: Eden:Eden用来存放JVM刚分配的对象 Survivor1 Survivro2:两个Survivor空间一样大,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间来回Copy,当满足某个条件,比如Copy次数,就会被Copy到Tenured。显然,Survivor只是增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。   
    堆配置:
    -Xms:初始堆大小 -Xmx:最大堆大小(如果此值大于-Xms的大小,则按需分配,因此为了避免每次垃圾回收完成后JVM重新分配内存,两个只很多时候设置成相同值) -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n:设置年轻代和年老代的比值,如:n=3,表示年轻代和年老代比值是1:3 -XX:SurvivorRatio=m:年轻代中Eden区与两个Survivor区的比值。注意Suvivor区有两个,大小一样大。如:m=3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5 XX:MaxPermSize=p:设置持久代的大小
    参考 http://www.cnblogs.com/superpang/p/5309819.html

    方法区:

      功能:存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等。

      隔离性:线程共享

      Error:OutOfMemoryError

         虚拟机限制:不需要连续内存空间,可以固定大小也可扩展;此区域内存的回收主要针对常量池的回收和对类型的卸载。

      运行时常量池:方法区的一部分

        功能:用于存放编译期生成的各种字面量和符号引用,及翻译出来的直接引用

         特性:动态性,运行期间也可以将新的常量放入池中。

         Error:OutOfMemoryError

    这有一篇更详细的介绍:http://blog.csdn.net/u012152619/article/details/46968883

  • 相关阅读:
    在 ubuntu20 上安装 docker
    在 ubuntu20 上替换原有的源,解决下载软件慢的问题
    thymeleaf 模板语法
    对 spring 中默认的 DataSource 创建进行覆盖
    Spring Security OAuth2 笔记(一)
    对 ThreadLocal 的了解(一)
    解决 docker.io 上拉取 images Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout
    Spring Security Oauth2 使用 token 访问资源服务器出现异常:Invalid token does not contain resource id (oauth2)
    windows 查看被占用的端口信息
    不写注释的程序员-Models
  • 原文地址:https://www.cnblogs.com/tf-Y/p/5262249.html
Copyright © 2011-2022 走看看