这个要用调试器来查看吧,调试器能够查看当前调试程序的内存空间,在调试器中定位到一个内存地址,再结合实际代码就可以查看内存布局,当然,类对象的内存空间也一目了然,查看函数的调用栈都是可以的。
第一步(编译): 创建完源文件之后,程序会先被编译为class文件。Java编译一个类时,如果这个类所依赖的类还没有被编译,编译器就会先编译这个被依赖的类,然后引用,否则直接引用,这个有点象make。
如果java编译器在指定目录下找不到该类所其依赖的类的class文件或者java源文件的话,编译器话报“cant find symbol”的错误。
第二步(运行):java类运行的过程大概可分为两个过程:1、类的加载 2、类的执行。需要说明的是:JVM主要在程序第一次主动使用类的时候,才会去加载该类。也就是说,JVM并不是在一开始就把一个程序就所有的类都加载到内存中,而是到不得不用的时候才把它加载进来,而且只加载一次。
特别说明:java类中所有public和protected的实例方法都采用动态绑定机制,所有私有方法、静态方法、构造器及初始化方法<clinit>都是采用静态绑定机制。而使用动态绑定机制的时候会用到方法表,静态绑定时并不会用到。
扩展资料:
Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程。
Java代码编译:是由Java源码编译器来完成;
Java字节码的执行:是由JVM执行引擎来完成
Java程序从源文件创建到程序运行要经过两大步骤:
1、源文件由编译器编译成字节码(ByteCode)
2、字节码由java虚拟机解释运行。因为java程序既要编译同时也要经过JVM的解释运行,所以说Java被称为半解释语言( "semi-interpreted" language)。
Java不是编译成本机机器代码,而是编译成自己的虚拟机代码,由虚拟机解释执行,C++是编译成本机代码执行的。
Java是一种跨平台,适合于分布式计算环境的面向对象编程语言。
具体来说,它具有如下特性:
简单性、面向对象、分布式、解释型、可靠、安全、平台无关、可移植、高性能、多线程、动态性等。
下面我们将重点介绍Java语言的面向对象、平台无关、分布式、多线程、可靠和安全等特性。
1面向对象面向对象其实是现实世界模型的自然延伸。现实世界中任何实体都可以看作是对象。对象之间通过消息相互作用。另外,现实世界中任何实体都可归属于某类事物,任何对象都是某一类事物的实例。如果说传统的过程式编程语言是以过程为中心以算法为驱动的话,面向对象的编程语言则是以对象为中心以消息为驱动。用公式表示,过程式编程语言为:程序=算法+数据;面向对象编程语言为:程序=对象+消息。
所有面向对象编程语言都支持三个概念:封装、多态性和继承,Java也不例外。现实世界中的对象均有属性和行为,映射到计算机程序上,属性则表示对象的数据,行为表示对象的方法(其作用是处理数据或同外界交互)。所谓封装,就是用一个自主式框架把对象的数据和方法联在一起形成一个整体。可以说,对象是支持封装的手段,是封装的基本单位。Java语言的封装性较强,因为Java无全程变量,无主函数,在Java中绝大部分成员是对象,只有简单的数字类型、字符类型和布尔类型除外。而对于这些类型,Java也提供了相应的对象类型以便与其他对象交互 *** 作。
多态性就是多种表现形式,具体来说,可以用“一个对外接口,多个内在实现方法”表示。举一个例子,计算机中的堆栈可以存储各种格式的数据,包括整型,浮点或字符。不管存储的是何种数据,堆栈的算法实现是一样的。针对不同的数据类型,编程人员不必手工选择,只需使用统一接口名,系统可自动选择。运算符重载(operatoroverload)一直被认为是一种优秀的多态机制体现,但由于考虑到它会使程序变得难以理解,所以Java最后还是把它取消了。
继承是指一个对象直接使用另一对象的属性和方法。事实上,我们遇到的很多实体都有继承的含义。例如,若把汽车看成一个实体,它可以分成多个子实体,如:卡车、公共汽车等。这些子实体都具有汽车的特性,因此,汽车是它们的“父亲”,而这些子实体则是汽车的“孩子”。Java提供给用户一系列类(class),Java的类有层次结构,子类可以继承父类的属性和方法。与另外一些面向对象编程语言不同,Java只支持单一继承。
2 平台无关性
Java是平台无关的语言是指用Java写的应用程序不用修改就可在不同的软硬件平台上运行。平台无关有两种:源代码级和目标代码级。C和C++具有一定程度的源代码级平台无关,表明用C或C++写的应用程序不用修改只需重新编译就可以在不同平台上运行。
Java主要靠Java虚拟机(JVM)在目标码级实现平台无关性。JVM是一种抽象机器,它附着在具体 *** 作系统之上,本身具有一套虚机器指令,并有自己的栈、寄存器组等。但JVM通常是在软件上而不是在硬件上实现。(目前,SUN系统公司已经设计实现了Java芯片,主要使用在网络计算机NC上。
另外,Java芯片的出现也会使Java更容易嵌入到家用电器中。)JVM是Java平台无关的基础,在JVM上,有一个Java解释器用来解释Java编译器编译后的程序。Java编程人员在编写完软件后,通过Java编译器将Java源程序编译为JVM的字节代码。任何一台机器只要配备了Java解释器,就可以运行这个程序,而不管这种字节码是在何种平台上生成的。另外,Java采用的是基于IEEE标准的数据类型。通过JVM保证数据类型的一致性,也确保了Java的平台无关性。
Java的平台无关性具有深远意义。首先,它使得编程人员所梦寐以求的事情(开发一次软件在任意平台上运行)变成事实,这将大大加快和促进软件产品的开发。其次Java的平台无关性正好迎合了“网络计算机”思想。如果大量常用的应用软件(如字处理软件等)都用Java重新编写,并且放在某个Internet服务器上,那么具有NC的用户将不需要占用大量空间安装软件,他们只需要一个
Java解释器,每当需要使用某种应用软件时,下载该软件的字节代码即可,运行结果也可以发回服务器。目前,已有数家公司开始使用这种新型的计算模式构筑自己的企业信息系统。
3 分布式分布式包括数据分布和 *** 作分布。数据分布是指数据可以分散在网络的不同主机上, *** 作分布是指把一个计算分散在不同主机上处理。
Java支持>
首先你要知道编译器给union的分配的内存空间是按占最大空间的变量决定,其他成员都是共享这段内存。
你的union中long b最大,int a和uchar c是共享这块内存;
所以给b赋值,自然a和c也分别有值了。
int占4个字节,所以是0x12345678,而c占一个字节,则是0x78
TIP:0x12 34 56 78是四个字节
而且根据你这个C输出结果来看你的系统应该是小端模式(比如X86),若是在ARM等处理器的环境下你的C输出估计是0x12,这个你以后学习socket编程的时候,肯定要了解的一个知识点(详细可以搜索一下大端模式与小端模式)
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。由于大部分 Java 应用主要集中在互联网网站以及基于浏览器的 B/S 系统的服务端,这类应用通常会较为关注服务的响应速度,希望系统的停顿时间尽可能少,CMS 收集器就非常符合这类应用的需求
从名字可以知道,CMS 收集器是基于标记 - 清除算法实现的,它的运作过程分为四个步骤:
由于整个过程中耗时最长的是并发标记和并发清除阶段,而这两个阶段都可以和用户线程并发执行,所以从总体上看,CMS 收集器内存回收过程是与用户线程一起并发执行的
CMS 收集器的主要优点就是:并发收集、低停顿,因此也称 CMS 收集器为并发低停顿收集器。但 CMS 还远未达到完美的程度,它至少有以下四个明显的缺点:
Garbage First(G1)收集器是一款主要面向服务端应用的垃圾收集器,开创了收集器面向局部收集的设计思路和基于 Region 的内存布局形式。HotSpot 开发团队对 G1 收集器的期望就是能在将来替代 CMS 收集器,所以在 JDK9 发布之日,G1 便宣告取代 Parallel Scavenge 加 Parallel Old 组合,成为服务端模式下的默认垃圾收集器,而 CMS 则沦为不推荐使用
在过去,包括 CMS 在内,垃圾收集的范围要么是整个新生代,要么是整个老年代,再要么是整个 Java 堆。而 G1 可以面向堆内存任何部分来组成回收集(Collection Set,一般简称 CSet)进行回收,衡量标准是哪块内存中垃圾数量最多,回收收益最大,这就是 G1 收集器的 Mixed GC 模式
虽然 G1 也是基于分代收集理论设计,但其对内存布局与其他收集器有明显差异。G1 把连续的 Java 堆划分成多个大小相等的独立区域(Region),每一个 Region 可以根据需要扮演新生代的 Eden 空间、Survivor 空间、老年代空间等等。收集器能对扮演不同角色的 Region 采用不同的策略处理
Region 中还有一类特殊的 Humongous 区域,专门用来存储大对象。只要该对象大小超过一半的 Region 的容量即可判定为大对象。而对于那些超过整个 Region 容量的超级大对象,将会被存放在 N 个连续的 Humongous Region 之中,G1 的大多数行为都把 Humongous Region 作为老年代的一部分来看待
停顿时间模型的意思是能够支持指定在一个长度为 M 毫秒的时间片段内,消耗在垃圾收集上的时间大概率不超过 M 毫秒这么一个目标。G1 收集器作为 CMS 收集器的替代者,自然可以实现这个目标
G1 之所以能建立起可预测的停顿时间模型,是因为它将 Region 作为单词回收的最小单元,即每次收集到的内存空间都是 Region 大小的整数倍,这样可以有计划地避免进行全区域的垃圾收集。G1 收集器还可以跟踪每个 Region 的垃圾堆积的“价值”大小,即回收所获得的空间大小以及所需时间,并在后台维护一个优先级列表,每次根据用户设置的允许收集停顿时间(使用 -XX:MaxGCPauseMillis 指定),优先处理回收价值最大的 Region。这种使用 Region 划分内存空间,以及具有优先级的区域回收方式,保证了 G1 收集器在有限的时间内获取尽可能高的收集效率
G1 收集器的设计理念看似无太多惊人之处,其实有很多关键的细节问题需要解决:
G1 收集器的运作过程大致可划分为以下四个步骤:
G1 和 CMS 都非常关注停顿时间控制,毫无疑问,可以由用户指定期望的停顿时间是 G1 收集器的一大杀手锏。G1 收集器经常被拿来和 CMS 收集器比较,从长远来看,G1 收集器肯定是会取代 CMS 收集器的
除了更先进的设计理念,单从传统的算法理论来看,G1 从整体来看是基于标记 - 整理算法实现,而从局部来看(两个 Region 之间)又是基于标记 - 复制算法实现,这意味着 G1 不会产生内存碎片。但 G1 并非全方面碾压 CMS,G1 由于其复杂的内部细节实现,使得垃圾收集时的内存占用和程序运行时的额外执行负载都要比 CMS 高。使用哪款收集器,往往要针对具体场景才能做定量比较,目前在小内存应用上 CMS 的表现大概率会优于 G1,而在大内存应用上 G1 则占有优势,这个平衡点通常在 6GB ~ 8GB 之间。当然,随着 HotSpot 开发者对 G1 的持续优化,最终胜利的天平必定回向 G1 倾斜
1光声明一个类,而不产生类的实例,即使这个类里面定义了N多函数,这些函数是不会出现在程序里的,也就是不占用内存,一旦声明定义的类,产生了类的实例,那么这些函数就会被编译进入程序里面
这个是C++预处理器的功劳,因为程序不用这个类,把它放到程序里面去,没有用处,除了占用空间
2另外,类必须有描述它的信息,这些信息是不占用内存的,即使这个类有实例在程序,C++程序运行的时候不需要这些,C++不是Java,类的描述信息,程序编译的时候只要其语意,用来控制对象的内存布局这些,程序运行时,不需要这些(举个例子来说,private型变量,只是编译的时候在语意级别检测类外面的程序不能直接访问它,程序运行的时候,你可以在对象外面改它,因此没有必要保存类的描述信息到程序中)
以上就是关于linux下有没有可以查看类对象的内存布局的全部的内容,包括:linux下有没有可以查看类对象的内存布局的、简述JAVA程序的编辑编译和运行过程、java语言的编译环境和c++有什么区别,java的特色是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)