分享(Java中new一个对象的过程)
感觉要妥妥分享一波干货知识
new一个对象过程中发生了什么???
Java在new一个对象,会先查看对象所属的类是否被加载到内存,如果没有的话,先通过类的全限定名来进行加载。加载并初始化类完成后,在进行对象的创建工作。
总而言之就是俩个过程:加载初始化类和创建对象。
双亲委派模型
类加载器收到加载请求,自己不会进行加载,把这个请求委托给父类,以此类推。只有当父类反馈自己无法加载,子加载器才会尝试加载。
好处:可以有效确保一个类的全局唯一性,当程序出现多个限定名相同的类时,类加载器在执行加载时,始终只会加载其中的一类。
1.加载
2.验证(语义验证、操作验证)
3.准备(为类中所有静态变量分配空间)
4.解析
5.初始化(先父后子)(静态变量赋值,执行static代码块)
创建对象
1.在堆区分配对象需要的内存
分配内存包括子类和父类的实例变量
2.对所有实例变量赋默认值
方法区内对实例变量定义拷贝一份到堆区,赋默认值
3.执行实例初始化代码
执行顺序:先初始化父类再初始化子类
先执行代码在执行构造方法
4.如果有类似与
child c=new child()
形式的c引用的话,在栈区定义child 类型引用变量c,然后将堆区对象的地址赋值给它。
堆和栈
栈:
管程序如何运行;程序如何执行;如何处理数据
主管Java程序的运行,它保存方法的局部变量,部分中间的结果,并参与方法的调用和返回值,以栈帧的格式为基本单位进行存储
堆:
管理数据的存储
虚拟机内存与本地内存的区别
Java虚拟机在执行时会把管理的内存分配成不同的区域,这些区域被称为虚拟机内存,同时对于虚拟机没有直接管理的物理内存,也有一定利用,这些被利用却不再虚拟机内存数据区的内存,称为本地内存
JVM内存
受虚拟机内存大小的参数控制,当大小超过参数设置的大小时,就会报OOM
本地内存不受虚拟机内存参数的限制,只受物理内存容量的限制
虽然不受参数的限制,但是如果内存的占用超出物理内存的大小,同样也会报OOM
虚拟机栈JVM stacks
每个栈帧包含如下内容:
局部变量表
局部变量表中存储着方法里的java基本数据类型(byte,short,int,long,float,double,char,boolean)以及对象的引用
操作数栈
动态连接
方法返回地址
虚拟机异常
Stack OverFlowError:线程请求的栈深度大于虚拟机所规定的栈深度。栈溢出
Out OfMemoryError:虚拟机的栈容量可以动态扩展,那么当虚拟机栈申请不到内存时会抛出。OOM内存溢出
Java堆
java堆是JVM内存中最大一块。由于所有线程共享,是由来及收集器管理的内存区域,主要存放对象实例。由于java虚拟机的发展,堆中也多了许多东西,现主要有:
对象实例
类初始化生成的对象
基本数据类型的数组也是对象实例
字符串常量
字符串常量池原本存放与方法区,jdk 7开始放置于堆中
字符串常量池存储着的是String对象的直接引用,而不是直接存放对象,是一张String table
静态变量
静态变量有static修饰的变量,jdk 7时以方法区迁移至堆中
线程分配缓冲区
线程私有,但是不影响java堆的共性
增加线程分配缓冲区是为了提升对象分配时的效率
成员变量、局部变量、类变量分别存储在内存什么地方?
类变量
是用static修饰符修饰,定义在方法外的变量。随着java进程产生和销毁
在java 8之前把静态变量存放于方法区,在java 8时存放在堆区
成员变量
是定义在类中,但是,没有static修饰符修饰的变量随着类的实例产生和销毁,是类实例的一部分
由于实例的一部分,在类初始化时候,从运行时常量池取出直接引用或者值,与初始化的对象一起放入堆中
局部变量
局部变量时定义在类中方法中的变量
在所有方法被调用时放入虚拟机栈的栈帧中,方法执行结束后从虚拟机找出弹出。所以存放在虚拟机栈中。
分享(Java中new一个对象的过程)相关推荐
- java socket分包粘包 代码_分享java中处理socket通信过程中粘包情况的实例代码
本篇文章主要介绍了java中处理socket通信过程中粘包的情况,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 这两天学习了java中处理socket通信过程中粘包的情况,而且很重要,所以,今天添 ...
- java类怎么删除对象_在java中删除一个对象?
在java中删除一个对象? 我想删除一个我创build的对象(跟随着你的一个椭圆),但是我怎么做呢? delete follower1; 没有工作. 编辑: 好吧,我会给更多的上下文. 我正在制作一个 ...
- 请说明一下JAVA中反射的实现过程和作用分别是什么?
请说明一下JAVA中反射的实现过程和作用分别是什么? Java语言编译后形成.class文件,反射就是通过字节码文件找到一个类,类中的方法及属性等.反射的实现主要通过四个类 Class 类的对象 Co ...
- Java:new一个对象的过程中发生了什么?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:沉默哥 cnblogs.com/JackPn/p/93861 ...
- java中new一个对象要经历哪些过程
我们要了解new一个对象经历哪些过程,就要知道new对象之前会做什么事情. 首先Java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名将对象所属的 ...
- Java之new一个对象简单过程
1 问题 new一个对象简单过程 2 过程 1)类加载过程(第一次使用该类) 先看这个类有没有加载到内存,没有的话下面操作 (1).加载:类加载器(双亲委派模式)通过全限名读取类的二进制流到jvm内部 ...
- 分享Java 中如何运行字符串表达式?
2019独角兽企业重金招聘Python工程师标准>>> 在日常的开发中,偶尔会遇到运行字符串表达式的情况,通常这样的需求会对需求进行进一步分析,然后进行进一步 "特殊化&q ...
- java中new一个对象时具体都发生了什么?
java是一门面向对象的程序设计语言,在java中一切皆为对象.在java中创建一个新对象的方式有很多种如new+构造方法,克隆,反射,反序列化等.那么当我们new一个对象时,java底层都经过了怎样 ...
- 动图 + 源码,演示 Java 中常用数据结构执行过程及原理
最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...
- 数据结构中缀表达式转后缀表达式与后缀表达式的求值实训报告_动图+源码,演示 Java 中常用数据结构执行过程及原理...
程序员的成长之路互联网/程序员/成长/职场 关注 阅读本文大概需要 3.7 分钟. 作者:大道方圆cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, ...
最新文章
- Cookie简单使用方法
- mapreduce任务出错最大尝试次数
- 2.7 RMSprop-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
- Linux下挂载ISO文件
- PHP中||与or的区别
- java取得当前日期增加一天或多天
- Semaphore(多资源多线程)
- 利用Python获取数组或列表中最大的N个数及其索引
- [BZOJ2286] [Sdoi2011]消耗战
- linux用ping命令测试网速,Linux通过终端测试网速
- linux 搜狗输入法 不能使用方法,在Linux系统中Sublime Text无法使用搜狗输入法的解决方法...
- 离线数仓DIM层和DWD层,联表后表和字段命名规则
- deprecate(反对) 关于依赖版本低的问题
- php记录访问者ip和次数,一个能对访问者进行编号、记录访问次数、IP、时间的统计制作实例...
- 内存重叠的拷贝--memmove
- Linux文件系统与持久性内存介绍:块设备、闪存(NAND/NOR)、NVDIMM(非易失性内存)、PMEM(PMDK)- ndctl
- Thingsboard 时序数据和属性数据
- 70个数据分析常用网址,我先收藏了!
- 人力资源管理计算机基础,人力资源管理-专-李佑强-计算机应用基础实践报告.doc...
- CSS3的景深和transform 属性