java内存管理浅析

首先感谢强大的网络资源,本博文是根据网络上的各种资源进行整合,然后加入自己的理解而成,可能会与其它网络资源有重复,望其他作者多多包涵。由于初学java,如有不准确的描述还请读者指正。下面正式切入正题:

众所周知,java和C++都是面向对象的编程语言,但是与C++相比,java上手比较容易,而且使用方便。小弟对c++了解不是很多,但是有一点是C++初学者最为头痛的问题,那就是内存管理,这也正是C++和java之间很大的一个区别。在C++中,内存是依靠程序员自己来管理的,编写程序过程中稍有不慎就会导致致命的错误————崩溃;而java中,内存是依靠java虚拟机来管理的,叫做垃圾回收机制,程序员可以不用去过多关心这方面的东西,因此也剩下了不少的时间和精力。但是对于一个优秀的程序员而言,这种内存自动管理的机制并不是一件好事,就像手工制作的皮鞋远比机器制作的皮鞋要好的多,舒服的多一样。内存自动管理不仅会降低程序的运行效率,同时也降低了程序的可靠性,所以,java获得了方便,易学的优势是在牺牲了效率和程序可靠性的基础之上的。既然java内存管理都是自动化的,那我们为啥还要去了解呢,原因很简单:有助于个人能编写出更加优秀的代码。

下面就让我们了解一下java内存的管理机制:

java内存的管理无非就是两点:内存的分配和内存的回收。

其中内存分配包括堆和栈两部分:堆中存储的都是实体,而栈中存储的是指向实体的引用;

例如:新建一个数组  int[] arr = new int[3];在内存中的分配是这样的:

其中,栈中的数据不是长久存在的。arr位于栈中,其中存放的是数组的地址,一旦出了作用域,arr将被释放掉,而堆中的数据不会被释放,但是也没有索引能够获取数组的数据。因为arr是找到数组数据的唯一一把钥匙,钥匙丢了,那么数据也就无法被利用了,也就成了内存垃圾,在C++中,这部分垃圾是程序员自己去处理的,但是在java中有专门的垃圾回收机制,由虚拟机来完成。

同样,java程序运行中调用函数时,也是先加载到栈中,每一个函数形成一个帧,同样遵循先进后出的原则,执行完后这部分内存就被释放掉,这也是为什么函数中局部变量为什么会只在作用域中有效的原因。

附图:Java虚拟机运行时的数据区

相关详细知识参见:http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html

时间: 2024-10-13 02:12:38

java内存管理浅析的相关文章

linux内存管理浅析

[地址映射](图:左中)linux内核使用页式内存管理,应用程序给出的内存地址是虚拟地址,它需要经过若干级页表一级一级的变换,才变成真正的物理地址.想一下,地址映射还是一件很恐怖的事情.当访问一个由虚拟地址表示的内存空间时,需要先经过若干次的内存访问,得到每一级页表中用于转换的页表项(页表是存放在内存里面的),才能完成映射.也就是说,要实现一次内存访问,实际上内存被访问了N+1次(N=页表级数),并且还需要做N次加法运算.所以,地址映射必须要有硬件支持,mmu(内存管理单元)就是这个硬件.并且需

java内存管理

一.jvm内存结构 程序计数器(Program Counter Register).JVM虚拟机栈(JVM Stacks).本地方法栈(Native Method Stacks).堆(Heap).方法区(Method Area) (1)PCR 跟随线程生命周期,记录当前执行到的.class字节码行数,用于多线程操作 (2)JVM Stacks 跟随线程生命周期,在方法执行中存储数据 (3)Native Method Stacks 处理native方法,如object中的hashCodes()等

简单的例子 关于Java内存管理的讲解

我想做的是,逐行读取文件,然后用该行的电影名去获取电影信息.因为源文件较大,readlines()不能完全读取所有电影名,所以我们逐行读取. 就这段代码,我想要在位置二处使用base64,然后结果呢? 两处位置都打印了,位置一得到base64,ok,没问题.当我在位置二想使用base64时,问题来了?onload队列的问题,位置二总是无法正确的获取到想要的base64,这个时候就可以考虑异步问题了. 在还没有接触到angular的时候,还真的不知道它到底有什么作用,直到我开始学习它,并且运用到它

java内存管理机制

JAVA 内存管理总结 1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间.释放 :对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作.但同时,它也加重了JVM的工作.因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请.引用.被引用.赋值等,GC都需要进行监控. 2. 

【Java】Java内存管理

Java内存管理是面试中经常会问到的问题.Java的内存管理其实是指对象 的分配和释放问题.曾经看过这样一句话:"C++程序员觉得内存管理太重要了,所以一定要自己进行管理,而Java程序员觉得内存管理太重要了,一定不能自己管理".我觉得这句话说得太精辟了. C++程序员需要显式分配内存,释放内存,而这样常常会引起"内存泄露".而Java程序员不需要显式分配和释放内存,Java在创建对象的时候会自动分配内存,在对象不再使用的时候释放内存.Java的对象是通过new关键

java内存管理的分析

java 中的内存分为四个部分: stack(栈):存放基本类型的数据和对象的引用,即存放局部变量. Note: 如果存放的是基本类型数据(非静态变量),则直接将变量名和值存入stack中. 如果存放的是引用类型,则将变量名存入栈,然后指向它new出的对象(存放在堆中). heap(堆)存放 new 出来的东西. data segment(数据区):分为静态区和常量区(常量池) 静态区(static segment): 存放在对象中用 static 定义的静态成员(即静态变量,如果该静态变量是基

Java内存管理的9个小技巧

Java内存管理的9个小技巧很多人都说“Java完了,只等着衰亡吧!”,为什么呢?最简单的的例子就是Java做的系统时非常占内存!一听到这样的话,一定会有不少人站出来为Java辩护,并举出一堆的性能测试报告来证明这一点.其实从理论上来讲Java做的系统并不比其他语言开发出来的系统更占用内存,那么为什么却有这么多理由来证明它确实占内存呢?两个字,陋习. 1.别用new Boolean(). 在很多场景中Boolean类型是必须的,比如JDBC中boolean类型的set与get都是通过Boolea

内存管理 浅析 内存管理/内存优化技巧

内存管理 浅析 下列行为都会增加一个app的内存占用: 1.创建一个OC对象: 2.定义一个变量: 3.调用一个函数或者方法. 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户体验.如何让回收那些不再使用的对象呢?本文着重介绍OC中的内存管理. 所谓内存管理,就是对内存进行管理,涉及的操作有: 1.分配内存:比如创建一个对象,会增加内存占用: 2.清除内存:比如销毁一个对象,会减少内存占用. 内存管理的管理范围: 1.任何继承了NSObject的对象: 2.对其他非对象类

Java内存管理第二篇 - 内存的分配

Java内存管理无非就是对内存进行分配和释放.对于分配来说,基本类型和对象的引用存储到栈中,常量存储到常量池中,对象存储到堆上,这是一般的分配.而对于回收来说要复杂的多,如果回收不好,还可能造成分配出去的内存得不到回收而造成内存泄漏. 这一篇将简单介绍一下Java内存的分配,下一篇将介绍内存的回收及内存泄漏等知识. 1.JVM内存模型 1.程序计数器(Program Counter Register): 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是