学生个人网站设计,北京到安阳火车,商城网站建设制作,wordpress 去掉tag参考视频 JVM架构总览图 程序计数器 程序计数器#xff0c;物理上用寄存器实现。 作用#xff1a; 记住下一条JVM指令的执行地址 特点#xff1a; 1 是线程私有的#xff0c;随着线程的创建而创建#xff0c;随着线程的消息而消息 2 是一小块内存 3 唯一不会内存溢出的地方…参考视频 JVM架构总览图 程序计数器 程序计数器物理上用寄存器实现。 作用 记住下一条JVM指令的执行地址 特点 1 是线程私有的随着线程的创建而创建随着线程的消息而消息 2 是一小块内存 3 唯一不会内存溢出的地方 栈
介绍 栈程序运行需要的内存空间 虚拟机栈 每个线程运行时所需要的内存 数据结构先进压栈后出出栈 一个栈可以看成多个栈帧组成每个栈帧可以看成每个方法的运行时需要的内存参数局部变量返回地址等 定义 1 每个线程运行时所需要的内存成为虚拟机栈 2 每个栈由多个栈帧(Frame)组成对应着每次方法调用时所占用的内存 3 每个线程只能有一个活动栈帧活动栈帧即当前正在执行的那个方法 问题辨析 1 垃圾回收是否涉及栈内存 答不需要。 每次方法结束后都会出栈自动被回收所以不需要垃圾回收。 2 栈内存分配越大越好吗 答不是。内存是有限的栈内存越大线程越少。 Linux/MacOs/Oracle Solaris : 栈内存大小默认1024k -Xss1024k 3 方法内的局部变量是否线程安全 答如果方法内 局部变量没有逃离方法的作用范围它是线程安全的。如果是局部变量引用了对象并逃离方法的作用范围需要考虑线程安全 栈内存溢出
栈帧过多即调用的方法过多最容易产生的递归调用测试2w多次递归会报错栈帧过大不太容易出现
本地方法栈native method stacks 不是由java代码编写的方法java用本地方法调用底层的c或c使用的方法 给本地的方法的运行提供内存空间 线程私有
堆Heap
介绍 通过new关键字创建对象都会使用堆内存
特点
它是线程共享的堆中对象都需要考虑线程安全问题有垃圾回收机制
堆内存溢出 配置堆内存大小-Xmx4G 方法区
定义 方法区是一个逻辑上的概念也被称为非堆Non-Heap一般用来存储类加载信息、static变量、JIT实时编译缓存的代码、常量池Constants Pool等。不同版本的Java其方法区的实现方式不同在JDK 8之前采用的是“永久代”来实现方法区而在JDK 8之后则是采用MetaSpace元空间的方式来实现 共享性 方法区与Java堆一样是各个线程共享的内存区域。创建和内存空间 方法区在JVM启动时被创建实际的物理内存空间和Java堆一样可以是不连续的。大小和可扩展性 方法区的大小就像堆空间一样可以选择固定大小或可扩展。溢出问题 方法区的大小决定了系统能够保存多少个类。如果系统定义了太多的类导致方法区溢出虚拟机将抛出内存溢出错误例如 java.lang.OutOfMemoryError: PermGen space 或 java.lang.OutOfMemoryError: Metaspace。释放 关闭JVM将释放方法区的内存空间。
方法区是用于存储类信息、常量池、静态变量等数据的区域对于Java虚拟机的正常运行和类加载等都具有重要作用。
jdk8之后 字符串常量和静态变量移到堆中
参考文档【JVM系列】运行时Java类的内存营地——方法区详解 - 知乎