目录 -=-讲解对象创建过程中,-=-堆内存和栈内存的情况 -=-构造函数对类对象的成员变量的初始化过程 -=-构造函数出栈 -=-类的方法在不访问类对象的成员变量时造成的内存资源浪费怎么解决? -=-引出static方法 扯淡 --明确概念: -=-类:是对现实事物的抽象描述:举例:人,有年龄,姓名,高矮胖瘦等特征:有吃喝睡等行为动作:现实中的人由特征和行为组成{思想这种东东暂时还是不考虑吧} -=-怎么判别一个类里面时候需要有主函数mian():看这个类是否需要独立运行 -=-描述事物的类有…
1 类和对象 类:是一类事物的描述,抽象的.猫 对象:是一类事物的实例,具体的.某只猫 2 类的定义 成员变量和成员方法 //定义一个学生类 public class Student { //成员变量 String name; int age; //成员方法,不要写static关键字 public void eat(){ System.out.println("吃饭"); } public void study(){ System.out.println("学习")…
简述 今天继续写<深入理解java虚拟机>的对象创建的理解.这次和上次隔的时间有些长,是因为有些东西确实不好理解,就查阅各种资料,然后弄明白了才来做记录. (此文中所阐述的内容都是以HotSpot虚拟机为例的.) 对象的创建 java程序在运行过程中无时无刻都有对象被创建出来,那么创建对象是个怎么样的过程呢?还是看看我自己的理解吧. 判断是否已经执行类加载 当虚拟机遇到一条new指令时 ,首先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载…
最近看JVM内存模型,看了很多文章,大都讲到JVM将内存区域划分分:Mehtod-Area(No heap) 方法区,Heap(堆)区,Program Counter Register(程序计数器),VM Stack(虚拟机栈),Native Mehtod Stack(本地方法栈),其中方法区和堆区是线程共享的.而虚拟机栈,本地方法栈,程序计数器是非线程共享的.每个java程序在自己的虚拟机上,然后告知虚拟机程序的运行入口.再被虚拟机字节码解释器加载运行.JVM运行的时候都会 分配好方法区和堆区…
前段日子在和leader交流技术的时候,偶然听到jvm在分配内存空间给大对象时,如果young区空间不足会直接在old区切一块过去.对于这个结论很好奇,也比较怀疑,所以就上网搜了下,发现还真有这么回事.以下给出具体代码来说明: 首先定义好jvm内存各个区域的大小.我设定的是eden区8M,from和to各1M,old区10M,总共20M的空间,参数如下: -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 紧接着,开始写程序.很简单,就是初始化一个9M的程序,…
本文主要是对<深入理解java虚拟机 第二版>第三章部分做的总结,文章中大部分内容都来自这章内容,也是博客 JVM 学习的第二部分. 简述 说到垃圾收集(Garbage Collection,GC),很多人可能会认为这是 Java 自有的特性,曾经我也一度这样想,后来才知道 GC 的历史要远远长于 Java,它第一次真正使用是在 Lisp 中,现在,像 python.go 等都有自己的垃圾收集器.在 GC 最开始设计时,人们在思考 GC 时就需要完成三件事情: 哪些内存需要进行回收? 什么时候…
对象在内存中的存储 1. 内存中的五大区域. 栈: 存储局部变量. 堆: 允许程序员手动在堆区申请指定的连续的字节数的空间来使用. BSS段: 存储未初始化的全局变量.静态变量. 数据段(常量区):  存储已经初始化的全局变量.静态变量.常量数据. 代码段:存储程序的代码. 2. 类加载. 1). 当创建对象的时候,肯定需要访问这个类.因为只有访问了类才知道类中有那些成员. 2). 如果只是声明类指针的时候,也会访问这个类.以确定这个类型是否存在. 当类第一次被访问的时候,会将类存储到代码段之中…
参考资料 本文参考:<深入理解Java虚拟机>作者 周志明 知识产权归作者所有 走近java java组成部分:java语言.各平台虚拟机.Class文件结构.java api 类库.第三方类库 Jre包括jvm和api java 未来展望:模块化.混合语言.多核并行.丰富语法.64位虚拟机 自动内存管理机制 PC程序计数器 PC:程序计数器,用于记录和控制下一条需要执行的字节码的位置,分支.循环.跳转.异常处理.线程恢复都需要依赖PC完成. PC 是每个线程私有的,如果执行的是java方法,…
在hotSpot虚拟机中,对象在内存中的布局可以分成对象头.实例数据.对齐填充三部分. 对象头:主要包括: 1.对象自身的运行行元数据,比如哈希码.GC分代年龄.锁状态标志等,这部分长度在32位虚拟机中为32bit(64位中为64bit),为方便存储这部门的数据结构不是固定的. 2.一个类型指针,指向类元数据,表明该对象所属的类型:另外如果对象是Java数组,那么对象头中还必须有一块用于记录数组长度的数据. 实例数据:它是对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承…
在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我们还可以通过反射机制.Object.clone 方法.反序列化以及 Unsafe.allocateInstance 方法来新建对象. 其中,Object.clone 方法和反序列化通过直接复制已有的数据,来初始化新建对象的实例字段.Unsafe.allocateInstance 方法则没有初始化实例字段,而 new 语句和反射机制,则是通过调用构造器来初始化实例字段. 以 new 语句为例,它编译而成的字节码将…