Java虚拟机内存结构——JDK1.8

news/2024/5/20 8:53:41 标签: JVM, , , Java

一、Java虚拟机整体结构

二、JVM内存结构

    (1)线程私有部分

      1.本地方法:登记native方法,在执行引擎执行时加载本地方法库

      2.程序计数器:就是一个指针,存储指向下一条指令的地址 ,由执行引擎读取下一条指令,

是一个非常小的空间,可以忽略不计 - 程序计数器的原因时CPU执行线程的时间分片导致的

      3.javaJava线程执行方法的内存模型,一个线程对应一个,每个方法在执行的同时,

都会创建一个帧(用于存储局部变量表,操作数,动态链接,方法出口等信息),不存在

垃圾回收问题,只要线程一结束该就会释放,生命周期和线程一致

class Math{
	public static final Integer CONSTANT_1 = 666;

	public int math(){
		int a = 1;
		int b = 2;
		int c = (a+b)*10;
		return c;
	}

	public static void main(String[] args) {
		Math math = new Math();
		System.out.println(math.math());
		System.out.println("end");	
	}
}

 只要启动一个线程都会创建下面的结构,即程序计数器,Java,本地方法 都是线程私有的

    因为数据结构的特点是先进后出,所以当Math.java启动后,

   先创建main()-帧,放进Java,然后执行math()方法,再创建一个math()-帧放进Java

   当math()方法执行完成后,math()-帧后放进去,先被被弹出;

   math()方法执行完成后,main方法才能执行完成,main()-帧先放进去,后被弹出

         A:局部变量表 ----- > 

                              int a = 1; int b = 2; ....

        B:操作数 ----- > 执行 运算 (a + b) * 10 的数据过程

          

        C:动态链接:在方法中new 一个对象,这个对象放入会放入中,这里会存在一个指针指向中的对象

        D:方法出口

注意:Java 针对Java区域规范了两种异常

        1)当线程请求的深度大于虚拟机所允许的深度,就会抛出StackOverFlowError异常

        2)若虚拟机可动态扩展,当无法申请到足够的内存空间,就会抛出OutOfMemoryError异常

通过jvm参数 -Xss指定空间,空间大小决定调用深度

 

     执行命令:1)javac Math.java把java文件变成class字节码文件

                       2)javap -c Math.class把字节码文件反汇编成指令文件

  (2)线程共享部分

         1.方法区:静态变量 + 常量 + 方法信息(构造方法/接口定义) + 运行时常量池 都存在方法区中有一个别名叫

(Non - Heap)

         2.:虚拟机启动的时创建,用于存放对象实例,几乎所有对象(包含常量池)都在上分配内存,当对象无法在该空间申请到内存时,将抛出OutOfMemoryError异常;同时也是垃圾收集器管理的主要区域。可通过-Xmx -Xms参数来分别指定最大和最小

 

(3)Java++方法区的交换关系

    HotSpot是使用指针的方式来访问对象

   Java中会存放访问类元数据的地址

   reference存储的就直接是对象的地址

 

引申-java的四种变量的存储位置:

      final修饰的变量----常量              JVM方法区

     static修饰的变量----静态变量      JVM方法区

     类级别的变量 ------成员变量       JVM内存

     方法级别的变量----局部变量       JVM内存


http://www.niftyadmin.cn/n/1278063.html

相关文章

XDOJ1145--组合数学四之Carnival Phantasm

描述: 为解救可怜的武内崇老师,saber、远坂、爱尔奎特、希耶尔等人组成了第六科急救队!最终,由琥珀开发出了禁药,分身光线(这药是内服还是外用的 ?),将爱尔奎特批量化生产&#xff…

快速学习-Mycat 支持的或者不支持的语句有哪些?

Mycat 支持的或者不支持的语句有哪些? 答:insert into,复杂子查询,3 表及其以上跨库 join 等不支持。

Idea Springboot修改内置Tomcat版本

pom.xml指定修改的版本 <properties><tomcat.version>8.5.31</tomcat.version></properties><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope&…

Centos7上安装git

1.yum安装git依赖 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker2.删除已有git yum remove git 3.下载git&#xff0c; 切换到包文件存放目录 cd /usr/local/packages/ 下载git安装包 备用地址&#xff1a;http…

Idea导入maven工程后右键没有Maven选项

右键选中pom选择add as Maven Project即可

XDOJ1156 - 游戏里的碰撞

Description 很多游戏包含物体碰撞&#xff0c;碰撞也就像光的反射一样&#xff0c;艾神也想开发个游戏。。。可是他不知道碰撞怎么实现&#xff0c;详情聪明的你帮忙&#xff08;开玩笑。。艾神显然知道怎么实现&#xff09; 输入 一个带方向的矢量 和一条直线的向量表示&…

快速学习-MycatJDBC 连接报 PacketTooBigException 异常

MycatJDBC 连接报 PacketTooBigException 异常 答&#xff1a;检查 mysqljdbc 驱动的版本&#xff0c;在使用 mycat1.3 和 mycat1.4 版本情况下&#xff0c;不要使用 jdbc5.1.37 和 38版本的驱动&#xff0c;会出现如下异常报错&#xff1a;com.mysql.jdbc.PacketTooBigExcept…

idea导入Maven报错Cannot resolve plugin org.apache.maven.pluginsmaven-deploy-plugin2.7已解决

今天重新安装maven时发现maven有些插件加载不进来&#xff0c;在网上搜寻解决方案总结三点&#xff1a; 一、maven的配置文件的本地仓库位置和仓库位置不一致** 点击File进入设置&#xff0c;将这三项设置在同一目录下配置&#xff0c;&#xff08;一定要勾选Override&#xf…