java在内存编译代码 java在内存编译代码中的应用

简述JAVA程序的编辑编译和运行过程Java应用程序的开发周期包括编译、下载、解释和执行几个部分 。Java编译程序将 Java源程序翻译为JVM可执行代码--字节码 。Java将符号引用信息保留在字节码中 , 由解释器在运行过程中创立内存布局,然后再通过查 表来确定一个方法所在的地址 。这样就有效的保证了Java的可移植性和安全性 。
运行JVM字节码的工作是由解释器( java命令 )来完成的 。解释执行过程分三部进行:代码的装入、代码的校验和代码的执行 。装入代码的工作由"类装载器"(class loader)完成 。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类 。当类装载器装入一个类时,该类被放 在自己的名字空间中 。除了通过符号引用自己名字空间以外的类,类之间没有其他办法可以影响其他类 。在本台计算机上的所有类都在同一地址空间内,而所有从外 部引进的类,都有一个自己独立的名字空间 。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响 。当装入 了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局 。解释器为符号引用同特定的地址空间建立对应关系及查询表 。通过在这一阶段确定代码的 内存布局,Java很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码对地址的非法访问 。
java程序在内存中的执行过程是怎样的?能推荐一本书吗? 本人邮箱:wei.clear99@gmail.com我空间日志里有,不过没加好友估计访问不了,直接贴出来吧
Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识 。一般Java在内存分配时会涉及到以下区域:
◆寄存器:我们在程序中无法控制
◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中 , 而是存放在堆中
◆堆:存放用new产生的数据
◆静态域:存放在对象中用static定义的静态成员
◆常量池:存放常量
◆非RAM存储:硬盘等永久存储空间
Java内存分配中的栈
在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配 。
当在一段代码块定义一个变量时 , Java就在栈中 为这个变量分配内存空间 , 当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用 。
Java内存分配中的堆
堆内存用来存放由new创建的对象和数组 。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理 。
在堆中产生了一个数组或对象后,还可以 在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量 。引用变量就相当于是 为数组或对象起的一个名称 , 以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象 。引用变量就相当于是为数组或者对象起的一个名称 。
引用变量是普通的变量,定义时在栈中分配 , 引用变量在程序运行到其作用域之外后被释放 。而数组和对象本身在堆中分配,即使程序 运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉) 。这也是 Java 比较占内存的原因 。

推荐阅读