进程

我们知道程序在磁盘上的时候是静态的,当他被加载到内存的时候,就变成了一个动态的,称为进程,如下图是程序被加载到内存后,在内存中的分布情况如下

  
  此图来自http://blog.csdn.net/woshinia/article/details/41722085 具体每段的作用可以参考这篇文章,这里我们只要大概了解一下,在程序被加载到内存后,会被分为代码段,数据段,堆段和栈段。其中代码段就是存放数据,数据段存放一些全局和静态数据,堆段存放的动态创建的内存对象,而栈段则是线程栈运行的区域。 

Java虚拟机

  Java虚拟机(Java Virtual Machine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境。这是官方对他的解释, Java虚拟机可以运行Java程序,这里Java虚拟机也是程序, 所以当他被加载到内存后也具有上述的特征, 在代码段存放JVM的代码, 在数据区存放JVM的数据, 堆和栈也是JVM在使用。

Java程序

  在一些介绍Java程序的博客中, 我们通常可以看到一些介绍Java内存分布式的情况,比如这篇文章http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html 里面也介绍了Java的堆和栈, 
 
  那这里的堆和栈和JVM的堆和栈有什么区别呢,这里引入一张图片,如下(图片来源于http://www.importnew.com/14486.html)
 
  这张图表达了两个堆栈的区别,上面是操作系统内一个普通进程的内存分布情况,可以看到其分布情况和我们刚才描述的差不多,同时JVM也是一个普通的进程,所以代码段和数据段存放的也是JVM的代码和数据,主要区分在堆和栈。先说堆,首先是永久代,永久代本质上是Java程序的代码区和数据区。Java程序中类(class),会被加载到整个区域的不同数据结构中去,包括常量池、域、方法数据、方法体、构造函数、以及类中的专用方法、实例初始化、接口初始化等。这个区域对于操作系统来说,是堆的一个部分;而对于Java程序来说,这是容纳程序本身及静态资源的空间,使得JVM能够解释执行Java程序。其次是新生代和老年代。新生代和老年代才是Java程序真正使用的堆空间,主要用于内存对象的存储;但是其管理方式和普通进程有本质的区别,普通的程序是需要动态申请的,而JVM则是一次性申请,然后在逐次分配给Java程序,所以从效率上来说会优于普通程序。
  我们从上面的描述可以看出,JVM是在自己的堆里又模拟了一个“进程”出来,这个“进程”中有代码区、数据区、和“堆”。 这里我们也就可以理解为什么我们可以为运行的虚拟机设置内存大小,我们可以在程序启动的时候通过-Xms,-Xmx等参数来设置堆的大小,其本质还是由JVM控制在JVM的堆区通过malloc来分配指定内存给Java程序使用。
  当然上图也仅仅是一个简化的模型,JVM的内存分配要比上面的复杂,如果按照上图的分配,那程序将会相当的慢,JVM本身做了大量的优化来提升性能,比如提前申请内存。 在.net中, CLR会根据不同的CPU类型编译优化为不同的本地代码, 第二次运行的时候直接运行本地代码。 

Java程序-进程中的"进程"的更多相关文章

  1. 分析占用了大量CPU处理时间的java进程中的进程

    分析占用了大量 CPU 处理时间的是Java 进程中哪个线程 下面是详细步骤: 1. 首先确定进程的 ID ,可以使用 jps -v 或者 top 命令直接查看 2. 查看该进程中哪个线程占用大量 C ...

  2. 1 Java程序文件中函数起始行和终止行在程序文件位置中的判定__抽象语法树方法

    应用需求: 实现对BigCloneBench中函数体的克隆检测,必须标注出起始行号和终止行号. 问题: 给定一个Java文件,从中提取出每个函数的起始行和终止行. 难点: 这个问题的难点在于,对于Ja ...

  3. Java程序开发中的简单内存分析

    首先说明内存总体分为了4个部分, 包括 1.stack segment (栈区存储基本数据类型的局部变量,对象的引用名) 2.heap segment(堆区,一般用于存储java中new 出来的对象) ...

  4. Java程序学习中各阶段的建议

    第一部分:对于尚未做过Java工作的同学,包括一些在校生以及刚准备转行Java的同学. 一.Java基础 首先去找一个Java的基础教程学一下,这里可以推荐一个地址,或者你也可以参照这个地址上去找相应 ...

  5. java程序运行中如果出现异常未被处理,将会被抛到java虚拟机进行处理,程序中断运行后被挂起,在页面输出错误信息(不会输出到console)

    下面的代码中,因为我是使用 for (Iterator<Element> i = el.elements().iterator(); i.hasNext(); ) 迭代器遍历根节点的所有子 ...

  6. 在java程序代码中打开文件

    class     TEST {      public  static  void  main(String[]  args){        System.out.println("He ...

  7. 第五篇(那些JAVA程序BUG中的常见单词)

    The left-hand side of an assignment must be a variable 赋值的左侧必须是变量 left-hand side 左边 assignment 赋值

  8. 第四篇(那些JAVA程序BUG中的常见单词)

    xxx cannot be resolved to a variable xxx无法解析为变量 resolve 解析

  9. 第三篇(那些JAVA程序BUG中的常见单词)

    illegal modifier for parameter xxx; only final is permitted 参数xxx的修饰符非法:只允许final illegal 非法的 modifie ...

随机推荐

  1. A cost-effective recommender system for taxi drivers

    一个针对出租车司机有效花费的推荐系统 摘要 GPS技术和新形式的城市地理学改变了手机服务的形式.比如说,丰富的出租车GPS轨迹使得出做租车领域有新方法.事实上,最近很多工作是在使用出租车GPS轨迹数据 ...

  2. Linux信号类型说明

    说明 在Linux系统开发中经常要使用到信号来实现异步通知机制.而在Linux系统中信号有很多种,也不用全部记住,学习几种常见的信号,学会使用即可:当然也要知道用哪种方式能够发送这样的信号. 查看li ...

  3. 2. Docker - 安装

    一.Docker介绍 1. Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上, 也可以实现虚拟化. 容器时完全使用沙 ...

  4. Js apply call方法详解【转】

    我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家 ...

  5. Linux软件安装-yum安装

    虽然RPM包安装软件很方便.快捷,但是还是需要现有安装包才能安装.为了更为方便的安装软件,发展出了利用网络自动安装的方式--yum安装. 使用yum安装的前提是机器可以上网. 1.配置yum源 在/e ...

  6. 使用中国版 Office 365 -- Team Site分享

    Team Site(工作组网站)主要用于团队内部的协同工作,团队(组织机构)内部每个需要使用Team Site的用户都需要一个Office 365的license.但是如果我们需要将Team Site ...

  7. css3 background

    background是一个很重要的css属性,在css3中新增了很多内容.一方面是原有属性新增了属性值,另一方面就是新增了3个属性. 一.css3中新增属性值介绍 css2的background有5个 ...

  8. continue break return的区别

    1.continue 语句的作用       终止本次循环的执行,即跳过当前一次循环中continue语句后尚未执行的语句,然后进行下一次循环条件的判断. 2.break 语句的作用     (1)当 ...

  9. C#读写app.config中的数据

    C#读写app.config中的数据 读语句: String str = ConfigurationManager.AppSettings["DemoKey"]; 写语句: Con ...

  10. HDU 2516 取石子游戏

    Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Secon ...