
这个问题太不好回答了。
但是又很好回答。
比如:
String str1=new String("我爱我家");
这个时候已经在内存中分配一个内存块用来存储这个字符串数据了。
所以呢你取的时候也是很简单的。
直接读取str1就ok了。
你所说的取内存数据是想问什么呢?
不完全对,不只是堆内存,栈中也同样保存着临时数据
其中每个线程的栈中存储的内容都是独立的,而堆内存是共享的,所以在多线程编程时由于堆内存共享,会导致一些多线程安全问题,如:多线程的i++问题
栈中包含栈帧,每一个方法都是一个栈帧,当一个线程中有多个方法的时候,会进行压栈和d栈的 *** 作,如:一个线程先访问A方法,然后访问B方法,这时候就会先把栈帧A压栈,然后栈帧B再压栈,而d栈的时候是先入后出的,也就是B先d出,然后是A。
每一个栈帧又分别包含:局部变量表, *** 作数栈,动态链接和方法返回地址
局部变量表:存储方法中定义的各个局部变量
*** 作数栈:存储方法中的一些临时的计算结果
动态链接:把符号引用转为直接引用,因为在程序启动的过程中,其实我们并没有真的引用到Java的工具方法,而是使用一个符号做标记,当真正使用的时候再将标记直接指向具体方法
方法返回地址:记录方法执行结束后的指针,也就是我当前方法执行结束后需要干什么
两者是完全不同的两个概念
内存池:
在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是,使得内存分配效率得到提升。
一个程序会随着长时间的运行和内存的申请释放而变得越来越慢,内存也会随着时间逐渐碎片化。特别是高频率的进行小内存申请释放,此问题变得尤其严重。
内存池最大的优势在于:
1、极少的(甚至没有)堆碎片整理
2、较之普通内存分配(如malloc,new),有着更快的速度
额外的,你还将获得如下好处:
1、检测任意的指针是否指向内存池内
2、生成"heap-dump"
3、各种 内存泄漏 检测:当你没有释放之前申请的内存,内存池将抛出断言
堆内存:
是一块内存区域,区别于栈区、全局数据区和代码区的另一个内存区域。堆内存允许程序在运行时动态地申请某个大小的内存空间。堆内存是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便
以上就是关于JAVA程序如何从内存中获取数据全部的内容,包括:JAVA程序如何从内存中获取数据、在计算机中运行Java程序时,堆内存中存放着临时数据。+(+)、java 内存池和堆内存什么关系啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)