A. java的内存分配是什么样的
关于java内存分配是这样的:
程序代码存储在"code segment"中,静态变量和字符串常量存储在“data segment"区域中,局部变量存储在"stack"(栈内存)中,nwe出来的东西(即对象)存储在"heap"(堆内存)中
B. java的内存分配问题
楼上不对。==是比较的内存地址,这点是毋庸置疑的。
首先,要明白,两个x的定义过程。
x的定义过程是:声明一个标量 int类型 x,然后在栈内存中寻找,看有没有5这个值,如果有,x指向5,如果没有,把5放进来,x指向这个5.
t.x也是一样的。
那么现在就很明了了。不管test2是不是new出来的。Test2中的x都会先在栈内存中寻找5这个值,经过寻找发现,确实有5,这个5已经在Test类中定义,这时候就直接指向了。所以“==”之后会得到true。因为他们指向的就是同一个内存地址。
如果还有不明白,请追问。
C. 简述java内存分配与回收策率有什么用
引言:大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。老年代GC(Major GC / Full GC):指发生在老年代的GC,出现了Major GC,经常会伴有至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)。Major GC的速度一般会比Minor GC慢10倍以上。
三、总结
可达性分析:以名为“GC根”的对象为起点,从这些节点向下搜索。当一个对象不能连接到“垃圾回收根”时,意味着它是可回收的。
D. 怎样用java实现内存动态分配
1、java是如何管理内存的
Java的内存管理就是对象的分配和释放问题。(两部分)
分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。
释放 :对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作。但同时,它也加重了JVM的工作。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。
2、 JVM的内存区域组成
java把内存分两种:一种是栈内存,另一种是堆内存1。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;2。堆内存用来存放由new创建的对象和数组以及对象的实例变量 在函数(代码块)中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由java虚拟机的自动垃圾回收器来管理
堆和栈的优缺点
堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。
缺点就是要在运行时动态分配内存,存取速度较慢; 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。
另外,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
E. Java把如何把内存划分为4个部分
Java把内存划分为以下4个部分:
1、栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源。
2、堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收。
3、静态区(datasegment)—存放全局变量,静态变量和字符串常量,不释放。
4、代码区(codesegment)—存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域。
F. java中内存的分配问题
根据楼主的描述,感觉楼主的思想还停留在面向过程的层面上,对于java这样的纯面向对象的语言的语法和调用机制感到迷茫。这是很正常的,面向对象和面向过程本来就是两个东西,从面向过程转到面向对象,确实有点困难。
在你的问题中,你说“为什么在main方法中,必须为属性赋值或创建对象才能打印输出,而在前一个类的方法中可以直接打印输出呢?”,这个问题证明了你对java中“类”和对象的概念没有理解清楚,首先,name属性石类Stu的成员变量,权限为public,因此任何类Stu的实例都可以通过.来引用该成员,但是其他类无法绕过Stu及其对象而引用该属性(其实应该这么说,面向对象的语言中,没有面向过程的语言中所谓的‘全局变量’,定义一个变量,该变量必须属于某个类的,在java中也肯定是属于某个类的,而不能是如你所想的那样,某个类中定义一个变量,任何类都可以绕过其所在类直接使用变量名来引用该变量,这是不可能实现的)。
举个例子来讲,你(类Stu)可以使用自己的手(变量name),来做任何事(System.out.println(name)),因为对于你来说手是你自己的,因此可以自由使用,这是宪法(JVM)赋予你(任何类)的自由权利但是对于其他人(类test)来说,如果要使用你的手(System.out.println(name+"\t"+a+"\t"+stu.name)),必须通过你(Stu.name),才能使用,难道你见过别人请你帮忙的时候,只带走了你的手,而没有把你带走吗?
关于虚拟机在执行Why y = new Why();代码时,是如何分配内存的,一楼已经回答的很清楚了,我就不再赘述了。
最后,建议楼主多看看java入门,好好理解面向对象的思想,这一点无论是刚入门,还是日后你成为技术大牛,做架构设计,这一点都是至关重要的,至少在java世界中是这样的。