当前位置:首页 » 编程语言 » java内存共享

java内存共享

发布时间: 2022-04-29 06:45:11

A. java共享内存的问题,如何存,取共享数据

1 共享内存对应应用开发的意义
对熟知UNIX系统应用开发的程序员来说,IPC(InterProcess
Communication)机制是非常熟悉的,IPC基本包括共享内存、信号灯操作、消息队列、信号处理等部分,是开发应用中非常重要的必不可少的工具。其中共享内存IPC机制的关键,对于数据共享、系统快速查询、动态配置、减少资源耗费等均有独到的优点。

对应UNIX系统来说,共享内存分为一般共享内存和映像文件共享内存两种,而对应 Windows,实际上只有映像文件共享内存一种。所以java应用中也是只能创建映像文件共享内存。

在java语言中,基本上没有提及共享内存这个概念,但是,在某一些应用中,共享内存确实非常有用,例如采用java语言的分布式应用系统中,存在着大量的分布式共享对象,很多时候需要查询这些对象的状态,以查看系统是否运行正常或者了解这些对象的目前的一些统计数据和状态。如果采用网络通信的方式,显然会增加应用的额外负担,也增加了一些不必要的应用编程。而如果采用共享内存的方式,则可以直接通过共享内存查看对象的状态数据和统计数据,从而减少了一些不必要的麻烦。

B. java堆内存被所有线程所共享,不明白2个线程如何共享2个对象中的同名变量。

首先:堆内存共享是相对于栈内存的。栈是每一个线程都独有的,线程之间互不一向,每一个线程都有自己的栈内存。但是堆内存不一样,在一个JVM实例里面,不管你有多少线程,创建了多少对象,都是放在一块堆内存的。也就是说一个JVM实例栈内存区域是有多个,每一个线程持有一个,而堆内存只有一个,是线程共享的。
其次:针对你这个代码,这个情况下每一个线程确实是对应着不同的对象。也就是在同一个堆(也只有一个堆)里面创建了两个Demo对象。你老师的意思应该是
Demo demo = new demo();
Thread S1=new Thread(demo);
Thread S2=new Thread(demo);
这样两个线程都是操作堆内存共享的对象。

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中不同的工程怎么样才能共享同一块内存

栈内存你可以想象成电脑的内存,堆内存你可以看成硬盘,
Java的内存分配上,主要分4个块!
一块是用来装代码的,就是编译的东西。
一块是用来装静态变量的,例如用static关键字的变量,例如字符串常量。
一块是stack,也就是栈,是用来装变量和引用类型的!但区别在于,装了变量以后,变量上是有值的,而引用类型本身在stack上是没有值的。
一块是heap,也就是堆!堆可以一句话概括,装new出来的东西!
所以综上所述,基本数据类型都在stack中,而引用类型,变量是放在stack中,真正有内容的东西放在heap中,也就是当new了一个新的引用类型,他就会放在堆中,同时栈中的引用类型变量会指向堆中你new出来的东西!
这样说希望能帮你了解到java的内存分配问题。

F. java里内存是不是有共享数据说法,那真实的物理内存是不是没有共享

1.java里共享数据是由jvm控制的,为的是节省内存,提高效率;
2.真实的物理内存里,一般情况下,数据都是独立存储的;
3.系统层面一般是不会采用这种共享数据的方法的。
4.Java语言中数据类型包含基本类型和引用类型,你所说的ab是int型,int是java的基础数据类型,基础数据类型没有对象的说法;
5.对于引用类型如:String,举个例子String strA = new String("CQUT");这里,通过new操作符创建了一个对象,"CQUT"叫对象,strA是引用,类似于c的指针。

G. Java对象的内存分配

栈内存放引用型变量,指向堆里面new出来的对象

堆内存放new出来的对象

方法只有一份用来共享,只有在执行的时候才在内存中分配空间,如图:

H. Java中非静态方法是否共用同一块内存

