JDK 1.8 之前JDK 1.8 之后
主要是方法区的变化
程序计数器(PC)程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完成。
每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为"线程私有"的内存。
程序计数器主要有两个作用:
1、字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
2、在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。
注意:程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。
java虚拟机栈每个线程都有自己的Java虚拟机栈,与程序计数器一样,Java 虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是 Java 方法执行的内存模型,每次方法调用的数据都是通过栈传递的。
如果线程执行了一个方法,就会对这个方法调用创建对应的一个栈帧。栈帧里就有这个方法的局部变量表 、操作数栈、动态链接、方法出口等东西。
特点:
1、线程私有
2、栈由一系列帧组成(因此Java栈也叫做帧栈)
3、主要存放了编译器可知的各种数据类型、对象引用
4、每一次方法调用创建一个帧,并压栈,调用结束后,都会有一个栈帧被弹出。
java堆1、和程序开发密切相关
2、应用系统对象都保存在Java堆中
Java世界中"几乎"所有的对象都在堆中分配,但是,随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、变量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么"绝对"了。从jdk1.7开始已经默认开启逃逸分析,如果某些方法中的对象引用没有被返回或者未被外面使用(也就是未逃逸出去),那么对象可以直接在栈上分配内存。
3、所有线程共享Java堆
4、GC管理的主要工作区,对分代GC来说,堆是分代的。
分为新生代和老年代;新生代又分为Eden空间、From Survivor(来自幸存者)空间、To Survivor(生还者)空间三部分,后续会进行详细讲解分代之间如何运行的。
方法区(jdk8后是元空间)1、方法区与 Java 堆一样,是各个线程共享的内存区域
2、保存装载的类信息:类型的常量池、字段,方法信息、方法字节码。
3、方法区内会不会进行垃圾回收,除非满足以下条件:
首先该类的所有实例对象都已经从Java堆内存里被回收。
其次加载这个类的ClassLoader已经被回收
最后对该类的Class对象没有任何引用
本地方法栈和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。
本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态链接、出口信息。
下节讲解:JVM中有哪些垃圾回收算法?
本文发布于:2023-02-28 20:14:00,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/167766493882453.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:jdk1.7(jdk1.7安装教程及环境变量配置).doc
本文 PDF 下载地址:jdk1.7(jdk1.7安装教程及环境变量配置).pdf
留言与评论(共有 0 条评论) |