java内存区域分析及java对象的创建
java虚拟机在执行java程序的过程中会将它管理的内存区域加分为若干个的不同的数据区域.
主要包括以下几个运行时数据区域,这里就只介绍经常会用到的
1:java虚拟机栈:我们常说的堆栈,栈就是指的java虚拟机栈
作用:java方法执行的内存模型。每个方法在执行的时候会创建一个栈帧,这个栈帧保存了局部变量表(基本类型,对象引用),操作数栈,动态链接等
一个方法的开始与结束的过程,就是栈帧进出java虚拟机栈的过程
2:java堆:存放对象实例,是内存最大的一块,垃圾收集器主要管理放入区域
3:方法区:存储了加载的类信息(如类名,访问修饰符,字段描述,方法描述),常量(常量存储在运行时常量池里,但运行时常量池是方法区的一部分,这里常量池也包括存储通过String,intern()本地动态生成的常量)
4:了解了java虚拟机的内存区域划分以后,在讲讲对象是如何创建的
当java虚拟机运行程序时,碰到new指令(假设这个引用代表的类已经被加载、解析、初始化,就像用橡皮泥模板化捏大象,首先你要有大熊的模板),将会为这个对象分配内存,内存大小在类加载完成以后即可确定(有了大象的模板以后,你就大概知道需要多少橡皮泥了),为java分配内存的方法有两种:1):如果内存规整的话,可以采用指针碰撞 2)反之,空闲列表,感觉这里用橡皮泥的列子好像不合适,如果一种颜色的橡皮泥一直分配去做大象就是指针碰撞,如果随意找颜色,如果那块橡皮泥不够用来做大象,就换一种,直到找到符合能做大象颜色的橡皮泥就是空闲列表。分配完内存以后,就对内存进行初始化0,接着对对象进行初始化(主要是对对象头的设置),但是现在的初始化只是针对java虚拟机来说是完成了的,对java程序来说还未完成,最后一步,按照程序员的意思对对象进行初始化,我的理解是按照程序员的意思调用构造器对字段进行初始化,所以我到这里也明白了jaba编程思想里说的所有的字段会在方法(包括构造器之前先初始化为默认的初值)
5:java对象在堆内存又可以分为三块区域,1是对象头,(保存哈希码,gc年龄代,锁状态标识买现成持有锁,偏向线程ID等等,还有类型指针,确定是哪个对象的实列,但并不是每个对象都有) 2是实列数据, 3是对象填充,因为对象必须是8字节的整数倍,对象头是8字节的整数倍,所以当对象实列数据部分没有对其时,就需要通过对齐来填充
6:对象的访问定位:两种方式:1)使用句柄 2)使用直接指针、
这张图直接明确:

第二种方式比第一种方式节省了一次指针定位的开销,所以速度更快
总结知识点辛苦,转载请说明出处。如有讲解不当的地方,请多多指教
java内存区域分析及java对象的创建的更多相关文章
- 【java基础 7】java内存区域分析及常见异常
本篇博客,主要是读书笔记总结,还有就是结合培训分享的总结,没有太多的技术含量! java 的自动内存管理机制,使得程序员不用为每一个new惭怍的对象写配对的delete/ free代码(回想起C++的 ...
- Java内存区域分析
程序计数器 指令运行的指示器. 每一个线程都有独立的程序计数器,互无影响,我们称这类区域为线程私有的内存. 运行Java方法,计数器记录的是正在运行的虚拟机字节码指令地址;假设运行的是native方法 ...
- 深入理解Java虚拟机读书笔记1----Java内存区域与HotSpot虚拟机对象
一 Java内存区域与HotSpot虚拟机对象 1 Java技术体系.JDK.JRE? Java技术体系包括: · Java程序设计语言: · 各种硬件平台上的 ...
- Java内存区域与对象创建过程
一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...
- 可能是把Java内存区域讲的最清楚的一篇文章
写在前面(常见面试题) 下面是面试官可能在“Java内存区域”知识点问你的问题,快拿出小本本记下来! 基本问题: 介绍下Java内存区域(运行时数据区). Java对象的创建过程(五步,建议能默写出来 ...
- JVM笔记(一) Java内存区域
Java 内存区域 总概 java虚拟机在执行java程序的过程中,会把它管理的内存划分为几个不同的数据区域.每当运行一个java程序时,就会启动一个虚拟机. 具体的区域如图所示: 同时,方法区 与 ...
- java虚拟(一)--java内存区域和常量池概念
一.java运行时数据区 也可以称为java内存区域,和java内存模型不是一回事,不要弄混,这里基于jdk1.8之前 1.1.方法区 线程共享,类装载过程中产生的java.lang.Class对象保 ...
- Java内存区域(运行时数据区域)和内存模型(JMM)
Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分. 而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之 ...
- JVM Java 内存区域透彻分析(转)
出处: Java 内存区域透彻分析 Java8内存模型—永久代(PermGen)和元空间(Metaspace) 这篇文章主要介绍Java内存区域,也是作为Java虚拟机的一些最基本的知识,理解了这 ...
随机推荐
- Storm/JStorm之TopologyBuilder源码阅读
在Strom/JStorm中有一个类是特别重要的,主要用来构建Topology的,这个类就是TopologyBuilder. 咱先看一下简单的例子: public static void main(S ...
- perl的安装和版本切换工具-perlbrew
setenv PERL /opt/perl5 --设置新perl的起始安装路径 curl -kL http://install.perlbrew.pl | bash source /opt/perl5 ...
- js一些重点知识总结(一)
1.javaScript与java的区别?(从它们的解释,运行等方面说) 第一,javascript是基于对象的,而java是面向对象,即java是一种真正的面向对象的语言,即使是开发简单的程序, ...
- java中权限修饰符protected的使用注意事项
java中四种权限修饰符, 平时编码中最常用的其实public和private, 虽然对protected的概念一直都知道, 但真正使用时才发现有些偏差. protected表示被其修饰的成员可以被本 ...
- PHP输出函数print, printf, sprintf的区别
PHP中常用的字符串输出方式是:使用echo和print两种方法来显示字符串.如果涉及格式化输出操作,还可以试用printf和sprintf函数. 一.先说echo和print两种方法 print的语 ...
- storm从入门到放弃(三),放弃使用《StreamId》特性。
序:StreamId是storm中实现DAG有向无环图的重要一个特性,但是从实际生产环境来看,这个功能其实蛮影响生产环境的稳定性的,我们系统在迭代时会带来整体服务的不可用. StreamId是stor ...
- 从 Vue 1.x 迁移 — Vue.js
闲聊: 又到周五啦,明天不用上班啦哈哈哈哈哈,想想就好开心啊,嘻嘻,小颖这周三的早晨做个一个美梦,把自己愣是笑醒了,梦的大概剧情我忘记了,总之宝宝是被笑醒的,行了之后还傻笑了一段时间,真希望每天早上都 ...
- 双向循环链表(C语言描述)(三)
代码清单 // linkedlist.h #ifndef __LINKEDLIST_H__ #define __LINKEDLIST_H__ #include <assert.h> #in ...
- zabbix_server----邮箱报警
zabbix邮件报警部署!!!!!!!!!!!!!!! Zabbix监控服务端.客户端都已经部署完成,被监控主机已经添加,Zabiix监控运行正常,通过查看Zabbix监控服务器,可以了解服务器的运行 ...
- 算法竞赛入门经典 习题2-10 排列(permutation)
习题2-10 排列(permutation) 用1,2,3,-,9组成3个三位数 abc, def, 和ghi,每个数字恰好使用一次,要求 abc:def:ghi = 1:2:3.输出所有解.提示:不 ...