JVM的内存分为两部分:stack和heap
Stack(栈)是指JVM的内存指令区。Java基本数据类型,Java指令代码,常量都存在stack中。
heap(堆)是JVM的内存数据区。heap专门用来保存对象的实例,实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中),对象实例在heap中分配好后需要在Stack中保存1个4字节的heap内存地址,用来定位该对象在heap中的位置,以便找到该对象实例。
Stack不存在内存管理问题,系统自动管理,heap中的对象由GC负责垃圾回收。
GC垃圾收集的规程:GC进程定期扫描heap,他根据stack中保存的4字节对象地址扫描heap,定位heap中的这些对象,进行一些优化,并且假设heap中的没有扫描到区域都是空闲的,统统refresh(实际上是把stack中丢失对象地址的无用对象清除了)。这就是垃圾回收的过程。
关于对象
1、方法本身是指令的操作码部分,报存在stack中;
2、方法内部变量作为指令的操作数部分,跟在指令的操作码之后,保存在stack中(实际上是简单类型保存在stack中,对象实例在stack中保存地址,在heap中保存值)
上述的指令操作数和指令操作码构成完整的Java指令。
3、对象实例包括属性值作为数据,保存在heap中。
关于静态方法和静态属性
当一个ClassLoader load进入JVM后,方法指令报存在stack中,此时heap区没有数据,然后程序计数器开始执行指令,如果是一个静态方法,直接依次执行指令代码,当然此时指令代码无法访问heap数据区;如果是非静态方法,由于隐含参数没有值,会报错。因此在非静态方法执行之前,要先new对象,在heap中分配数据,并把stack中的地址指针交给非静态方法,这样程序计数器一次执行指令,而指令代码就能够访问到heap数据区。
由于上述的原因,静态属性是 保存在stack中的(基本类型报存在stack,对象类型地址保存在stack中,值报存在heap中),并因此具有全局属性。
补充:字符串常量在stack分配,this在heap中分配,数组想对象一样既在stack中分配地址放数组名称,又在heap中分配数组实际大小的空间。
分享到:
相关推荐
它虽然位于Java内存模型的堆中,但其内部使用了native方法`unsafe.allocateMemory(size)`来分配系统级别的内存,这部分内存不受JVM直接管理。`unsafe`对象提供了直接访问和操作Java对象和数组底层内存的能力,这里的...
类加载器实质上是把类文件从硬盘读取到内存中。 类加载的方式分为隐式加载和显式加载: - **隐式加载**:程序在使用`new`等方式创建对象时,会隐式地调用类的加载器把对应的类加载到JVM中。 - **显式加载**:通过...
Java中的类装载器实质上也是类,功能是把类载入JVM中。值得注意的是,JVM的类装载器并不是一个,而是三个,层次结构如下: * Bootstrap Loader:负责加载系统类 * ExtClassLoader:负责加载扩展类 * AppClassLoader...
- **作为参数传递**:Java方法实质上是传值,传递引用实际上是传递引用的副本;而在C++中,传递指针实际上是传递指针所指向的地址。 #### 12. equals()与== 的区别 - 当用于基本数据类型时,`==`比较的是值是否...
Java中的类加载器实质上也是类,功能是把类载入JVM中。JVM中的类加载器并不是一个,而是三个,层次结构如下:Bootstrap Loader、ExtClassLoader和AppClassLoader。Bootstrap Loader负责加载系统类,ExtClassLoader...
- Java有内置的垃圾回收机制,自动管理内存,避免了手动内存释放可能导致的问题。 - 在字符串处理上,Java没有C++中的字符串结束符'\0'。 在Java编程中,import语句用于导入类库。java包和javax包起初是有区别的,...
4. 高级特性:书中可能还包括Java的高级特性讲解,比如垃圾回收机制、Java内存模型、Java 8引入的函数式编程特性(如Lambda表达式和Stream API)、Java模块化系统等。 5. 应用场景:Java广泛应用于企业级应用开发,...
Java虚拟机(JVM)是Java程序运行的基础,深入了解JVM对于优化Java程序的性能至关重要。 ##### 2.1 JVM基础知识 - **JVM架构**:主要包括类加载器子系统、执行引擎、内存区域(堆、栈、方法区等)。 - **类加载过程*...
理解JVM如何分配和管理内存,以及如何通过调优提高应用性能。 7. **网络编程**:Java的Socket编程,理解TCP和UDP的区别,以及如何实现服务器和客户端的通信。 8. **设计模式**:设计模式是软件工程的最佳实践,如...
二维数组实质上是一个数组的数组。 ##### 12. 操作数组的工具类-Arrays Java提供了Arrays工具类,其中包含了各种操作数组的方法,如排序、查找等。 ##### 13. Java5新特性对数组的支持 Java 5引入了增强的for...
开发者编写Java代码后,通过Java编译器转换成字节码(.class文件),而这些字节码可以在任何安装了相应版本JVM的平台上执行。Java语言特别强调对象的使用,是一种面向对象的语言,它提供了类(Class)和接口...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、健壮性和...通过深入学习以上这些知识点,初学者可以建立起坚实的基础,进一步探索Java的高级特性,如集合框架的高级用法、并发编程、JVM内存管理、设计模式等。
内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的...
涵盖了Java基础、容器、多线程、反射、对象拷贝、JavaWeb、异常、网络、设计模式、Spring相关框架、Hibernate、MyBatis、消息队列系统(RabbitMQ、...Zookeeper)、数据库(MySQL)、缓存系统(Redis)、以及Java虚拟机(JVM)等方面...
Java 中所有的类必须加装到 JVM 中才能运行,这个工作是由 JVM 中的类装载器完成的,类装载器所作工作实质是把类文件读取到内存当中。 6. STRING 与 STRINGBUFFER 的区别 String 在追加内容的时候不会在原有的内存...
- **与体系结构无关**:Java字节码可以在任何支持JVM的平台上运行。 - **可移植**:Java的“一次编写,到处运行”特性确保代码在不同平台上的兼容性。 - **高性能**:通过JIT(Just-In-Time)编译器,Java能实现...
1. 枚举是类:枚举实质上是Java中的一个类,可以有方法和字段。 2. 枚举常量是对象:每个枚举值都是其枚举类的一个实例,且每个实例都有自己的唯一的引用。 3. 枚举的继承性:枚举默认继承自`java.lang.Enum`类,不...
- 对象赋值实质上是创建了对同一对象的另一个引用,而非创建新的对象。 4. **继承与多态**: - 子类可以从父类继承属性和方法,但子类的成员数量不一定多于父类。 - 抽象方法没有具体的实现细节,必须在子类中...
5. **串**(字符串):在Java中,字符串`String`实质上是字符数组,常用操作包括拼接、查找、替换等。KMP算法是字符串匹配的经典算法,对于快速查找子串在字符串中的位置非常有用。 **非线性数据结构**通常包括树...
内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的...