进程

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

  
  此图来自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. js实现页面跳转的几种方式

    第一种:    <script language="javascript" type="text/javascript">           wi ...

  2. Windows 安装ELK

    在Windows服务器上安装ELK logstash在windows平台下不能监控磁盘文件,用nxlog代替,监控文件并把内容发送到logstash 部署环境 Os :Windows 7 logsta ...

  3. windows 10 & Office 2016 安装

    Office 2016 VOL版    http://blog.sina.com.cn/s/blog_470614a90102vtmc.html 专业版合集: magnet:?xt=urn:btih: ...

  4. 地铁 Dijkstra(优先队列优化) 湖南省第12届省赛

    传送门:地铁 思路:拆点,最短路:拆点比较复杂,所以对边进行最短路,spfa会tle,所以改用Dijkstra(优先队列优化) 模板 /******************************** ...

  5. HDU 5139 Formula --离线处理

    题意就不说了,求公式. 解法: 稍加推导能够得出 : f(n) = n! * f(n-1) , 即其实是求: ∏(n!)  ,盲目地存下来是不行的,这时候看见条件: 数据组数 <= 100000 ...

  6. accp7.0优化MySchool数据库设计内测笔试题总结

    1) 在SQL Server 中,为数据库表建立索引能够(C ). 索引:是SQL SERVER编排数据的内部方法,是检索表中数据的直接通道 建立索引的作用:大大提高了数据库的检索速度,改善数据库性能 ...

  7. [No00004D]深度思考好文:软件工程师的困境

    昨天是我一同学结婚的好日子,同学们大家聊各自的工作,有个同学突然问了我一句:我们同学中好像做软件的不多?如果再细分,好像做网络相关的更少? 回想起当时为何读计算机信息管理的专业,是因为那时听说读电脑未 ...

  8. NOI 2002 营业额统计 (splay or fhq treap)

    Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...

  9. 实现鼠标拖动canvas绘制的图片

    不啰嗦上代码: <html> <head> <meta http-equiv="Content-Type" content="text/ht ...

  10. 规范化注释 VVDocumenter的使用方法

    很多时候,为了快速开发,很多的技术文档都是能省则省,这个时候注释就变得异常重要,但是每次都要手动输入规范化的注释,着实也麻烦,但有了VVDocumenter,规范化的注释,主需要输入三个斜线“///” ...