jvm|面试题必问:JVM 运行时数据区详解,写得非常好!( 二 )
物理地址
问题二:栈和堆的区别
- 堆的物理内存分配是不连续的;
栈的物理内存分配是连续的 - 分配内存
- 堆是不连续的 , 分配的内存是在运行期确定的 , 大小不固定;
栈是连续的 , 分配的内存在编译器就已经确定 , 大小固定 - 存放内容
- 堆中存放的是对象和数组 , 关注的是数据的存储;
栈中存放局部变量 , 关注的是程序方法的执行 - 是否线程私有
- 堆内存中的对象对所有线程可见 , 可被所有线程访问;
栈内存属于某个线程私有的 - 异常
- 栈扩展失败 , 会抛出 StackOverflowError;
堆内存不足 , 会抛出 OutOfMemoryError
和堆一样不需要连续的内存 , 并且可以动态扩展 , 动态扩展失败一样会抛出 OutOfMemoryError 异常 。
对这块区域进行垃圾回收的主要目标是对常量池的回收和对类的卸载 , 但是一般比较难实现 。
HotSpot 虚拟机把它当成永久代来进行垃圾回收 。 但很难确定永久代的大小 , 因为它受到很多因素影响 , 并且每次 Full GC 之后永久代的大小都会改变 , 所以经常会抛出 OutOfMemoryError 异常 。 为了更容易管理方法区 , 从 JDK 1.8 开始 , 移除永久代 , 并把方法区移至元空间 , 它位于本地内存中 , 而不是虚拟机内存中 。
方法区是一个 JVM 规范 , 永久代与元空间都是其一种实现方式 。 在 JDK 1.8 之后 , 原来永久代的数据被分到了堆和元空间中 。 元空间存储类的元信息 , 静态变量和常量池等放入堆中 。
元空间使用本地内存 , 而永久代使用 JVM 的内存 。
元空间(MetaSpace)与永久代(PermGen)的区别
1、字符串常量池存在永久代中 , 容易出现性能问题和内存溢出
元空间(MetaSpace)相比永久代(PermGen)的优势
2、类和方法的信息大小难以确定 , 给永久代的大小指定带来困难
3、永久代会为 GC 带来不必要的复杂性
运行时常量池运行时常量池是方法区的一部分 。
Class 文件中的常量池(编译器生成的字面量和符号引用)会在类加载后被放入这个区域 。
除了在编译期生成的常量 , 还允许动态生成 , 例如 String 类的 intern() 。
直接内存
【jvm|面试题必问:JVM 运行时数据区详解,写得非常好!】在 JDK 1.4 中新引入了 NIO 类 , 它可以使用 Native 函数库直接分配堆外内存 , 然后通过 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作 。 这样能在一些场景中显著提高性能 , 因为避免了在堆内存和堆外内存来回拷贝数据 。
JVM常见参数
| 参数 | \t\t\t含义 |
|---|---|
| -Xss | \t\t\t规定了每个线程虚拟机栈(堆栈)的大小 , 会影响并发线程数的大小 |
| -Xms | \t\t\t堆的初始值 |
| -Xmx | \t\t\t堆能达到的最大值 |
- 浮甘瓜于清泉,沉朱李于寒水”描述的是什么场面 蚂蚁庄园今日答案6月28日
- 零售业|确定涨价!iPhone14四款新机全面涨价!国行也在其中!
- |三星Galaxy Z Fold 4 封面显示曝光 外部显示器23: 9 纵横比
- 联发科天玑9000+之王浮出水面,极有可能又是vivo
- 一加科技|荣耀好戏不断,16+256GB新机露面,还有5000mAh大电池陪同
- PHP|如何降低用户关注的非必要页面的权重传递?
- rest|golang笔记 | 面试题整理
- |强劲送风,满足你对美感的挑剔—洛斐有范S桌面风扇
- iOS|iPhone6s升级iOS15.6b3各方面优化太满意了,老机型终于能养老了
- 6月23日消息|全面自主可控!首个全链路国产操作系统OpenCloudOS
