怎么调逆站进程的液滴逆流分配法内存

操作系统第二章复习题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
操作系统第二章复习题
上传于||文档简介
&&计​算​机​操​作​系​统​第​四​版​汤​小​丹
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩6页未读,继续阅读
你可能喜欢java运行时内存分配详解 - 贺老师 - 推酷
java运行时内存分配详解 - 贺老师
java程序运行时内存分配详解&
& &每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一对应一个堆,每一个线程有一个自己私有的栈。进程所创建的所有类的实例(也就是对象)或数组(指的是数组的本身,不是引用)都放在堆中,并由该进程所有的线程共享。Java中分配堆内存是自动初始化的,即为一个对象分配内存的时候,会初始化这个对象中变量。虽然Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在栈中分配,也就是说在建立一个对象时在堆和栈中都分配内存,在堆中分配的内存实际存放这个被创建的对象的本身,而在栈中分配的内存只是存放指向这个堆对象的引用而已。局部变量&new&出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收。
具体的概念:
JVM的内存可分为3个区:
堆(heap)、栈(stack)和方法区(method,也叫静态区):
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息(class的目的是得到操作指令) ;
2.jvm只有一个堆区(heap),且被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身和数组本身;
1.每个线程包含一个栈区,栈中只保存基础数据类型本身和自定义对象的引用;
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问;
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令);
方法区(静态区):&
1.被所有的线程共享,方法区包含所有的class(class是指类的原始代码,要创建一个类的对象,首先要把该类的代码加载到方法区中,并且初始化)和static变量。&
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。&
二、实例演示
1   AppMain.java
3   public
//运行时, jvm 把appmain的代码全部都放入方法区
5   public
main(String[] args)
//main 方法本身放入方法区。
7   Sample test1 = new
Sample( & 测试1 & );
//test1是引用,所以放到栈区里, Sample是自定义对象应该放到堆里面
8   Sample test2 = new
Sample( & 测试2 & );
10   test1.printName();
11   test2.printName();
15   public
//运行时, jvm 把appmain的信息都放入方法区
17   /** 范例名称 */
18   private S
//new Sample实例后, name 引用放入栈区里, name 对应的 String 对象放入堆里
20   /** 构造方法 */
21   public
Sample(String name)
23   this .name =
26   /** 输出 */
27   public
printName()
//在没有对象的时候,print方法跟随sample类被放入方法区里。
29   System.out.println(name);
运行该程序时,首先
启动一个Java虚拟机进程,这个进程首先从classpath中找到AppMain.class文件,读取这个文件中的二进制数据,然后把Appmain类的类信息存放到运行时数据区的
中,这就是AppMain类的加载过程。&
& &接着,Java虚拟机定位到方法区中AppMain类的Main()方法的字节码,开始执行它的指令。这个main()方法的第一条语句就是:&
Sample test1=new Sample(&测试1&);
该语句的执行过程:
& & 1、&Java虚拟机到方法区找到Sample类的类型信息,没有找到,因为Sample类还没有加载到方法区(这里可以看出,java中的内部类是单独存在的,而且刚开始的时候不会跟随包含类一起被加载,等到要用的时候才被加载)。Java虚拟机立马加载Sample类,把Sample类的类型信息存放在方法区里。&
& & 2、 Java虚拟机首先在堆区中为一个新的Sample实例分配内存, 并在Sample实例的内存中存放一个方法区中存放Sample类的类型信息的内存地址。
& & 3、 JVM的进程中,每个线程都会拥有一个方法调用栈,用来跟踪线程运行中一系列的方法调用过程,栈中的每一个元素就被称为栈帧,每当线程调用一个方法的时候就会向方法栈压入一个新帧。这里的帧用来存储方法的参数、局部变量和运算过程中的临时数据。
& & 4、位于“=”前的Test1是一个在main()方法中定义的一个变量(一个Sample对象的引用),因此,它被会添加到了执行main()方法的主线程的JAVA方法调用栈中。而“=”将把这个test1变量指向堆区中的Sample实例。
& & 5、JVM在堆区里继续创建另一个Sample实例,并在main方法的方法调用栈中添加一个Test2变量,该变量指向堆区中刚才创建的Sample新实例。
& & 6、JVM依次执行它们的printName()方法。当JAVA虚拟机执行test1.printName()方法时,JAVA虚拟机根据局部变量test1持有的引用,定位到堆区中的Sample实例,再根据Sample实例持有的引用,定位到方法去中Sample类的类型信息,从而获得printName()方法的字节码,接着执行printName()方法包含的指令,开始执行。&
在Java语言里堆(heap)和栈(stack)里的区别 :
&&&&1.&栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。&
2.&栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享(详见下面的介绍)。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。&
Java中的2种数据类型:
(primitive&types),&共有8类,即int,&short,&long,&byte,&float,&double,&boolean,&char(注意,并没有string的基本类型)。这种类型的定义是通过诸如int&a&=&3;&long&b&=&255L;的形式来定义的,称为自动变量。
自动变量存的是字面值,不是类的实例,即不是类的引用,这里并没有类的存在
。如int&a&=&3;&这里的a是一个指向int类型的引用,指向3这个字面值。
的数据,由于大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的原因,就存
& & 栈有一个很重要的特性:存在栈中的数据可以共享。
假设我们同时定义: &int&a&=&3; int&b&=&3; &
编译器先处理int&a&=&3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,如果没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int&b&=&3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。&
这种字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了这个对象的内部状态,那么另一个对象引用变量也即刻反映出这个变化。相反,通过字面值的引用来修改其值,不会导致另一个指向此字面值的引用的值也跟着改变的情况。如上例,我们定义完a与&b的值后,再令a=4;那么,b不会等于4,还是等于3。在编译器内部,遇到a=4;时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。&
包装类数据,
如Integer,&String,&Double等将相应的基本数据类型包装起来的类。这些类数据全部
存在于堆中,
Java用new()语句来显示地告诉编译器,在运行时才根据需要动态创建,因此比较灵活,但缺点是要占用更多的时间。&
& & & java内存分配条理还是很清楚的,如果要彻底搞懂,可以去查阅JVM相关的书籍。在java中,内存分配最让人头疼的是String对象,由于其特殊性,所以很多程序员容易搞混淆,下一篇文章再详细讲解。
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
排版有问题
没有分页内容
视频无法显示
图片无法显示二次元同好交流新大陆
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
1、进程启动的时候,其(虚拟)内存空间的初始布局如图1所示。
&&&&& 其中,mmap内存映射文件是在堆和栈的中间(例如libc-2.2.93.so,其它数据文件等),为了简单起见,省略了内存映射文件。
&&&&& _edata指针(glibc里面定义)指向数据段的最高地址。 2、进程调用A=malloc(30K)以后,内存空间如图2:
&&&&&&malloc函数会调用brk系统调用,将_edata指针往高地址推30K,就完成虚拟内存分配。
&&&&& 你可能会问:只要把_edata+30K就完成内存分配了?
&&&&&&事实是这样的,_edata+30K只是完成虚拟地址的分配,A这块内存现在还是没有物理页与之对应的,等到进程第一次读写A这块内存的时候,发生缺页中断,这个时候,内核才分配A这块内存对应的物理页。也就是说,如果用malloc分配了A这块内容,然后从来不访问它,那么,A对应的物理页是不会被分配的。 3、进程调用B=malloc(40K)以后,内存空间如图3。
情况二、malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0),如下图:
4、进程调用C=malloc(200K)以后,内存空间如图4:
&&&&&&默认情况下,malloc函数分配内存,如果请求内存大于128K(可由M_MMAP_THRESHOLD选项调节),那就不是去推_edata指针了,而是利用mmap系统调用,从堆和栈的中间分配一块虚拟内存。
&&&&& 这样子做主要是因为::
&&&&& brk分配的内存需要等到高地址内存释放以后才能释放(例如,在B释放之前,A是不可能释放的,这就是内存碎片产生的原因,什么时候紧缩看下面),而mmap分配的内存可以单独释放。
&&&&&&当然,还有其它的好处,也有坏处,再具体下去,有兴趣的同学可以去看glibc里面malloc的代码了。 5、进程调用D=malloc(100K)以后,内存空间如图5;6、进程调用free(C)以后,C对应的虚拟内存和物理内存一起释放。
7、进程调用free(B)以后,如图7所示:
&&&&&&& B对应的虚拟内存和物理内存都没有释放,因为只有一个_edata指针,如果往回推,那么D这块内存怎么办呢?
当然,B这块内存,是可以重用的,如果这个时候再来一个40K的请求,那么malloc很可能就把B这块内存返回回去了。 8、进程调用free(D)以后,如图8所示:
&&&&&&& B和D连接起来,变成一块140K的空闲内存。
9、默认情况下:
&&&&&& 当最高地址空间的空闲内存超过128K(可由M_TRIM_THRESHOLD选项调节)时,执行内存紧缩操作(trim)。在上一个步骤free的时候,发现最高地址空闲内存超过128K,于是内存紧缩,变成图9所示。
阅读(8828)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。',
blogAbstract:'
如何查看进程发生缺页中断的次数?
&&&&&&&&&用ps -o majflt,minflt -C program命令查看。
&&&&&&&&& majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。
&&&&&&&&& 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。
发成缺页中断后,执行了那些操作?
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:3,
publishTime:2,
permalink:'blog/static/',
commentCount:4,
mainCommentCount:4,
recommendCount:4,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:true,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}问:我的虚拟内存设置的合理吗?我电脑物理内存:256mb所有驱动器页面大小的总数:34MB驱动器:F可用空间...答:你的系统设置的虚拟内存没有问题!以下供参考:如何合理设置虚拟内存,防止系统出现内存不足?1、自定义虚拟内存,最好给它一个固定值,这样就不容易产生磁盘...
问:s虚拟内存最小值太低该怎么办?我都把最小值和最大值调...我把它设在D盘在,磁盘空间都还有3G!大劲舞团的时候就会提醒s虚拟内存...答:Windows作系统用虚拟内存来动态管理运行时的。为了提供比实际物理内存还多的内存容量以供使用,Windows作系统占用了硬盘上的一部分空间作为虚拟内存...
问:内存虚拟值太小怎么办?同上答:多设置些虚拟内存就可以啦,但是建议加物理内存也就是内存条!设置虚拟内存的方法是:鼠标反键点我的电脑选择属性--性能--虚拟内存-更改就可以啦...
问:电脑总是显示虚拟内存太小怎么办?虚拟内存最大值和最小值设置...我的电脑里面没有任何网络游戏,只有,游戏和pps等基本程序。常里面...答:你用的是什么系统?XP的话可能是系统有问题,XP根本不需要那么多内存,另外,你这个虚拟内存设置有些过大了,可能是过大反倒出问题了,你虚拟内存只要.5倍到1.5...
问:意进程?电脑运行速度太慢,又不想重装系统我的电脑运行速度太慢,又不想重装系统。怀疑是不是有什么意进程开机后就装在...答:建议你清理专家:在清理专家的进程管理器选项中有程序的图标,还有分析这个进程是否,如果不就可将他关闭(还可以随时打开)。:...
问:我的电脑物理内存为4G,虚拟内存的最大值和最小值怎么设置,我...初始值为246-42,要怎么改啊!现在感觉开机后反应有点慢了!不要跟我说多少倍...答:你电脑多少位的?如果只有32位的,只能识别出来3.2G左右的内存另外,虚拟内存只是在你运行大程序的时候才会用到,一般情况,虚拟内存比物理内存会慢很多,但又...
问:虚拟内存是什么意思?最近我的电脑老显示虚拟内存不足?什么是虚拟内存?那是什么意思?要怎么做?越...答:什么是虚拟内存虚拟内存是用硬盘空间做内存来弥补计算机RAM空间的缺乏。当实际RAM满时(实际上,在RAM满之前),虚拟内存就在硬盘上创建了。当物理内存用完后,...
问:虚拟内存初始最大值我的内存是1G,C盘一共才.45,还有3.5的空间,但是最近老提示说虚拟内存底,...答:建议你把虚拟内存放到C:以外的盘符里,那样不影响系统运行速度。依次打开:我的电脑点右键,选择属性--性能,选择设置--选择最下面的一项虚拟内存-更改...
问:如何让电脑在玩大型游戏时能释放出物理内存的最大值?...答:把没用的进程都结束桌面也不例外
问:Windows23单进程最大支持内存怎样解决Windows2332位单进程2G内存的。另外如果在Windows2364位跑...答: 版32G标准版4G开启大内存 SQL Server25联机丛书(2年月)为 SQL Server启用 AWE内存 窗口化扩展 件(AWE)可以使32位作系统访问...
问:Windows虚拟内存最小值太低,怎么办?我的电脑内存是256M,上网时电脑常提示:“Windows虚拟内存最小值太低”,怎么办?再...答:1。感染了病!有些病发作时会占用大量内存空间,导致系统出现内存不足的问题。赶快去,升级病库,然后把防措施做好!2。虚拟内存设置不当虚拟内存...
问:虚拟内存怎么设置?设置在C盘么?还是空间大的那个盘?自定义...我电脑2G内存,玩星际2有时候说什么。页面啥子内存不足哦,反正应该是虚拟内存!...答:右键单击“我的电脑”→属性→→性能→设置→→虚拟内存→更改→选择虚拟内存(页面)存放的分区→自定义大小→确定最大值和最小值→设置成物理内存...
问:什么是进程?电脑运行慢,关掉一些进程有什么后果?请问:什么是进程?电脑运行慢,关掉一些进程有什么后果?什么是进程?电脑运行慢,关掉一些进程有什么后果?自动打开的进程被关掉...答:系统慢有以下几种原因:1、系统的安装盘质量不好。2、有 病。3、硬盘有坏道。4、配置稍低。5、 拔一下内存、显卡,擦亮它们的金手指。6、清理系统垃圾,...
问:JVM内存最大能调多大答:分析了当前比较流行的几个不同不同版本JVM的最大内存,得出来的结果如下:JVM版本最大内存(兆)client最大内存(兆)serverSUN1.5.x142152SUN1.5.5...
08-2709-0109-1009-09
09-2408-0409-1808-04
◇本站云标签

我要回帖

更多关于 液滴逆流分配法 的文章

 

随机推荐