虚拟机栈:线程私有,随线程创建而创建。栈里面是一个一个“栈帧”,每个栈帧对应一次方法调用。栈帧中存放了局部变量表(基本数据类型变量和对象引用)、操作数栈、方法出口等信息。当栈调用深度大于JVM所允许的范围,会抛出StackOverflowError的错误。

本地方法栈:线程私有,这部分主要与虚拟机用到的Native方法相关,基本等同于虚拟机栈,存放得是native方法帧,可出现SOF和OOM错误。

程序计数器:也叫PC寄存器,JVM支持多个线程同时运行,每个线程都有自己的程序计数器。倘若当前执行的是 JVM 的方法,则该寄存器中保存当前执行指令的地址;倘若执行的是native方法,则PC寄存器中为空。(PS:线程执行过程中并不都是一口气执行完,有可能在一个CPU时钟周期内没有执行完,由于时间片用完了,所以不得不暂停执行,当下一次获得CPU资源时,通过程序计数器就知道该从什么地方开始执行)

元空间(metaSpace):所有线程共享。存放class加载相关信息。

堆:所有线程共享。存放new出来的数组和对象数据,以及类的静态变量。同时,包含一个常量池(final),是由1.7以前版本的方法区转移过来的。当申请不到空间时会抛出OutOfMemoryError。堆内存里面划分年轻代和年老代

运行时启动参数调优:

-Xms和-Xmx

用于设置堆内存的大小

-XX:NewSize和-XX:MaxNewSize

用于设置年轻代的大小,建议设为整个堆大小的1/3或者1/4,两个值设为一样大。

-XX:SurvivorRatio

用于设置Eden和其中一个Survivor的比值,这个值也比较重要。

-XX:NewRatio=3代表新生代和老年代的比例为1:3

需要注意的是,JDK8中已经用Metaspace(元数据区)完全替代了永久代(即方法区)

而且元数据区内存不在JVM中,而是使用的本地内存,默认情况下受操作系统内存限制。

调整元数据区内存大小的参数 -XX:MetaspaceSize -XX:MaxMetaspaceSize

垃圾回收机制调优:

GC主要分二类,新生代GC,老年代GC;

新生代GC包括:串行GC、并行GC、并行回收GC

老年代GC包括:串行GC、并行GC、CMS

G1比较特殊,同时支持新生代和老年代

GC选择:

GC在选择上,主要关注两点,吞吐量优先和暂停时间优先,

对于吞吐量优先的采用server默认的并行GC(Parallel GC)方式(上图蓝色区域),

对于暂停时间优先的选用并发GC(CMS)方式(上图黄色区域),常用场景:互联网、电商类

常用GC开启方式

暂停时间优先: 并行GC + CMS

开启方式[ -XX:+UseConcMarkSweepGC -XX:+UseParNewGC ]

吞吐量优先: 并行回收GC + 并行GC

开启方式 [ -XX:+UseParallelOldGC ] ,此GC也时server模式默认的配置

G1: [ -XX:+UseG1GC ]

适用于服务器端、大内存、多CPU情景的垃圾收集器;

G1的目标是在维持高效率回收的同时,提供软实时中断特性

常用场景:hadoop、elasticsearch

CMS和G1区别

Cms 堆 -> 年轻代老年代

G1 堆 -> 多个区 -> 每个区里(年轻代老年代)

Cms 标记清理算法

G1 压缩复制算法,不产生碎片

G1 时间停顿可设置,相关参数[ -XX:MaxGCPauseMillis=100 -XX:GCPauseIntervalMillis=200 ]

