首页 > 系统相关 >【Java】内存区域与对象创建

【Java】内存区域与对象创建

时间:2022-11-11 12:08:08浏览次数:38  
标签:Java 对象 创建 虚拟机 私有 线程 内存 句柄


这块内容是java很基础的部分,涉及到JVM的设计原理,很久以前就看到过,这次需要区分线程私有和共享

基本java的运行时数据区可以分为五大块:

程序计数器,为线程私有,每一个线程都有一个,这样线程切换以后才可以恢复上一个线程的现场。

虚拟机栈,为线程私有,非本地方法的运行,每一个线程都有其虚拟机栈

本地方法栈,为线程私有,本地方法的运行

堆,所有线程共享,存放对象和数组

方法区,所有线程共享,存放虚拟机加载的类信息,静态变量和常量

线程私有的数据是线程安全的,通常多线程会出问题的是堆区,也就是对象,多线程修改或读取堆上的同一个对象时会出一些问题,当然java对此有相应的处理,称为内存模型,所谓内存模型就是各个线程使用内存里的变量的规定,当然这里肯定说的是堆区。

对象创建过程:
当虚拟机遇到一条new指令时,首先会看方法区是否有对应的类,如果没有就启动类加载器加载。如果有,就可以通过类定义信息得到该对象需要的内存大小,然后就会申请一块内存区域。申请得到内存以后,会初始化全部的属性为0,然后调用构造方法init来为属性赋值。

对象内存分布:

一个对象的内存分为三个区域,

对象头部,记录了对象的一些status信息,比如说GC年代,hash码,对象锁以及类定义(可能不需要,看实现)等信息

对象的属性

对齐信息

我们都是通过一个引用来操作对象的,通常我们记得可以通过引用得到对象,但是我们还需要得到对象的类型,对象的类型记录在哪里有两个实现:

句柄方式,堆上除了存储对象还存储了对象的句柄,句柄是一个二元信息,<对象位置,类定义位置>。我们的引用实际上是指向了句柄

直接方式,引用直接指向了对象的位置,那么该对象的内存区域还必须包含类定义的位置信息,堆上对象的内存布局需要包含这一信息

使用句柄效率稍差,因为需要定位两次,但是垃圾回收时,对象的位置变化了,只需要修改句柄,所有的引用都可以不变。虚拟机一般使用的是直接方式


标签:Java,对象,创建,虚拟机,私有,线程,内存,句柄
From: https://blog.51cto.com/u_15873544/5844090

相关文章

  • 【Java】split(
    java的split函数接受一个正则表达式的分隔符为参数,将string按照分隔符划分为一个数组。我们可能会忽略这个参数的要求,这里传入的分隔符并不是一个普通的字符串,而是一个正则......
  • 【Java】多线程 数目
    今天看到一篇文章,讲多线程数目的,很棒这个问题还是很容易被忽略的,就是多线程到底是为了什么?最开始学习多线程的时候,往往将多线程和性能高划等号,只要用了多线程就能提升性能,其......
  • 【Java】NoSuchMethodError
    刚开始写代码时,特别是类似web这种需要很多第三方jar包的项目,经常会遇到这个问题。这次记录下这个报错的原因。简而言之,这个报错是肯定是因为compile时方法存在,但是runtime时......
  • C语言 指针及动态内存分配
    大一学《计算系统基础》的时候,没有讲这一块的内容,导致后面遇到指针就头疼,今天特来梳理一下这块的内容。1.变量的类型类型的语言,即要求定义变量的时候必须制定类型,然后编译器......
  • 【Java】反射与单例
    双重检验与静态内部类两种方法都可以实现延迟加载的单例模式。但是无法阻止反射破坏单例,因为反射可以无视修饰权限,直接调用构造方法创建对象,下面是一个例子:packageThreadTe......
  • 【Java】序列化与单例
    之前明白了线程安全且延迟加载的单例如何写,有两种,双重检验和静态内部类。然后为了防止反射破坏单例,在私有构造方法里面加入了一个同步变量的判断,确保构造方法只调用一次。......
  • 【Java】HashMap 实现原理
    Java集合框架有两个顶级接口,一个是collection接口,另一个是map接口,hashmap便是map接口的重要实现类。首先看map接口。根据map键值对的特性,接口中必然有相关的方法,主要是:Vget......
  • 【Java】concurrentHashMap
    concurrentHashMap类引入了段的概念,读操作不需要上锁,写操作只需要获取相应的段的锁即可,而非锁定全部的数据。所以map里面是一个segment的数组,segment里面才是entry的数组。m......
  • 【Java】Map 实现类
    hashmap:遍历时顺序无法保证linkedhashmap:遍历时按照插入顺序treemap:遍历时按照大小顺序linkedhashmap实现上是继承了hashmap,多了一个双向的链表记录插入顺序,重写了迭代器,基......
  • 【Java】 Set实现类
    Set是collection的子接口,对应数学中的集合。与list的最主要的区别是,set无法通过索引取值,因为set是无序的。set还有一个特性是唯一性,不能存相同的元素。第一个实现类是hashse......