Java的内存管理实质上就是JVM的内存管理
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中分配数组实际大小的空间。
下面再说C/C++内存管理
在C++中,内存分为5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈:编译器自动管理,里面的变量是局部变量、函数参数等(可以用alloca函数分配)
堆:由new分配的内存块,用delete释放
自由存储区:由malloc分配,用free释放和堆很相似
全局/静态存储区:全局变量和静态变量
常量存储区:常量
分享到:
相关推荐
首先,Java 是一种面向对象的语言,它强调封装、继承和多态等面向对象特性,同时提供了垃圾回收机制,自动管理内存,避免了C/C++中的内存泄漏和悬挂指针等问题。Java 的设计目标是实现跨平台运行,通过Java虚拟机...
- 需要特别注意的是,Java中的对象处理方式与C/C++大相径庭,Java通过垃圾回收机制自动管理内存,而C/C++则依赖于手动内存管理。 ##### 3. **Java语言特性概览:** - Java是一种强类型、面向对象的语言,与C/C++...
本文聚焦蓝桥杯真题,深入剖析 Java 与 C/C++ 的解题之道。 蓝桥杯作为全国性 IT 学科赛事,自 2009 年创办后颇具影响力,涵盖软件、电子等多个比赛方向,软件赛分 C/C++、JAVA、Python 组等。对大学生而言,它能...
### Java与C/C++的主要区别 #### 一、指针机制 在C/C++中,指针是一个重要的特性,提供了底层内存操作的能力。这使得程序员能够直接管理内存资源,但同时也带来了潜在的安全风险,比如野指针问题或内存泄漏等。而...
在这里,你可以调用任何C/C++代码,与Java对象交互。 - 编译C/C++代码,生成动态链接库。例如,在Windows上,你可以使用`cl Sample1.cpp /Fe:Sample1.dll /LD`。 3. **Java端加载本地库**: - 在Java代码中,我们...
总的来说,"C/C++与Java互通AES加密解密"是一个挑战性的任务,需要对加密算法、数据类型转换、内存管理以及跨平台通信有深入的理解。通过这个实践,开发者可以提升自己的编程技巧,并对数据安全有更深刻的认识。
其次,书中会讲解Java内存管理,特别是垃圾回收机制。Java的自动内存管理是与C/C++的一大区别,程序员无需手动释放内存,而是由JVM(Java虚拟机)负责垃圾回收。这一特性减少了内存泄漏的可能性,但也对程序员的思维...
本教程将详细介绍如何使用C/C++实现Java的Native方法接口,并通过代码实例来展示JNI编程的基本步骤。 1. **JNI简介** JNI是一种规范,它定义了Java虚拟机(JVM)和本地代码之间的接口。通过JNI,开发者可以在Java...
- **内容聚焦**:本书深度探讨了C语言的历史沿革、语言特性、声明规则、数组与指针、内存管理等方面的专业知识,尤其对声明、数组与指针、内存使用的细致剖析,是成为C专家不可或缺的学习资料。书中丰富的实际案例,...
本资料包"程序员面试试题汇总(java,sql,c/c++)"是一个集大成者,包含了针对Java、SQL和C/C++等关键技能的常见问题和解答。下面,我们将深入探讨这些领域的核心知识点。 首先,我们来关注Java,一种广泛应用于...
NDK是一组工具,允许开发者使用C和C++编写部分应用程序,这些代码可以与Java代码无缝集成。 1. **JNI(Java Native Interface)基础** JNI是Java平台的标准接口,用于在Java应用中调用本地(非Java)代码。它定义...
1. **Eclipse平台**:Eclipse是一个开源的、跨平台的开发框架,它不仅支持Java,还通过插件扩展支持多种编程语言,如C/C++。Eclipse IDE基于Eclipse平台构建,提供了一整套开发工具和服务。 2. **CDT(C/C++ ...
四、C/C++ Binder与Java Binder的对比 虽然Java Binder是Android应用开发者更常见的API,但C/C++ Binder提供了更低层次的访问,可以实现更高效、更灵活的进程间通信。Java Binder是C/C++ Binder的封装,提供了面向...
在C/C++中调用Java代码,主要依赖于Java Native Interface (JNI),这是一个允许Java代码与本地代码交互的标准接口。JNI使得开发者可以将C/C++的高性能代码集成到Java应用程序中,或者从C/C++程序中调用Java的类和...
5. **垃圾收集**:C和C++不像Java或Python那样内置垃圾收集机制,但可以通过智能指针(如C++的`std::unique_ptr`、`std::shared_ptr`)来模拟自动内存管理,它们在对象不再使用时自动释放内存。 6. **内存池**:为...
本项目演示了如何在Android应用中使用JNI,实现C/C++与Java的双向调用。以下是关于这个主题的详细讲解。 1. JNI基础: JNI是Java平台的标准组成部分,它提供了一套接口,让Java代码能够调用本地(非Java)代码,并...
本教程将基于Eclipse IDE来探讨如何进行NDK开发,包括Java与C/C++之间的互调用。 首先,我们要理解NDK的基本概念。NDK是一组工具,用于在Android平台上编译C和C++代码,生成原生库,这些库可以直接被Android应用...
在Android平台上,调用C或C++代码是通过Java Native Interface (JNI) 实现的,这是一种允许Java代码与本地库交互的技术。JNI已经成为Android开发者在性能关键领域,如图形处理、游戏引擎、加密算法等中引入C/C++代码...
C和C++需要手动管理内存,而Java的LinkedList类提供了方便的API。 - **栈**:后进先出(LIFO)的数据结构,C、C++和Java都有内置的栈支持,如C++的std::stack,Java的java.util.Stack。 - **队列**:先进先出...
`C++API.chm`将涵盖这些内容,包括文件操作、内存管理、字符串处理、容器和算法等。学习C/C++ API,尤其是STL,有助于提升程序的效率和代码的复用性,同时C++ API也常用于系统级编程和游戏开发,因为它可以更接近...