java8 内存模型_java8内存模型相关推荐

  1. JAVA 继承内存模型_Java内存模型

    JVM的组成 类加载器(classloader) 执行引擎(execution engine) 运行时数据区域(runtime data area) 对于Java程序员来说,在虚拟机自动内存管理机制下 ...

  2. JVM内存结构、内存模型 、对象模型那些事

    作者:Hollis,阿里资深攻城狮 来自:Hollis Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文我 ...

  3. java内存规范_Java内存模型-jsr133规范介绍

    最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>讲到了线程相关的细节知识,里面讲述了关于java内存模型,也就是jsr 133定义的规范. 系统的看了jsr 133规范的前面几 ...

  4. Java---线程多(工作内存)和内存模型(主内存)分析

    转载自 https://www.cnblogs.com/chihirotan/p/6486436.html 首先解读Java内存模型(这里区别于JVM的内存模型,堆.栈.工作区) Java 内存模型来 ...

  5. java内存模型和内存结构_Java内存模型和优化

    java内存模型和内存结构 总览 许多多线程代码开发人员都熟悉这样的想法,即不同的线程可以对持有的值有不同的看法,这不是唯一的原因,即如果线程不安全,它可能不会看到更改. JIT本身可以发挥作用. 为 ...

  6. python内存模型_内存篇3:CPython的内存管理架构-L2-块

    本篇用到了C/C++的内存对齐的基础知识,我已经假定你有C/C++内存管理的相关基础. 我们在前一篇的流程图中留下了两个黑箱子,会涉及到内存模型第一层以上的其他话题,回顾下面关于第一层面向类型的内存A ...

  7. JVM 内存模型与内存分配方式

    文章目录 JVM 内存模型概述 基于分代收集理论设计的垃圾收集器所管理的堆结构 方法区的演变 内存分配 划分内存的方法 划分内存时如何解决并发问题 对象栈上分配 基于分代收集理论的垃圾收集器管理下的内 ...

  8. JVM并发机制探讨—内存模型、内存可见性和指令重排序

    并发本来就是个有意思的问题,尤其是现在又流行这么一句话:"高帅富加机器,穷矮搓搞优化".从这句话可以看到,无论是高帅富还是穷矮搓都需要深入理解并发编程,高帅富加多了机器,需要协调多 ...

  9. java内存管理之内存模型

    1,运行时数据区域 1. 程序计数器 (program counter register) 2. Java虚拟机栈 (jvm stack) 3. 本地方法栈 (native method stack) ...

最新文章

  1. Linux系统下软件包管理四
  2. JUC系列(十) | ForkJoin框架 并行处理任务
  3. C++Jump Search跳转搜索的实现算法(附完整源码)
  4. ubuntu解压zip文件乱码问题
  5. 随时随地能写代码, vscode.dev 出手了
  6. 深度解析windows调试技术之一 [抓取user mode dump文件的几重境界]
  7. 括号匹配不一定用栈哦(洛谷P1739题题解,Java语言描述)
  8. Oracle性能监控脚本(sql)
  9. ibatis This SQL map does not contain a MappedStatement
  10. 运行SQL文件时报Lost connection to MySQL server during query
  11. Python 爬取 42 年高考数据,告诉你高考为什么这么难?
  12. python包管理工具ports_如何从自制程序,分发,macports,pip卸载所有软件包?
  13. 分享非常宝贵的工作经
  14. java实现23种设计模式之普通工厂模式和抽象工厂模式
  15. MacOS Ventura 13.0 Beta4 (22A5311f) 带 OC 0.8.3 / Cl 5148 / PE 三分区原版黑苹果镜像
  16. python软件要钱吗-python语言是免费还是收费的?
  17. VS2013打包Windows程序部署教程
  18. for循环里面的break;和continue;语句
  19. 【肆】财务自由的三大核心工具
  20. 周易六十四卦——豫卦

热门文章

  1. 常见排序算法:希尔排序
  2. 【数据结构】顺序栈与链表栈
  3. kill session-KILL_SESSION()
  4. 我的技术博客在博客园落户了
  5. ubuntu共享无线链接
  6. ABAP算术运算函数
  7. abap CA CO CS等操作符
  8. SAP SMARTFORMS 之由竖打向横打的转换
  9. 使ALV控件中的内容可编辑
  10. SAP 4.6C升级ECC6.0 WS_QUERY 的改法