关于Java成员变量、局部变量、方法,在JVM的内存空间分配

1、变量类型
在这里插入图片描述2、类的结构
下面是一般类的结构

//类体=属性+状态(即:类体=变量+方法)
public class 类名{	//类名最好首字母大写的英文String name;	//在方法体外,所以是成员变量//下面是一个main方法(程序入口的主方法)public static void main(String[] args){int i;		//在main方法体内,所以是局部变量}		
}

3、类的编译运行时JVM内存的变化

JVM(Java 虚拟机)主要包括三个内存空间。分别是:栈内存、堆内存、方法区内存。(堆内存和方法区内存各一个。一个线程一个栈内存)

首先类编译后产生.class的字节码文件,执行类加载器把.class的字节码文件加载到方法区内存(方法的代码片段以及整个类的代码片段都是存储到方法区内存当中)
找到类的程序入口(即主方法)执行到什么语句就会在对应的内存分配空间。

例如程序执行过程中使用new运算符创建的Java对象,存储在堆内存当中。对象内部有实例变量,所以实例变量也存储在堆内存当中。

方法调用的时候,该方法所需要的内存空间在栈内存中分配,称为压栈。方法执行结束后,该方法所属的内存空间释放,称为弹栈。
下面分析一下案例:

public class Computer{double price;	//价格String type;	//型号
}public class Student{int number;		//学号String name;	//姓名Computer com;	
}public class Test{public static void main(String[] args){/*  “=”符号右边先执行 new Computer()严格来说是在堆内存里面开辟了一个新的Computer对象空间。
对象的空间地址给了一个名字叫computer的引用而已,引用类型就是第一个Computer。*/Computer computer=new Computer();	
/*  “=”符号右边先执行 new Student()严格来说是在堆内存里面开辟了一个新的Student对象空间。
对象的空间地址给了一个名字叫student的引用而已,引用类型就是第一个Student。*/Student student=new Student();//student.com的引用指向了computer的引用地址(相当于将computer的引用地址给student.com的引用)student.com=computer;computer.price=4999.9;System.out.println(student.com.price);  //4999.9System.out.println(student.com.type);	//null,因为没有赋值,String默认值是nullSystem.out.println(computer.price);     //4999.9System.out.println(computer.type);		//null,因为没有赋值,String默认值是nullstudent.name="jack";m();System.out.println(student.number);		//0,因为没有赋值,int默认值是0System.out.println(student.name);		//jack}public static void m(){String str="handsome";System.out.println("I am really "+str);}}
下面是运行结果:
---------------------------------
4999.9
null
4999.9
null
I am really handsome
0
jack

在这里插入图片描述

以上有三个类分别是Computer类、Student类、Test类、编译运行将产生Computer.class、Student.class、Test.class的字节码文件。因为还用到String类,所以String.class等字节码文件一起载入到方法区,然后找到程序入口main,方法main被压栈。

Computer computer=new Computer(); 在堆里创建Computer 对象,实例变量有price和type,然后对象的地址0x1234给到引用computer。引用computer在main方法里面,所以引用computer在栈。Student student=new Student(); 也跟上面一样。

student.com=computer; 是将computer的地址0x1234给到Student对象的com实例变量里。所以student.com.price是student指向的0x2451地址找到com,com指向的0x1234地址找到price;computer.price是computer指向的0x1234地址找到price;虽然结果是相同的,但是student.com.price可以体现关联性

computer.price=4999.9; 与 student.name=“jack”;都是将地址给到对应的引用上。接下来然后遇到m();的调用,把它压栈,方法里面的局部变量也在栈里面,方法m();执行完弹栈,跟随的局部变量str也失效。然后执行完代码mian方法也弹栈。(先进后出,后进先出)

扩展
  • 访问实例变量的语法格式:
    读取数据——>引用.变量名;修改数据——>引用.变量名=值;

  • 数据类型:
    数据类型分为基本数据类型(byte short int long float double boolean char)和引用数据类型(开发包的类(String…等)以及自己定义的类)
    数据类型的默认值
    在这里插入图片描述

    在这里插入图片描述

  • 三块内存当中变化最频繁的是栈内存,最先有数据的是方法区内存,垃圾回收器主要针对的是堆内存。

  • 垃圾回收器(自动垃圾回收机制、GC机制)什么时候会考虑将某个Java对象的内存回收呢?

 			问:什么时候堆内存中的Java对象会变成垃圾呢?答:没有更多的引用指向它的时候答:这个对象无法被访问,因为访问对象只能提通过引用的方式访问
  • 空引用访问“实例“相关的数据一定会出现空指针异常。

以上是个人对JVM的理解,若有错误欢迎指出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python内置函数详解总结篇_Python内置函数详解——总结篇

数学运算(7个)类型转换(24个)序列操作(8个)对象操作(7个)反射操作(8个)变量操作(2个)交互操作(2个)文件操作(1个)编译执行(4个)装饰器(3个)数学运算abs:求数值的绝对值>>> abs(-2)2divmod:返回两个数值的商和余数>>> divmod(5,2)(2, 1…

Java多线程中static变量的使用

Java中 没处理好同步 导致两个线程同时为一个static变量赋值 会导致什么后果? Java中 没处理好同步 导致两个线程同时为一个static变量赋值 会导致什么后果?仅仅是多耗资源还是会引发异常? 不会耗资源 也不会引发异常 而是程序出现逻辑错误,…

scanf 接收 空格 输入_如何允许使用scanf输入空格?

人们(尤其是初学者)不应该使用scanf(“%s”)或gets()或任何其他没有缓冲区溢出保护的函数,除非你确定输入总是一个特定的格式甚至不是)。记住,scanf代表“扫描格式化”,并且珍贵的格式比用户输入的数据少。如果您对输入数据格式具…

Java并发——线程安全

1、线程安全 多个线程对同一个共享变量进行读写操作时可能产生不可预见的结果,这就是线程安全问题。 故线程安全的核心点就是共享变量,只有在共享变量的情况下才会有线程安全问题。这里说的共享变量,是指多个线程都能访问的变量&#xff0c…

vue 功能模块后台可配置_Github14k的Springboot后台管理系统

关注爱编码、挖掘优秀项目。本期给各位带来的一款优质的后台管理系统:EL-ADMIN 后台管理系统。简介该项目由大神elunez一手大打造。它是一个基于 Spring Boot 2.1.0 、 Spring Boot Jpa、 JWT、Spring Security、Redis、Vue的前后端分离的后台管理系统。项目地址&am…

hibernate mysql 时间_使用Hibernate和MySQL创建时间戳和最后更新时间戳

慕斯卡3215842利用本文中的资源以及从不同来源获得的左右信息,我提出了这个优雅的解决方案,创建了以下抽象类import java.util.Date;import javax.persistence.Column;import javax.persistence.MappedSuperclass;import javax.persistence.PrePersist;i…

Java中保证线程安全的三板斧

前言 现在,如果要使用 Java 实现一段线程安全的代码,大致有 synchronized 、 java.util.concurrent 包等手段。虽然大家都会用,但却不一定真正清楚其在 JVM 层面上的实现原理,因此,笔者在查阅了一些资料后&#xff0c…

mysql oa数据库设计_OA项目1:环境搭建之数据库创建与环境添加

首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频我的文字版实践笔记,本人用此来加强巩固自己开发知识,如有网友转载,请注明。谢谢。一 指定数据库:Mysqldatabase:oa建库语句:crea…

java 线程安全的原因_java的多线程:java安全问题产生的原因与JMM的关系

一、多线程产生安全问题 1、Java内存模型 共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见。 从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系: 线程之间的共享变量存储在主内存…

python用pip安装wordcloud_如何在python3.7中使用pip安装wordcloud

我一直试图在windows10上pip安装python3.7的wordcloud,但我一直收到这个错误消息,我不太理解,也无法修复。在正在为wordcloud运行setup.py安装:已完成,状态为“error”Complete output from command "c:\program …

分布式系统全局唯一ID的几种实现方式

现如今可谓是微服务、分布式、IoT(物联网)横行的时代,作为一名开发者始终还是要保持一定的危机意识,特别是在日常的项目开发中,若是有机会接触到一些关于微服务、分布式下的应用场景,应当硬着头皮、排除万难…

git如何查看缓存区文件内容_详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别...

一、可以将git简单的分为三个区域 1、工作区(working directory) 2、暂缓区(stage index) 3、历史记录区(history) 如图:其中git add files 把当前工作目录中的文件放入暂存区域这其实做了两件事: 1、将本地文件的时间戳、长度&#xff0…

分布式全局唯一ID的实现

分布式全局唯一ID的实现 前言 上周末考完试,这周正好把工作整理整理,然后也把之前的一些素材,整理一番,也当自己再学习一番。 一方面正好最近看到几篇这方面的文章,另一方面也是正好工作上有所涉及,所以决…

mysql多个分类取n条_MySQL获取所有分类和每个分类的前N条记录

MySQL获取所有分类和每个分类的前N条记录。比如有文章表 test(Id,type,tiem),现在要用SQL找出每种类型中时间最新的前N个数据组成的集合,一段不错的代码,留存备用。SELECT a1.* FROM test a1INNER JOIN (SELECT a.type,p.time FROM test aLEF…

Java接口学习(接口的使用、简单工厂、代理模式、接口和抽象类的区别)

前言引入 官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能&#xff0…

java 矩阵转置_图解利用Java实现数组转置

我们编写Java代码,如下图所示:package com.tina;public class demo {public static void main(String args[]) {int data[] new int[] { 1, 6, 3, 9, 5, 7, 2, 0, 4, 8 };PrintArray(data);}// 输出数组内容public static void PrintArray(int arr[]) {…

java中static、final、static final浅析

final final可以修饰类、属性、方法、局部变量、参数,不能修饰接口!final修饰类:该类不能被继承(解释了为什么不能修饰接口,不过接口里面的属性、方法等是可以用final修饰的);final修饰属性&am…

最短路径 floyd java_java实现Floyd算法求最短路径

关于无向图的最短路径问题:这个程序输出:最短路径矩阵例如:W[0][5]9 代表vo->v5的最短路径为9W:0 1 3 7 4 91 0 2 6 3 83 2 0 4 1 67 6 4 0 3 24 3 1 3 0 59 8 6 2 5 0package com.xh.Floyd;import java.util.ArrayList;public class Floyd_01 {publi…

SpringBoot 使用 log4j2

一、新建工程 选择一些基础依赖 填写工程名称和项目路径 二、工程配置 修改文件编码格式 设置Java Compiler 修改maven配置文件路径 三、pom.xml的web依赖中排除掉logging依赖&#xff0c;并且引入log4j2依赖 <dependency><groupId>org.springframework.…

springBoot 通过使用log4j2

1.排除 Spring-boot-starter 默认的日志配置 将原本的 spring-boot-starter 改为 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion><groupId>…