Jvm基础(1)-Java运行时数据区
2015-07-16 11:04
399 查看
转载自:http://www.cnblogs.com/wardensky/p/4162121.html
最近在看《深入理解Java虚拟机》,里面讲到了Java运行时数据区,这是Jvm基本知识,把读书笔记记录在此。这些知识属于常识,都能查到的,如果我有理解不对的地方,还请指出。
首先把图贴上来,图来自JVM Runtime Data Areas(运行时数据区),感谢。
由上图可知,Java运行时数据区域包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。
1. 程序计数器
程序计数器用来记录下一条字节码指令,因为CPU是要轮转的,在切换回来之后,Java能够找到下一条要执行的指令。如果是多线程程序,那么,每一个线程会有一个独立的程序计数器。【我疑惑的是不知道这个具体怎么设计的,如果一个有几十万线程的程序会不会有问题?】此内存区域是唯一一个不定义OutOfMemoryError的区域。
另外,比较好玩的是,其英文是Program Counter Register,说到底是一个寄存器,翻译成计数器有点不准确。
2.Java虚拟机栈
Java虚拟机栈就是平常说的栈,我理解栈主要存储方法相关的内容,如方法参数、方法中局部变量等。调用方法时,内容压入栈中,方法返回时,从栈中弹出。栈里面还细分为局部变量区、操作数栈、动态连接等。其中局部变量区存储了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用等。其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用1个。【这个要特别注意,这个会引起一个线程同步的问题】
3.本地方法栈
本地方法指的是Java实现不了,用C或C++实现的方法。关于本地方法,请参考java native方法及JNI实例。
4.Java堆
Java堆是最值得关注的地方,因为这个地方经常抛出内存不足的异常。【我在项目中就遇到过很多次,都是内存泄漏的问题】
Java堆是代码里面存放变量的地方,比如定义了一个字符串,那么其真实地址就存在堆中。Java堆可以分为新生代(New Generation)和老年代(Old Generation/Tenuring Generation),有的又分为Eden空间、From Survivor空间、To Survivor空间等。其主要思想与Java GC有关系,即大部分对象的存活时间都比较短,如果某一个对象存活时间比较长,就把他移到另外一个区域。这样做GC的成本比较低。【关于这个话题,我会单独写一篇】
5.方法区
方法区存储的是类的一些基本信息,如类的常量池、静态变量等。【标准说法是:类及其父类的全限定名(java.lang.Object没有父类)、类的类型(Class or Interface)、访问修饰符(public, abstract, final)、实现的接口的全限定名的列表、常量池、字段信息、方法信息、静态变量、ClassLoader引用、Class引用】
可以这样理解,如果定义了一个类,其中有一个静态变量,那么在new这个类的时候,静态变量会放在方法区,实例的其它部分会放在Java堆;如果又new了这个类,那么方法区的静态变量不变,在Java堆里面会有一块新的内存放实例。
以上就是Java运行时数据区,了解这部分内容会对后续的学习(如GC)有一定的帮助。
最近在看《深入理解Java虚拟机》,里面讲到了Java运行时数据区,这是Jvm基本知识,把读书笔记记录在此。这些知识属于常识,都能查到的,如果我有理解不对的地方,还请指出。
首先把图贴上来,图来自JVM Runtime Data Areas(运行时数据区),感谢。
由上图可知,Java运行时数据区域包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。
1. 程序计数器
程序计数器用来记录下一条字节码指令,因为CPU是要轮转的,在切换回来之后,Java能够找到下一条要执行的指令。如果是多线程程序,那么,每一个线程会有一个独立的程序计数器。【我疑惑的是不知道这个具体怎么设计的,如果一个有几十万线程的程序会不会有问题?】此内存区域是唯一一个不定义OutOfMemoryError的区域。
另外,比较好玩的是,其英文是Program Counter Register,说到底是一个寄存器,翻译成计数器有点不准确。
2.Java虚拟机栈
Java虚拟机栈就是平常说的栈,我理解栈主要存储方法相关的内容,如方法参数、方法中局部变量等。调用方法时,内容压入栈中,方法返回时,从栈中弹出。栈里面还细分为局部变量区、操作数栈、动态连接等。其中局部变量区存储了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用等。其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用1个。【这个要特别注意,这个会引起一个线程同步的问题】
3.本地方法栈
本地方法指的是Java实现不了,用C或C++实现的方法。关于本地方法,请参考java native方法及JNI实例。
4.Java堆
Java堆是最值得关注的地方,因为这个地方经常抛出内存不足的异常。【我在项目中就遇到过很多次,都是内存泄漏的问题】
Java堆是代码里面存放变量的地方,比如定义了一个字符串,那么其真实地址就存在堆中。Java堆可以分为新生代(New Generation)和老年代(Old Generation/Tenuring Generation),有的又分为Eden空间、From Survivor空间、To Survivor空间等。其主要思想与Java GC有关系,即大部分对象的存活时间都比较短,如果某一个对象存活时间比较长,就把他移到另外一个区域。这样做GC的成本比较低。【关于这个话题,我会单独写一篇】
5.方法区
方法区存储的是类的一些基本信息,如类的常量池、静态变量等。【标准说法是:类及其父类的全限定名(java.lang.Object没有父类)、类的类型(Class or Interface)、访问修饰符(public, abstract, final)、实现的接口的全限定名的列表、常量池、字段信息、方法信息、静态变量、ClassLoader引用、Class引用】
可以这样理解,如果定义了一个类,其中有一个静态变量,那么在new这个类的时候,静态变量会放在方法区,实例的其它部分会放在Java堆;如果又new了这个类,那么方法区的静态变量不变,在Java堆里面会有一块新的内存放实例。
以上就是Java运行时数据区,了解这部分内容会对后续的学习(如GC)有一定的帮助。
相关文章推荐
- Java事务与JTA
- C#调用java类、jar包方法。
- spring aop order
- 《Spring技术内幕》学习笔记18——Spring使用Hessian实现远程调用
- 《Spring技术内幕》学习笔记19——Spring RMI实现远程调用
- 《Spring技术内幕》学习笔记16——Spring具体事务处理器的实现
- 《Spring技术内幕》学习笔记14——Spring读取和处理事务配置
- 《Spring技术内幕》学习笔记15——Spring事务处理的实现
- 《Spring技术内幕》学习笔记12——HibernateTemplate对Hibernate的封装
- 《Spring技术内幕》学习笔记13——SqlMapClientTemplate对Ibatis的封装
- 《Spring技术内幕》学习笔记10——Web环境中Spring的启动过程
- 《Spring技术内幕》学习笔记11——JdbcTemplate封装Jdbc
- spring 对Cache的两种支持方式
- 《Spring技术内幕》学习笔记8——创建AOP代理对象并对目标对象切面拦截
- 《Spring技术内幕》学习笔记9——AOP通知以及编程式AOP
- spring @Cacheable的用法
- 如何在Ubuntu 14.04中安装最新版Eclipse
- 《Spring技术内幕》学习笔记7——AOP基础
- 关于 Java Collections API 您不知道的 5 件事
- 关于java程序加图片不能打包成可运行jar的问题