精华内容
下载资源
问答
  • location1 等于 location2的意思是location1 指向的内存和location2 指向的内存是同一块内存区域。 如果location1 和 location2虽然存储的值相等,但是如果属于不同的内存区域,那么两者仍然不相等。  

    let location1 = {province: '湖北', city: '武汉', country: '武昌'};

    let location2 = {province: '湖北', city: '武汉', country: '武昌'};

    console.log(location1 === location2);

    let location3 = {province: '江苏', city: '南京', country: '中山'};

    let location4 = location3;

    console.log(location3 === location4);

    location1 等于 location2的意思是location1 指向的内存和location2 指向的内存是同一块内存区域。

    如果location1 和 location2虽然存储的值相等,但是如果属于不同的内存区域,那么两者仍然不相等。

     

    展开全文
  • 静态域会随着类的加载而加载并初始化,存在于方法区内存中的字节码文件的静态区域中。 优先于对象存在,先有方法区的类加载,后才可能会有堆内存的对象实例化。 静态域会被所有的对象共享,也称为共享区。 一般共...

    Java面向对象(二) 静态域、代码块和内存区域图

    静态域

    • 将域定义成static后,每个只有一个这样的域,与类相关的,也称为类成员。但是每个对象对于所有的实例域都有自己的一份拷贝
    • 静态域随着类的加载而加载并初始化,存在于方法区内存中字节码文件的静态区域中。
    • 优先于对象存在,先有方法区的类加载,后才可能会有堆内存的对象实例化。
    • 静态域会被所有的对象共享,也称为共享区。
    • 一般共性用静态,特性用非静态。
    • 一般通过类名直接调用,虽然也可以通过对象名调用,但是不推荐,也不合适。

    static关键字注意事项

    • 在静态方法中没有this关键字
      • 静态是随着类的加载而初始化,而this随着对象的创建而存在的。
      • 静态比对象优先存在。
    • 静态方法只能访问静态成员和静态成员方法,即静态只能访问静态
      • 静态方法:
        • 成员变量:只能访问静态变量
        • 成员方法:只能访问静态成员方法
      • 非静态方法:
        • 成员变量:可以是静态的,也可以是非静态的
        • 成员方法:可以是静态的成员方法,也可以是非静态的成员方法。

    静态变量和成员变量区别

    • 静态变量也叫类变量,成员变量也叫对象变量。
    • 所属不同
      • 静态变量属于
      • 成员变量属于对象
    • 内存中的位置不同:
      • 静态变量存储于方法区的静态区
      • 成员变量存储于堆内存

    代码块

    代码块概述

    • Java中,使用{}括起来的代码称为代码块

    代码块的分类

    • 根据位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块和同步代码块

    代码块的应用

    • 局部代码块
      • 方法中出现,可以限定变量的生命周期,及早释放,提高内存利用率
    • 构造代码块(初始化代码块)
      • 在类中方法外出现,将多个构造器中的相同代码放到一起,每次调用构造器都执行,并且在构造方法前执行
    • 静态代码块
      • 在类中方法外出现,并且用static修饰,用于给代码块中的代码静态化,加入静态域中,在类加载的时候直接执行,并且只执行一次。
      • 静态代码块优先于main方法执行。
      • 一般常用于加载驱动IO操作等消耗资源的代码

    代码块面试题

    根据程序写输出结果,考察执行顺序

    class Student {
    		static {
    			System.out.println("Student 静态代码块");
    		}
    		
    		{
    			System.out.println("Student 构造代码块");
    		}
    		
    		public Student() {
    			System.out.println("Student 构造方法");
    		}
    }
    	
    class StudentTest {
        static {
            System.out.println("StudentTest静态代码块");
        }
    
        public static void main(String[] args) {
            System.out.println("我是main方法");
    
            Student s1 = new Student();
            Student s2 = new Student();
        }
    }
    

    测试结果:

    StudentTest静态代码块
    我是main方法
    Student 静态代码块
    Student 构造代码块
    Student 构造方法
    Student 构造代码块
    Student 构造方法
    

    分析:

    ​ main方法是Java程序的入口,JVM先找main方法,先把有main方法的类加载到内存中,此时StudentTest类的静态代码块直接随着类的加载而先执行;

    ​ 随后main方法开始执行,当Student类被实例化后,Student类的静态代码块先执行,并且只执行一个,不管实例化多少对象;

    ​ 之后,每实例化一次Student类,类中的构造代码块比构造方法就会先执行,并且每实例化一次就执行一次。

    初始化执行顺序总结

    • 当程序执行时,如果需要创建某个类的对象,那么Java会先检查是否加载了这个类,如果没有加载,则先执行类的加载再生成对象。如果已经加载,则直接生成对象。
    • 类的执行顺序过程:
      • 首先类先加载到方法区内存中,类的静态域会先被加载并且初始化并且优先于main方法执行。Java中类的加载时按需加载,需要时才加载,并且只加载一次。
        • 静态成员变量和静态代码块的执行顺序同代码中的顺序一致。
      • 每创建一次对象时,先初始化对象中的成员变量,再执行构造代码块,其次再执行构造方法。
        • 类中的变量会在任何方法(包括构造器)调用之前得到初始化,即使变量散布于方法定义之间。

    Java内存区域分配

    • 此分配图基于Java8之前版本

     Java内存区域分配

    展开全文
  • 对于HotSpot虚拟机来说,Java类的实例对象在内存中存储分为三块区域,分别是对象头、实例数据、对齐填充。 对象头 对象头包含两部分,第部分用于存储对象自身运行时的数据,包括GC分代年龄、哈希码、锁状态、...

    对于HotSpot虚拟机来说,Java类的实例对象在内存中存储分为三块区域,分别是对象头、实例数据、对齐填充。

    对象头

    对象头包含两部分,第一部分用于存储对象自身运行时的数据,包括GC分代年龄、哈希码、锁状态、线程持有的锁等数据,这部分的数据长度在32位和64位虚拟机中分别为32位和64位,被称为“Mark Word”。

    对象头的另一部分用于存储对象的类元数据的指针,虚拟机通过这个指针可以知道对象是哪个类的实例。

    实例数据

    实例数据用于存储在程序代码中定义的各种类型的字段内容,也包含从父类继承来的。这部分数据的存储顺序会受到虚拟机分配策略参数和字段在代码中定义的顺序的影响。

    对齐填充

    在HotSpot虚拟机中,对象的大小要求是8字节的整数倍,因为对象头的大小正好是8字节的一倍或两倍,而实例数据部分可能不是8字节的整数倍,所以需要凑齐8字节的整数倍,就用到了对齐填充部分,它仅仅是用于占位的作用。
    这里写图片描述

    展开全文
  • 最近读《研磨设计模式》对这段话不太理解: Java static ...变量会共享同一块内存区域。 做了个例子验证一下 例子: class A { static int num = 1; private String name; public String getName(St

    最近读《研磨设计模式》对这段话不太理解:    多个实例的 static变量会共享同一块内存区域。

    Java static的特性:

    •   static 变量在类装载的时候进行初始化。
    •   多个实例的 static变量会共享同一块内存区域。

    做了个例子验证一下

    例子:

    class A {
    	 static  int num = 1;
    	private String name;
    
    	public String getName(String name) {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public void show() {
    		System.out.println("name:" + name + " num:" + num);
    	}
    }
    
    public class Test {
    	public static void main(String[] args) {
    		A a = new A();
    		a.setName("classA");
    		a.num++;
    
    		A b = new A();
    		b.setName("classB");
    
    		a.show();
    		b.show();
    	}
    }

    输出结果:

    name:classA num:2
    name:classB num:2

    反例:

    package Singleton;
    
    class A {
    	  int num = 1;
    	private String name;
    
    	public String getName(String name) {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public void show() {
    		System.out.println("name:" + name + " num:" + num);
    	}
    }
    
    public class Test {
    	public static void main(String[] args) {
    		A a = new A();
    		a.setName("classA");
    		a.num++;
    
    		A b = new A();
    		b.setName("classB");
    
    		a.show();
    		b.show();
    	}
    }

    输出结果:

    name:classA num:2
    name:classB num:1

    通过例子和反例确实可以证明,Java中多个实例的static变量会共享同一块内存区域,也就是多个对象共享一个类的同一个静态成员变量


    展开全文
  • Java内存区域

    千次阅读 多人点赞 2019-10-30 20:42:05
    对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利...
  • 思维导图 对象的创建 对象的内存布局 对象头( Header ) ...在 JVM-01自动内存管理机制之Java内存区域内存溢出异常(上)我们介绍了 运行时数据区域,这里我们来继续探讨下hotspot虚拟机对象 ...
  • JVM 内存区域

    万次阅读 2019-07-09 11:22:13
    、JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区 域【JAVA 堆、方法区】、直接内存。 线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在...
  • JVM内存区域,开线程影响哪块内存

    千次阅读 2019-07-19 22:57:49
    就为其分配个Program Counter Register(程序计数器), VM Stack(虚拟机栈)和Native Method Stack (本地方法栈),当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。...
  • C/C++程序内存区域划分大总结

    千次阅读 2016-03-28 19:24:05
    程序由代码和数据组成,其中代码存储在代码区中,数据根据类型的不同存储在不同的区域中。本文分别介绍了C和C++中内存区域的划分。 C++作为款C语言的升级版本,具有非常强大的功能。它不但能够支持各种程序设计...
  • 内存的四个区域

    千次阅读 多人点赞 2018-06-13 15:03:59
    内存四个区域的介绍与使用方法:代码区 code 程序被操作系统加载到内存时,所有可执行的代码被加载到代码区,也叫代码段, 程序运行这段时间该区域数据不可被修改只可以被执行。二:静态区 程序被加载到内存时...
  • 深入理解Java虚拟机-Java内存区域内存溢出异常

    万次阅读 多人点赞 2020-01-03 21:42:24
    Java与C++之间有堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来。 文章目录概述运行时数据区域程序计数器(线程私有)Java虚拟机栈(线程私有)局部变量表操作数栈动态链接...
  • Java内存区域内存溢出

    千次阅读 2020-02-09 17:27:55
    内容参考《深入理解JVM虚拟机》,本文JVM均指HotSpot虚拟机。 Java与C语言针对“内存管理”...而在Java内存由JVM管理,垃圾回收器GC会帮助开发者自动回收不再被引用的对象来释放内存,使得Java不太会像C语言那...
  • Java内存区域内存溢出异常 文章目录Java内存区域内存溢出异常????运行时数据区域程序计数器Java虚拟机栈本地...Java虚拟机在执行Java程序的过程会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的
  • JVM:自动内存管理之Java内存区域内存溢出

    千次阅读 多人点赞 2021-01-07 12:03:22
    本博客主要参考周志明老师的《深入理解Java...程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器,在Java虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下.
  • java内存区域

    千次阅读 2019-12-16 12:22:14
    对于java开发人员来说,在虚拟机自动内存管理的机制下,不需要为每个new操作去写配对的delete/free代码,不容易出现内存泄漏和溢出的问题,不过也正是这有,把内存控制的权利交给了虚拟机,一旦出现内存泄漏和溢出方面的...
  • 日期 内核版本 架构 作者 GitHub CSDN 2016-08-31 ... Linux内存管理 1 前景回顾前面我们讲到服务器体系(SMP, NUMA, MPP)与共享存储器架构(UMA和NUMA)1.1 UMA和NUMA两种模型共享存储型多处理机有两种模型
  • JAVA内存区域内存溢出

    千次阅读 2019-08-02 15:42:44
    这是一块比较小的内存单元,是用来记录程序的运行位置。由于在java虚拟机的多线程是轮流切换并分配时间的方式来实现的。在任何一个确定的时间,一个内核都会执行一条线程的指令。为了线程切换后能恢复到正确的执行...
  • Java作为种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、JAVA内存结构、JAVA内存区域、Java内存...
  • JVM内存区域介绍

    千次阅读 2018-02-08 10:28:22
    写博客的好处是,学过的知识及时记录下来,过段时间可以用来复习。另外,还能够帮助别人,因为我们自己遇到不懂的问题往往也是受益于别人的付出。 ...程序计数器是一块较小的内存,通过这个计数...
  • 【深入Java虚拟机】之:Java内存区域内存溢出

    万次阅读 多人点赞 2013-12-30 08:20:07
    一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,字节码解释器工作时通过改变该计数器的值来选择下一条需要执行的字节码指令,分支、跳转、循环等基础功能都要依赖它来实现。每条
  • 内存中的五大区域  栈---局部变量  堆---程序猿手动申请的字节空间,Malloc calloc readlloc  BBS段----未被初始化的全局变量和静态变量  数据段(常量区)----已经被初始化的全局 静态变量 常量数据  ...
  • Java内存区域划分

    千次阅读 多人点赞 2018-10-07 13:11:14
    一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。 java多线程就是通过对线程的轮流切换并分配处理器的执行时间的方式来实现的,在任意时刻,一个处理器都只会执行某一个线程的指令。所以每条...
  • Java内存区域划分、内存分配原理

    万次阅读 多人点赞 2014-11-16 16:20:30
    总结自《深入理解Java虚拟机》之内存区域划分。
  • 套用《围城》句话,“墙外面的人想进去,墙里面的人想出来”,用此来形容Java与C++之间这堵内存动态分配和垃圾收集技术所围成的“围墙”就再合适不过了。对于从事C、C++的开发人员而言,在内存管理领域,他们...
  • JVM内存区域划分

    千次阅读 2016-10-30 23:05:19
    java虚拟机在执行java程序的过程会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些则依赖于用户线程的启动和结束而建立和...
  • 小白都能看懂的java虚拟机内存区域划分

    万次阅读 多人点赞 2019-11-26 17:21:27
    、虚拟机 二、虚拟机组成 1.栈 栈帧 2.程序计数器 3.方法区 对象组成 4.本地方法栈 5.堆 GC GC案例 、虚拟机 ​ 同样的java代码在不同平台生成的机器码肯定是不一样的,因为不同的操作系统底层...
  • Java内存区域划分和内存分配策略

    千次阅读 多人点赞 2020-05-15 12:32:46
    Java内存区域划分和内存分配策略 如果不知道,类的静态变量存储在那? 方法的局部变量存储在那? 赶快收藏 Java内存区域主要可以分为共享内存,堆、方法区和线程私有内存,虚拟机栈、本地方法栈和程序计数器。如下...
  • JVM的内存区域

    千次阅读 2017-11-03 20:39:06
    不知不觉都大三了,回头看看以前的Android开发过程,遇到的很多问题都...1.运行时数据区域JVM在执行Java的程序的时候会将内存划分为几个不同的区域:方法区、虚拟机栈、本地方法栈、堆和程序计数器,理解这几个区域后对

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 292,900
精华内容 117,160
关键字:

内存中的一块区域