⑴ 怎样用java实现内存动态分配
1、java是如何管理内存的
Java的内存管理就是对象的分配和释放问题。(两部分)
分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。
释放 :对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作。但同时,它也加重了JVM的工作。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。
2、 JVM的内存区域组成
java把内存分两种:一种是栈内存,另一种是堆内存1。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;2。堆内存用来存放由new创建的对象和数组以及对象的实例变量 在函数(代码块)中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由java虚拟机的自动垃圾回收器来管理
堆和栈的优缺点
堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。
缺点就是要在运行时动态分配内存,存取速度较慢; 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。
另外,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
⑵ 关于java的内存问题
其实你就是想对java虚拟机机制有所了解,可以参考http://wenku..com/view/6a67ca2bcfc789eb172dc86c.html或者去网络java虚拟机详解,一般在第二章节。
你提的问题只不过是jvm介绍中的比较局部的几个地方,涉及到常量池,堆内存,栈内存等概念。参考这个手册都能了解到。尤其要区别什么是变量声明,什么是变量创建,什么是变量引用。然后就是对特殊情况的了解。比如int i=127.这个127其实是在常量池里的,当你用integer a = new Integer("127"). integer b = new integer("127").的时候,他们是指向同一个地址的,但是当你创建new Integer("128")的时候创建出的却是两个对象,但是都是在常量池里面的,这些概念在jvm虚拟机详解里面都有。
第二个问题和第三个问题其实是很明确的对比。第二个问题,首先在堆内存中创建出一个数组对象,有一个数组对象的地址,里面放了两个int常量的,也就是0,但是实际上都是指向同一个常量池地址,也就是0.
第三个问题则不同,person数组对象的地址,但是没有为他制定长度,应该是无法通过编译的。数组的创建必须标注最左边那个索引的下标才对。即使你的问题是Person[] p = new Person[2];这个意思。其实也是创建了一个数组对象,指向一个数组地址,然后数组对象里面存放的是两个null的值,还没有分配内存空间和地址。
⑶ java 中能向内存直接写入数据的流是
可以考虑使用bytearrayinputstream
&
bytearrayoutputstream
字节数组位于内存
另外,“输入流是从硬盘到内存的读操作”
&
“输出流是从内存到硬盘的写操作”
这句严格说不正确。输入流、输出流的源和目标均是抽象概念,不一定是硬盘或者文件的
⑷ java可不可以直接操作内存中的数
当然可以!~!!在为存入数据库或者 文件中的时候 JAVA 的读写都是在操作内存
⑸ Java内存模型和Java内存区域的区别和联系
内存模型就是各个区域的职责划分,说起来是一个事情。
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区.这些区域有各自的用途,以及创建和销毁时间,有的区域随着虚拟机进程的启动而存在,有的依赖用户线程的启动和结束而建立和销毁,概括来说Java虚拟机包括以下几个运行时数据区域,程序计数器,Java虚拟机栈,本地方法栈,Java堆,方法区,运行时常量池,(直接内存)
⑹ Java直接内存是在用户空间还是内核空间
是对外内存。
在直接内存中,通过allocateDirect(int byte_length)申请直接内存。这段内存可以理解为一段普通的基于Byte的数组,因此插入和读取都跟普通的数组差不多。
只不过提供了基于不同数据类型的插入方法,比如:
put(byte) 插入一个byte
put(byte[]) 插入一个byte数组
putChar(char) 插入字符
putInt(int) 插入Int
putLong(long) 插入long
⑺ java中内存的概念
Java中的内存其实是java虚拟机帮助程序员管理的。。
笼统地去讲,java的内存分配分为两个部分,一个是数据堆,一个是栈
程序在运行的时候 一般分配数据堆,把局部的临时的变量都放进去,生命周期和进程有关系。但是如果程序员声明了static的变量,就直接在栈中运行的,进程销毁了,不一定会销毁static变量。
另外为了保证java内存不会溢出,java中有垃圾回收机制
System.gc()即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有规定gc如何工作。垃圾收集的目的在于清除不再使用的对象。gc通过确定对象是否被活动对象引用来确定是否收集该对象。
⑻ java 怎么把数据存到内存中
这里你采纳与否没关系,给你说说编程与内存的关系。
你定义的任何变量,常量,类,方法等等,其实都在内存中,没有所谓的把数据存内存中,这概念,你可以想一下电脑重启或关机后,内存中的所有数据,都会丢失,除非你保存到磁盘中去。
在内存中的数据有两块,第一、缓冲,一般写数据到磁盘的时候开辟出来的内存空间;第二、缓存,一般是从磁盘读数据到内存中开辟出来的内存空间。会这么使用,原因很简单,磁盘读写数据速度与内存不一致(磁盘的存取效率远远小于内存的存取效率),为了提高数据的存取效率,才会这么干的。
一般而言,java中的所谓数据,大部分都是类,从自动引用计数的概念来分析,你想把对象长久的放在内存中,不会被垃圾回收机制释放,注意制药有一个对象在使用/引用你的数据,这条数据就会存在内存中。所以,想servlet中的全局配置参数,随时可以取到还是唯一一份,你可以参考一下。
另外内存使用分堆与栈,堆在面向对象编程中存储对象的,栈是方法或函数执行的时候临时开辟的存储空间,方法或函数执行完毕就会释放。
希望我的回复能帮助到你,采纳与否没关系。有更好的答案,我就隐藏我的回复。
⑼ Java怎么直接在内存中读写对象
JAVA对象是在堆中存储的,它在内存中的地址被存储在一个或多个变量当中,类似于C中的指针,通过这些变量来操作对象,对象理论上是不能独立存在的,可以有多个变量存有它的地址,但不能没有变量存它的地址,一旦没有变量存有它的地址,就没法对它进行操作,对于程序运行来说,它就成了内存垃圾,正常情况下会被JAVA垃圾收集器给清除(少数异常情况可能回收不掉)
⑽ java内存模型里面为什么要分主存和本地内存
你说的应该是主存和工作内存吧,主存是公共空间,基本可以类比为虚拟机模型中的堆,对象创建好了都是在主存里,所有线程都可以访问,工作内存是线程的私有内存,只有本线程可以访问,如果线程要操作主存中的某个对象,必须从主存中拷贝到工作内存,在对工作内存中的副本进行操作,操作后再写入主存,而不能对主存的对象直接操作