也说java虚拟机

学习java的人如果不了解java虚拟机,那真是白学了。

java为什么可以跨平台,就是因为虚拟机的作用,java虚拟机就相当于一个计算机,它有自己的内存结构,当java程序在电脑上运行时,实际上上是在虚拟机上运行;所以,当任意系统的计算机安装java虚拟机后都可运行java程序;

我们来看一下java虚拟机的内存模型(网上随便找的):

方法区: 当java程序加载完成后,类,成员变量,静态变量等信息等保存到方法区中;

常量池:常量池是方法区的一部分,用于保存程序执行中创建的常量信息;

堆 :用于保存java程序中new(java关键词)出来的对象,GC的主要区域;

java虚拟机栈: 运行java程序的地方,我们知道java程序的运行实际是一个个方法的执行。从main方法开始,可能调用N多个方法,每当执行一个方法时,

就会在创建一个帧,用于保存方法的方法参数,局部变量,方法出口等信息;当方法执行完成后该帧弹出,回到上一帧(每个方法的执行就对应一个帧在虚拟

栈的从入到出的过程),直至main方法执行完成;

程序计数器:也是一块内存空间。java将java程序变编译成字节码,并翻译成本地代码,用于计算机识别;程序计数器就是用来指向当前线程所执行的字节

码的行号,就像在单步debug程序时,每执行一步,指示器就会指向所运行的行号,程序计数器就是类似得功能;在虚拟机模型中,字节码解释器就是根据程序

计数器来选取下一条要执行的指令,程序的正常执行就是靠它来识别的;当线程执行的不是java方法时,程序计数器的值是空的;

本地方法栈:类似java虚拟栈,不过java虚拟栈是执行java程序的,而本地方法栈是执行java native方法的;

因为java程序可以多线程运行,所以,java虚拟栈,本地方法栈,程序计数器是线程私有的,每一个线程都有自己的java虚拟栈和程序计数器,以保证线程安

全运行;

方法区和堆是线程共享的,所有线程公用方法区和堆(所以会有线程安全和非线程安全的说法)

时间: 2024-10-10 15:18:04

也说java虚拟机的相关文章

《深入理解Java虚拟机》笔记04 -- 并发锁

Java虚拟机在操作系统层面会先尽一切可能在虚拟机层面上解决竞争关系,尽可能避免真实的竞争发生.同时,在竞争不激烈的场合,也会试图消除不必要的竞争.实现这些手段的方法包括:偏向锁.轻量级锁.自旋锁.锁消除.锁膨胀等 1. 偏向锁 偏向锁是JDK1.6提出的一种锁优化方式.其核心思想是:如果程序没有竞争,则取消之前已经取得锁的线程同步操作.也就是说,若某一锁被线程获取后,便进入偏向模式,当线程再次请求这个锁时,无需再进行相关的同步操作,从而节省了操作时间.如果在此之间有其他线程进行了锁请求,则锁退

Java虚拟机9:Java类加载机制

http://www.cnblogs.com/xrq730/p/4844915.html 前言 我们知道我们写的程序经过编译后成为了.class文件,.class文件中描述 了类的各种信息,最终都需要加载到虚拟机之后才能运行和使用.而虚拟机如何加载这些.class文件?.class文件的信息进入到虚拟机后会发生什么变 化?这些都是本文要讲的内容,文章将会讲解加载类加载的每个阶段Java虚拟机需要做什么事(加粗标红). 类使用的7个阶段 类从被加载到虚拟机内存中开始,到卸载出内存,它的整个生命周期

Java虚拟机(JVM)中的内存设置详解

在一些规模稍大的应用中,Java虚拟机(JVM)的内存设置尤为重要,想在项目中取得好的效率,GC(垃圾回收)的设置是第一步. PermGen space:全称是Permanent Generation space.就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域Heap space:存放Instance. GC(Garbage Collection)应该不会对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很

探讨Java虚拟机之虚拟机体系结构

自工作以上,程序因为代码越写越多,变得越来越臃肿,效率也会变得越来越低,于是我总喜欢不断去优化程序结构外,内存优化和性能调优. 要对Java程序进行内存优化和性能调优,需要了解虚拟机的内部原理,了解Java虚拟机的好处除了上述提及两点好处.从更深一点的技术层面上看,了解Java虚拟机的规范和实现,将更加有助于我们编写高效.稳定的Java代码.比如,假如了解Java虚拟机的内存模型,了解虚拟机的内存回收机制,那么我们就不会过分依赖它,而会在需要的时候显式的"释放内存"(Java代码不能显

探讨深入Java虚拟机之内存优化

上一篇我们讲述了Java虚拟机的体系结构和内存模型,那么我们就不得不说到内存泄露.大家都知道,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题就是内存泄露难以解决,尽管Java的JVM有一套自己的垃圾回收机制来回收内存,在大多数的情况下并不需要java程序开发人员操太多的心,但也是存在泄露问题的,只是比C++小一点.比如说,程序中存在被引用但无用的对象:程序引用了该对象,但后续不会或者不能再使用它,那么它占用的内存空间就浪费了. 我们先来看看GC是如何工作的:监控每一个对象的运

Java虚拟机内存模型

1)程序计数器:线程私有 当线程数量超过CPU数量时,线程之间根据时间片轮询抢夺CPU资源,对于单核CPU来说,每一个时刻,只能有一个线程在运行,而其他线程必须被切换出去.因此,每个线程都有一个独立的程序计数器,用于记录下一条要运行的指令,各个线程之间的计数器互不影响,是一块线程的私有内存空间.当一个线程正在执行一个Java方法时,程序计数器记录正在执行的Java字节码地址,如果执行的是native方法,则计数器为空 2)Java虚拟机栈:线程私有 同Java线程同时间创建,用于保存方法的局部变

Java虚拟机工作原理详解

原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 [java] view plaincopy javac YourClassName.java 此时,你的java代码就被编译成字节码(.class).如果你是在Eclipse IDE或者其他开发工具中,你保存代码

jvm java虚拟机

jdk jre ==================================== # ./jre1.6.0_27-for-linux.bin # ls /usr/java/jre1.6.0_27/ # mv /usr/java/jre1.6.0_27/* /usr/java/ # vi profile27 export JAVA_HOME=/usr/javaexport PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=$JAVA_HOME/lib ==

Java虚拟机详解——JVM常见问题总结

[正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考之前的系列文章,尤其是那篇:Java虚拟机详解04--GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾回收.类加载机制. 先把本文的目录画一个思维导图:(图的源文件在本文末尾) 一.Java引用的四种状态: 强引用:  用的最广.我们平时写代码时,new一个Object存放在堆内存,然后用一个引用指向它,这就是强引用. * 如果一个对象具有强引用,那垃圾回收器绝不会回收它*.当内存空间不足,Java虚拟机宁

Java内存区域 - 深入Java虚拟机读后总结

Java虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,有各自的创建时间和销毁时间,有的区域随着虚拟机进程的启动而存在,有的区域则是依赖用户线程的启动和结束进行建立或销毁.Java虚拟机第二版规定,虚拟机管理的内存包含以下几个运行时数据区域 程序计数器:程序计数器(Program Counter Register)是一块较小的内存空间,作用可以理解为是当前线程所执行的字节码的行号指示器.Java虚拟机的多线程是通过线程切换以及分配处理器执行时间来