首页 > 编程语言 >JVM 创建 Java 对象

JVM 创建 Java 对象

时间:2023-12-30 10:38:18浏览次数:39  
标签:Java 对象 创建 虚拟机 内存 JVM 分配 加载


JVM  创建 Java 对象的流程:类的加载,内存分配、对对象进行必要的设置、执行 <init> 方法初始化。

1. JVM  创建 Java 对象

使用 new 关键字可以创建一个类的对象。

new 指令在虚拟机中的执行操作:

  • 类的加载:首先在常量池(方法区中)去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,则需要进行类的加载。
  • 内存分配:类加载通过之后,虚拟机会给新生对象分配内存, 对象所需内存大小在加载之后便可以确定,分配内存即是在 Java 堆中划分出来

假设 Java 堆中的内存是绝对规整(不同的垃圾回收算法,堆中的内存是不一样的),所有的空闲内存放在一边,被使用的内存放在一边,中间放着一个指针作为分界点,分配内存的则会将指针向被使用的内存移动。如果Java 堆中的内存不是规整的,则需要维护一个列表,记录那些内存是空闲的。

内存分配的并发问题 :Java中的对象创建是相当频繁,简单的指针移动会出现问题,解决方法如下所示。

(1)方法一:JVM虚拟机使用 CAS + 失败重试 的方法保证原子性。

(2)方法二:把内存分配按照线程划分在不同区域,即每个线程先分配一小块内存,称为本地线程分配缓冲TLAB,那个线程需要分配内存,就在那个TLAB上分配,只有TLAB用完并分配新的TLAB时才需要同步锁定。

内存分配完成后,虚拟机需要将分配的内存空间全部初始为0,不包括对象头

  • 虚拟机需要对对象进行必要的设置 , 如 :设置 这个对象是哪个类的实例,如何找到类的元数据,对象的hash码、对象的 GC 分代年龄 , 这些信息存储在对象头中。根据虚拟机当前的运行状态的不同,如是否启用偏向锁等,对象头会有不同的设置模式。
  • 执行 <init> 方法进行初始化,把对象按照程序员的意愿初始化

至此这个对象已经产生,可以被调用了。

参考文献

  • 深入理解Java虚拟机:JVM高级特性与最佳实践 / 周志明著. —— 2 版 . —— 北京:机械工业出版社,2013.6 (2019.1重印)

标签:Java,对象,创建,虚拟机,内存,JVM,分配,加载
From: https://blog.51cto.com/xuxiangyang/9038438

相关文章

  • JVM 判断是否应该回收对象
    JVM内存中程序计数器、虚拟机栈、本地方法栈3 个区域随线程而生,随线程而灭。这几个区域不用考虑回收问题,因为方法结束后 或者 线程结束后,内存就跟着回收了。而Java堆和方法区不一样,一个接口的多个实现类需要的内存不一样,一个方法的多个分支需要的内存也可能不一样,我们只有在程......
  • JVM 的垃圾收集器
    JVM的垃圾收集器:Serial、ParNew、 ParallelScavenge、SerialOld、ParallelOld、CMS、G1。 1. 概述下图中垃圾收集器只要连线则表明垃圾收集器可以搭配使用。没有万能的收集器,具体应用选择合适的垃圾收集器。2. Serial垃圾收集器单线程收集器,用于新生代,这里的单线程指的......
  • Java 并发工具类之 Semaphore
    Semaphore 控制访问特定资源的线程数量,新建规定数量的许可证,获得许可证可以继续执行,未获得需要阻塞,执行完成归还许可证,这样其余的线程(未获得许可证)才可以执行。例如:Semaphore用于流量控制,例如只有10个数据库连接,可以用Semaphore控制只有10个线程访问数据库,这样就不会报错无法获取......
  • Java线程池的学习
    线程池有如下四个优点:降低资源消耗: 重用已经创建的线程, 线程的创建和销毁需要消耗计算机资源,特别是在有大量创建线程请求且线程的处理过程是轻量级的,例如:大多数的服务器。提高响应速度:重用已经创建的线程。提高线程的稳定性:可创建的线程数量是由有限制的,限制值是有多个因素制约,例......
  • Java 中的继承
    继承:可以基于已存在的类构造一个新类,继承已存在的类就是复用(继承)这些类的方法和域,在此基础上,还可以添加一些新的方法和域。1. 继承性 继承性: 把多种有着共同特性的多的类事物抽象成一个类,这个类就是多个类的父类。父类的意义在于可以抽取多个类的共性,代码复用,减少代码量。例:三个......
  • Java中的抽象类
    抽象类必须使用abstract关键声明,例如抽象类MyAbstractStudy:publicabstractclassMyAbstractStudy{}不能使用抽象类创建对象。抽象类中可以没有抽象方法。抽象方法必须为public或者protected,缺省情况下为public。抽象类的子类必须实现父类的抽象方法,如果没有则需要声明子类也为ab......
  • IDEA 中创建 Test 文件夹,Resources文件夹 等各种文件夹
    Sources文件夹里面放 Java 源文件,Test文件夹里面放测试的Java 源文件,Resources文件夹 里面放一些需要加载的配置,例如你使用SSM框架的xml配置文件。1. 第一步在右上角点击对应的 Project Structure(项目结构),如下图所示。2. 第二步点击 Modules。选择要设置的文件夹,点击......
  • Java8 原子类 AtomicInteger 源码阅读
    AtomicInteger 是用 CAS(Compre And Swap,乐观锁)构造的一个 原子类。1. CAS CAS(CompareandSwap)比较并替换,CAS是实现乐观锁的一个重要操作。CAS是一个硬件指令,保证是原子操作,Java中通过UnSafe来实现。详细可一下我的这篇博文:传送。CAS 的基本步骤:执行函数CAS(V,E,N......
  • java-关键字与方法(二)
    charAt() 方法:charAt() 方法返回字符串中指定索引处的字符。示例:Stringstr="HelloWorld";charch=str.charAt(4);//ch的值为'o'在上面的例子中,charAt()方法返回字符串str中索引为4的字符,即字母'o'。length() 方法:length() 方法返回字符串的长度。示例......
  • 无涯教程-Java 正则 - Pattern quote(String s)函数
    java.util.regex.Pattern.quote(Strings)方法返回指定String的文字模式。staticStringquote-声明publicstaticStringquote(Strings)s  - 要被字符串化的字符串。staticStringquote-返回值文字字符串替换。staticStringquote-示例下面的示例显示ja......