答案是不会,我们用field表示字段,用method表示方法,那么加上static区分后就 有四种:
class field:有用static修饰的field
class method:有用static修饰的method
instance field:没有用static修饰的field
instance method:没有用static修饰的method
那么他们在内存中的表示为:
class field:共用一块记忆体
class method:共用一块记忆体
instance field:随着每个instance各有一块记忆体
instance method:共用一块记忆体
如果instance method也随着instance增加而增加的话,那内存消耗也太大了,为了做到共用一小段内存,Java是根据this关键字做到的,比如:instance1.instanceMethod(); instance2.instanceMethod(); 在传递给对象参数的时候,Java编译器自动先加上了一个this参数,它表示传递的是这个对象引用,虽然他们两个对象共用一个方法,但是他们的方法中所产生的数据是私有的,这是因为参数被传进来变成call stack内的entry,而各个对象都有不同call
stack,所以不会混淆。其实调用每个非static方法时,Java编译器都会自动的先加上当前调用此方法对象的参数,有时候在一个方法调用另一个方法,这时可以不用在前面加上this的,因为要传递的对象参数就是当前执行这个方法的对象。
为什么静态方法中不能调用非静态方法?这是因为静态方法直接跟class相关,调用此方法的时候是类直接调用的,而不是对象,所以Java编译器就没有对象参数可以传递,这样,如果你在静态方法内部调用非静态方法,那么Java编译器怎么判断这个非静态方法是哪个对象调用的?对吧,所以Java编译器就会报错,但是也不是绝对的,Java编译器是隐式的传递对象参数,那么我们总可以显示的传递对象参数吧,如果我们把某个对象的引用传递到static方法里,然后通过这个引用就可以调用非静态方法和访问非静态数据成员了。
也是一样的,方法都属于类数据,类数据都放在方法区中,《深入java虚拟机》有一个虚拟机的体系结构,在那里你可以看到线程都放在java栈里,栈帧代表一个方法的返回状态,执行完一个方法就会弹出这个栈帧,方法区和堆中的数据时所有线程都共享的,所以这里没有线程的区分。

I. java可以和c++共享内存文件吗

当然是可以共享的。
你可以在自己的电脑上同时安装C++和java,然后让他们分别运行自己的项目就知道了。
他们是可以一起运行的。

J. Java 变量是否共用内存的问题

首先,回答你的第一问。一个类,如果有成员域,没有针对于每个成员写set()方法的时候,那么,如果该成员为简单数据类型,改变成员的方法,就是重新赋值。如果成员都为引用,那么,改变成员的原理就是使这个引用指向另一块堆内存,这也就相当于String类型的引用,要改变这个引用,就是使这个引用指向另一个对象,原理是一样。
p1,p2指向同一块类存的时候,修改p1,是不会影响p2的,因为p1,知识个引用,如果你修改那块内存中的数据的话,那么对p1,p2都会有影响。打个比方吧,如果两个小朋友都要去学校,这两个小朋友就是p1,p2,学校就相当于是那一块内存。现在你要修改p1,也就是类似于,p1这个小朋友不去学校了,要去超市了,而p1要去哪里,不会影响p2去学校。而,如果你把学校内容给换了,在学校里面开商店,把学校改装成了超市,那么,两个小朋友p1,p2还以为学校没有变,结果,都往学校去了,到了学校一看,才知道他们去了超市。
你这个例子,有点特殊,设计的内容不是一点点。我尽量细得给你讲讲吧。
Integer p1 = a;这种赋值方法,从JDK1.5以后出现的新特性,在这之前给包装类赋值的方法都是 Integer p1 = new Integer(a);而jdk1.5后出现了自动装箱的功能,将一个基本数据类型包装成一个包装类,并且包装类能够进行和基本数据类型进行直接计算,如 Integer x = 4; x = x+3; 这里第二句运算的原理,牵涉到一个包装类自动拆箱的原理,在JVM中,实际上是调用了 x.intvalue()这个方法。注意这里x不能为空,因为x为null是合法的,但是一旦为null就不能直接和数值进行计算。
现在解释一下,为什么a在[-128,127]之间,p1==p2为true,而超出这个范围就是false:[-128,127]是byte的范围,而这个范围的数值是一直存在内存中的,所以,在建立新对象的时候,发现内存中有数据,则直接让该包装类引用指向这块类存,所以,在建立p1,p2的时候,发现类存中有a这个值,所以,p1,p2都指向这同一块内存。而当数值超出这个范围的时候,就重新开辟空间,不管之前是否有对象有这个值,都会开辟新的空间,所以,超出这个范围,p1==p2就为false了,因为他们指向的内存地址不同。
花了半小时组织语言给你解答,希望采纳哈~~ 如果有不懂得,再追问!

热点内容
服务器上的邮件如何销毁 发布:2025-05-15 14:02:49 浏览:137
饥荒安卓版如何解除手柄模式 发布:2025-05-15 14:02:05 浏览:112
算法强化班 发布:2025-05-15 14:02:04 浏览:345
c语言编译后图片 发布:2025-05-15 13:51:57 浏览:792
没有被调用的函数会参与编译吗 发布:2025-05-15 13:42:51 浏览:260
在计算机中ftp的中文 发布:2025-05-15 13:41:07 浏览:1000
国网校招要网签密码和账号干什么 发布:2025-05-15 13:40:25 浏览:179
java分 发布:2025-05-15 13:34:36 浏览:846
如何下载卡巴斯基安卓版 发布:2025-05-15 13:34:36 浏览:480
排序函数c语言 发布:2025-05-15 13:06:28 浏览:6