Java程序-进程中的进程

进程

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

此图来自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类型编译优化为不同的本地代码, 第二次运行的时候直接运行本地代码。

时间: 2024-10-05 23:30:00

Java程序-进程中的进程的相关文章

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

首先说明内存总体分为了4个部分, 包括 1.stack segment (栈区存储基本数据类型的局部变量,对象的引用名) 2.heap segment(堆区,一般用于存储java中new 出来的对象) 3.code segment (代码段) 4.data segment (数据段,静态数据常量) 其中我们程序中用关键字new出来的东西都是存放在heap segment: 程序中的局部变量存放在stack segment,这些局部变量是在具体方法执行结束之后,系统自动释放内存资源(而heap s

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

下面的代码中,因为我是使用 for (Iterator<Element> i = el.elements().iterator(); i.hasNext(); ) 迭代器遍历根节点的所有子节点的flag,但是因为linux基线有 <initcmd> 节点,导致flag为空, 在传入service中进行数据库操作时抛出异常未被处理导致程序被挂起,错误信息不输出到console,直接打印到了页面. 解决方法就是try catch处理掉异常并返回false即可 public boolea

Python程序中的进程操作-进程池(multiprocess.Pool)

Python程序中的进程操作-进程池(multiprocess.Pool) 一.进程池 为什么要有进程池?进程池的概念. 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务.那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗时间,销毁进程也需要消耗时间.第二即便开启了成千上万的进程,操作系统也不能让他们同时执行,这样反而会影响程序的效率.因此我们不能无限制的根据任务开启或者结束进程.那么我们要怎么做呢? 在这里,要给大家介

操作系统中的进程和线程

进程与进程的作用 当我们双击程序图标,开始运行程序时,就产生了一个进程.所以进程的本质是一个正在执行的程序.进程包含了程序运行的所需要的所有信息,如代码段,数据段,程序计数器(存放下一条指令所在的地址),进程标识符(PID)进程控制块(PCB,用来保存进程退出CPU时的现场信息)等等信息. 所以进程可以看做是容纳程序运行的所有信息的容器. 值得注意的是,一个程序如果运行了两遍,则算是两个进程.如运行了两个word程序,这两个进程除了代码段,其他信息都是不一样的,事实上,这两个进程共享代码段. 进

如何使用命令行cmd执行java程序

如果你的电脑上没有像idea eclipse这类的IDE,但是因为工作需要必须要执行java代码怎么办呢? 这个时候就需要使用电脑最原始的执行方式 既命令行 1:首先你得安装了jdk与jre (这里就请自习查阅资料) 2:找到你的java程序工作区中的bin目录并复制下来   eg:bin目录即是java代码编译后的文件目录 如下: 我们发现这里面有很多.class文件,这里面既是我们编译后的文件 3:进入cmd(win+r  输入cmd回车) 4:进入你的java所在的盘位 如下:输入d: 回

java程序获取键盘输入(转载)

Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这种情况我们就束手无策,我们来看以下三种解决方法: 方法一:从控制台接收一个字符,然后将其打印出来 代码示例: 1 //System.in.read()方法,只能接收单个字符 2 private static void inputMethod1() throws IOException { 3

微信熟人牛牛程序安装微信熟人牛牛程序安装2017年 Java 程序员,风光背后的危机

不得不承认,经历过行业的飞速发展期微信熟人牛牛程序安装(h5.hxforum.com) 联系方式170618633533企鹅2952777280源码出售 房卡出售 后台出租有意者私聊扣扣,互联网的整体发展趋于平稳.为什么这么说?为什么要放在 Java 程序员的盘点下说?的确,对于进可攻前端,后可守后端大本营的 Java 程序员而言,虽然供应逐年上涨,但是市场似乎对他们依然青睐有加.这些承担着技术招聘市场中高供给高需求的 Java 程序员在 17 年的招聘市场上,真的还能如此风光吗?还是埋下了一些

第一次java程序测试感受

第一次JAVA程序设计测试,检验了一个暑假的成果.显而易见,我做的并不是很好,程序最起码的输入输出以及方法的定义还是没有问题的,但是考到了文件输入输出便看出来了.对于文件的输入输出,虽然我预习到那里,并看了一些案例,但在真正的测试的时候脑子一片空白,最终关于文件的操作都没有按规定完成.测试题目要求的两个TXT文件,我用的Scanner方法,文件的途径虽然正确,但是程序找不到文件.所以这是由于我预习不够认真,不够仔细造成的.文件的操作函数有很多,例如READER/WRITER/PRINTWRITE

Java程序员如何在面试时短时间内让面试官刮目相看?

前言 技术面试是每一位程序员都会经历的一件事情,技术面试官会通过自己的方式去考察程序员的技术功底与基础理论知识,这个过程被有的程序员成为"造火箭式的技术轰炸",不同程序员的面试经历与体验也是千差万别,各种奇怪,奇葩的情况也是层出不穷. 而很多Java程序员在面试时都有这样的苦衷: 我掌握了很多Java开发技巧,每次到笔试环节,死活就是答不上: 明明是一个职场老手,和面试官聊天,简单的技术问题都吞吞吐吐: Java程序员如何在面试时短时间内爆出核心技术?让对面的"不速之客&qu