java中是什么时候分配java内存分配

浅谈Java内存分配和回收策略浅谈Java内存分配和回收策略互联网黑帮课堂百家号java技术体系中所提到的内存自动化管理归根结底就是内存的分配与回收两个问题,之前已经和大家谈过java回收的相关知识,今天来和大家聊聊java对象的在内存中的分配。通俗的讲,对象的内存分配就是在堆上的分配,对象主要分配在新生代的Eden上(关于对象在内存上的分代在垃圾回收中会补上,想了解的也可以参考《深入理解java虚拟机》),如果启动了本地线程分配缓冲,讲按线程优先在TLAB上分配。少数情况下也是直接在老年代中分配。1、对象优先在Eden上分配一般情况下对象都是优先分配在Eden上,当Eden没有足够的空间进行分配时,jvm会发起一次Minor GC。如果还是没有足够的空间分配,后面还有另外的措施,下面会提到。设置虚拟机的偶记日志参数-XX:+PrintGCDetails,在垃圾回收的时候会打印内存的回收日志,并且在进程退出的时候会输出当前内存各区域的分配情况。下面来看下具体的例子,首先需要设置jvm的参数-Xms20m -Xmx20m -Xmn10m,这三个参数说明java堆大小为20M,且不可扩展,其中10M分配给新生代,剩下的10M分配给老年代。-XX:SurvivorRatio=8是jvm默认的新生代中Eden和Survivor比例,默认为8:1。原因是新生代中的对象98%都会在下一次GC的时候回收掉,所以很适合采用复制算法进行垃圾回收,所以新生代10M的内存中,8M是Eden,1M是Survivor,另外的1M是未使用配合复制算法的内存块,也是Survivor。输出如下可以看到eden占用了81%,说明allocation1 , allocation2 , allocation3 都是分配在新生代Eden上。2、大对象直接分配在老年代上大对象是指需要大量连续内存空间去存放的对象,类似于那种很长的字符串和数组。大对象对于虚拟机的内存分布来讲并不是好事,当遇到很多存活仅一轮的大对象jvm更加难处理,写代码的时候应该避免这样的问题。虚拟机中提供了-XX:PretenureSizeThreshold参数,另大于这个值的对象直接分配到老年代,这样做的目的是为了避免在Eden区和Survivor区之间发生大量的内存copy,在之前讲过的垃圾回收算法复制算法有提到过,就不多说了。输出如下可以看到allocation4已经超过了设置的-XX:PretenureSizeThreshold=3145728,随意allocation4直接被分配到了老年代,老年代占用率为60%。注意这里设置-XX:PretenureSizeThreshold=3145728不能写成-XX:PretenureSizeThreshold=3m,否则jvm将无法识别。3、长期存活的对象将进入老年代虚拟机既然采用了分带收集的思想来管理内存,那内存回收就必须识别哪些对象应该放在新生代,哪些对象应该放在老年代。为了打到目的,jvm给每个对象定义了一个年龄计数器(Age)。如果对象在Eden出生并且能过第一次Minor GC后仍然存活,并且可以在Survivor存放的话,将被移动到Survivor中,并将对象的年龄设为1。对象每躲过一次Minor GC,年龄就会加1,当他的年龄超过一年的阈值的时候,该对象就会晋升到老年代。这个阈值jvm默认是15,可以通过-XX:MaxTenuringThreshold来设置。输出如下可以看到a2已经存活了一次,年龄为1,满足所设置的-XX:MaxTenuringThreshold=1,所以a2进入了老年代,而a3则进入了新生代。4、动态对象年龄判定为了能更好的适应不同程序的内存状态,虚拟机并不总是要求对象的年龄必须达到-XX:MaxTenuringThreshold所设置的值才能晋升到老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年区,无须达到-XX:MaxTenuringThreshold中的设置值。5、空间分配担保在发生Minor GC的时候,虚拟机会检测每次晋升到老年代的平均大小是否大于老年代的剩余空间,如果大于,则直接进行一次FUll GC。如果小于,则查看HandlerPromotionFailyre设置是否允许担保失败,如果允许那就只进行Minor GC,如果不允许则也要改进一次FUll GC。也就是说新生代Eden存不下改对象的时候就会将该对象存放在老年代。1、-Xms: 初始堆大小, 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制。2、Xmx: 最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。3、-Xmn: 年轻代大小(1.4or lator), 此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。4、-XX:NewSize: 设置年轻代大小(for 1.3/1.4)。5、-XX:MaxNewSize: 年轻代最大值(for 1.3/1.4)。6、-XX:PermSize: 设置持久代(perm gen)初始值。7、-XX:MaxPermSize: 设置持久代最大值。8、-Xss: 每个线程的堆栈大小,JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在左右。9、-XX:NewRatio: 年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代),-XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5。Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。10、-XX:SurvivorRatio: Eden区与Survivor区的大小比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。11、-XX:LargePageSizeInBytes: 内存页的大小不可设置过大, 会影响Perm的大小。12、-XX:+DisableExplicitGC: 关闭System.gc()13、-XX:MaxTenuringThreshold: 垃圾最大年龄,如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代. 对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概率该参数只有在串行GC时才有效。14、-XX:PretenureSizeThreshold: 对象超过多大是直接在旧生代分配,单位字节 新生代采用Parallel Scavenge GC时无效另一种直接在旧生代分配的情况是大的数组对象,且数组中无外部引用对象。15、-XX:TLABWasteTargetPercent: TLAB占eden区的百分比。Minor GC和FUll GC的区别:新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为java对象大对数都是逃不过第一轮的GC,所以Minor GC使用很频繁,一般回收速度也比较快。老年代GC(FULL GC/Major GC) :指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对,在ParallelScavenge收集器的收集策略中就有直接进行Major GC的选择过程 )。Major GC的速度一般会比Minor GC慢10倍以上。学习Java的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,我们一起学Java!本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。互联网黑帮课堂百家号最近更新:简介:互联网的一次别开生面小课堂作者最新文章相关文章java声明一个变量后,NEW 实例两次,这个变量会在内存中分配几个内存空间?
[问题点数:40分,结帖人QWUIOP123]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:0
本版专家分:645
本版专家分:37
本版专家分:3285
本版专家分:666
本版专家分:6
本版专家分:13
本版专家分:1306
本版专家分:2481
2015年6月 Java大版内专家分月排行榜第二
本版专家分:50
本版专家分:50
本版专家分:47
本版专家分:105
本版专家分:0
匿名用户不能发表回复!|
其他相关推荐
// practice4-8.cpp : 定义控制台应用程序的入口点。
#include &stdafx.h&
const int len = 70;
struct pizza
char brand[len];
int _tmain(int argc, _TCHAR* argv[])
python下的变量
不需要预先声明变量的类型,变量的类型和值在赋值的那一刻被初始化(声明和定义的过程一起完成)
在python中, 每一个变量在内存中创建,我们可以通过变量来查看内存中的值
哈哈,这里是不是很熟悉,跟c中的指针一样啊(访问内存中的值)
首先大家需要了解一点:在python中:
通过一个小例子来理解变量在计算机内存中的表示~当我们写:a = 'ABC'时,Python解释器干了两件事情:1、在内存中创建了一个'ABC'的字符串;2、在内存中创建了一个名为a的变量,并把它指向'ABC'。
我们也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据,例如下面的代码:a = 'ABC'
a = 'XYZ'
print(b)最后一行打印出变
1、变量的概念:内存中的一个存储区域该区域有自己的名称(变量名)和类型(数据类型)Java中每个变量必须先声明,后使用该区域的数据可以在同一类型范围内不断变化使用变量注意:变量的作用域:一对{ }之间有效 初始化值定义变量的格式:数据类型
初始化值变量是通过使用变量名来访问这块区域的2、变量的分类
对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空...
1、php中的变量都存放在zval的变量容器中。zval的结构如下表所示:
其中类型:为变量类型,值:为变量的值,is_ref是bool值,变量是否有别名,如果有则为true,refcount:引用此变量的变量个数。当refcount为1时,is_ref为false。
2、将一个变量 赋值给另一个变量时(例如:$a=
int i 这个有没有分配内存呢?
int *p 呢?
具体是在栈空间还是在堆空间里分配内存呢?
这两个都在栈区分配了内存空间
但是p指向的地址为野地址,不可直接拿来使用
即p指向的空间没有分配
Q2:在Java中定义数组时必须分配内存,这句话是错的还是对的呢
1.什么是new和delete在C语言中我们可以利用标准库函数中的 malloc 和 free 来动态分配内存空间,而在C++中提供了运算符 new 和 delete 来取代 malloc 和 free 进行动态分配内存空间。2.new的用法表达式- new 数据类型 ;
//申请内存空间。
- new 数据类型
//申请内存空间时
我们都知道,要使用类,就一定要为其创建对象。那么,在创建对象过程中,内存是如何分配的呢?
类的本质是一种引用数据类型,这与数组是一样的。比如本文提供的简单例子程序中的Person类,它有两个属性,name和age,而属性是需要内存来存储的。我们以person对象来讲解。执行Person person= 时,Java系统会在栈内存开辟一个空间给对象person,程序继续向下执行到perso
昨天晚上发现一个很多菜鸟都会遇到的一个问题:结构体内部的成员是何时分配内存空间的?
程序代码:#include &stdio.h&
struct stu
};void f(void)
}int main()
对“C++中何时对变量分配存储空间”的思考一、问题的引入一直被“C++中变量的存储空间何时分配”困扰。在Visual studio2010中跑了一段代码,通过观察“监视窗口”中变量地址的变化和“内存窗口”,总结出一些自己的理解。二、简单代码运行时的观察和总结代码很简单,如下所示:#include &iostream&
int main()在Java中定义数组时必须分配内存,这句话是错的还是对的呢_百度知道
在Java中定义数组时必须分配内存,这句话是错的还是对的呢
我有更好的答案
Java中的数组你可以看到一个特殊的对象,声明时是放在栈中的,分配的空间存储在堆中如:1. int[] arr =
此时只是在栈中声明了一个 arr 数组,但并未对其分配空间,所以它没有指向2. int[] arr = new int[6];
此时在栈中声明了一个arr数组,并且在堆中开辟了一块空间,此时 arr 已经分配内存了看具体的情况吧,定义数组应该是声明吧,在需要的时候再开辟空间也可以
分两种情况:1,定义数组时没有限定长度,则在用到它的时候,系统开始分配内存。2,定义数组时限定了长度,则在定义时就分配了内存。
您好,提问者:
这句话如果是判断题的话显然是不对的。
因为你如果只是定义了数组,而没用,代码:int[]这样是没有分配内存的。
显然当你 int[] arr = new int[3]; 就已经分配了内存了。
错,不一定,你不定义的话,他根据内容自动增长,定义后,长度不可改变。
其他1条回答
为您推荐:
其他类似问题
您可能关注的内容
内存的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。百度题库旨在为考生提供高效的智能备考服务,全面覆盖中小学财会类、建筑工程、职业资格、医卫类、计算机类等领域。拥有优质丰富的学习资料和备考全阶段的高效服务,助您不断前行!
京ICP证号&&
京网文[3号&&
Copyright (C) 2018 Baidu以下试题来自:
填空题在Java语言中,用来分配内存的运算符是______。 new
为您推荐的考试题库
你可能感兴趣的试题
1.填空题 B2.填空题 2803.填空题 equals()4.填空题 F5.填空题 false
热门相关试卷
最新相关试卷

我要回帖

更多关于 java new 内存分配 的文章

 

随机推荐