淘优惠

淘优惠

javajvm内存管理 java 方法区

热门文章 0
javajvm调优有几种方法,javajvm是什么,javaJVM

在进入主题前,我们先了解一些相关的知识,方面后面对运行时数据区进行分类。

进程中,有很多数据是多线程之间共享的,线程在执行时,会先从主存中读取数据,然后复制一份到高速缓存中,当计算完后,再刷新到主存中。

我们只要找到独属于线程的资源,那么其他的资源都是线程共享的,线程运行的本质就是函数的执行,函数运行时的信息保存在栈帧中,栈帧中保存了函数的返回值、调用其它函数的参数、java方法、局部变量、操作数栈、动态链接、方法出口、寄存器信息等。除了这个栈帧里面的信息,其他信息都是共享的,据此,我们先画个图,运行时数据区(Runtime Data Area)大致可以分成以下几个区域

Java运行时数据区(Runtime Data Area)是指在Java程序执行期间,Java虚拟机所管理的诸多内存区域(分别用于存储不同的数据),如上图所示,包含了以下几个部分:

  1. 堆区
  2. 栈区
  3. 方法区
  4. 程序计数器

该区域是一个共享区,主要用于存储对象实例、数组.

Java堆是虚拟机管理的内存中最大的一块区域,jvm只有一个堆区,在虚拟机启动时创建,被所有线程共享,堆是gc管理堆主要区域。

jvm堆一般分为三部分: 新生代,老年代,永久代(元空间)

永久代java8已经被元空间取代。

用来存放新生的对象,占据堆的1/3空间

如果新创建的对象占用内存很大,则直接分配到老年代。(当老年代也满了装不下的时候,就会抛出OOM异常。)

老年代的对象比较稳定,所以MajorGC不会频繁执行。

在进行MajorGC前一般都先进行了一次MinorGC, 使得有新生代的对象晋身入老年代,导致空间不够用时才触发。 当无法找到足够大的连续空间分配给新创建的较大对象时 也会提前触发一次MajorGC进行垃圾回收腾出空间。

指内存的永久保存区域,主要存放Class和Meta(元数据)的信息。

Class在被加载的时候被放入永久区域。类的元数据放入 nati【【微信】】, 字符串池和类的静态变量放入java堆中。

永久代(元空间)和和存放实例的区域不同,GC不会在主程序运行期对永久区域进行清理。所以这也导致了永久代的区域会随着加载的Class的增多而胀满,最终抛出OOM异常。

在Java8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。

元空间的本质和永久代类似,都是对JVM规范中方法区的实现。

元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。

这样可以加载多少类的元数据就不再由MaxPermSize控制,而由系统的实际可用空间来控制。

虚拟机栈:java方法、局部变量、操作数栈、动态链接、方法出口等。

本地方法栈:native方法

栈帧

栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。简言之,栈帧就是利用EBP(栈帧指针,请注意不是ESP)寄存器访问局部变量、参数、函数返回地址等的手段。

关于本地方法栈和Java栈,在Java虚拟机规范中定义了两种异常。

线程的请求栈的深度大于虚拟机所允许的深度,将抛出StackO【【微信】】异常虚拟机在扩展栈时无法申请到足够的内存时,将抛出OutOfMemoryError异常每次函数调用都会生成对应的栈帧,从而占用一定的内存

线程共享的内存区域,主要用于存储类型信息、常量、静态变量、即时编译代码等

CPU在执行程序时,需要有一个地方存放下一条要被取走指令的位置,这是一个寄存器,cpu中只有一个程序计数器。虚拟机字节码指令的地址或undefined

每个线程都有私有(独立)的程序计数器。

线程中的程序计数器可以理解为一段内存,用来保存当前线程执行到的位置,因为系统采用时间片轮转的方法,所以一个线程不可能一直占用CPU,只能执行规定时间,进行线程切换,这里就需要有一个私有的线程计数器,也就是本地计数器,来保存当前线程的执行到的位置,等到下一次再从这个位置继续执行。

在多线程场景下,CPU会出现缓存一致性问题,处理器重新排序问题,

为了解决这个问题,制定了计算机内存模型。(原子性、可见性、有序性)即是Java语言对这个操作规范的遵循,

JMM规定了所有的变量都存储在主存中,每个线程都有自己的工作区,线程将使用到的变量从主存中复制一份到自己的工作区,线程对变量的所有操作(读取、赋值等)都必须在工作区,不同的线程也无法直接访问对方工作区,线程之间的消息传递都需要通过主存来完成。可以把这里主存类比成计算机内存模型中的主存,工作区类比成计算机内存模型中的高速缓存。

?



java面向对象编写超市购物小程序 java编写一个超市购物的程序

java面向对象编程实例,java面向对象简单例子,使用java实现面向对象编程第七章上机,使用java实现面向对象编程的总结
弹性计算-百晓生
技术分享 | 如何基于阿里云AIACC加速【【微信】】绘画
AIACC是基于阿里云IaaS资源推出的神龙AI性能加速套件,用于优化基于AI主流计算框架搭建的模型,能显著提升训练和推理性能。AIACC神龙AI推理加速套件由【【微信】】(Pytorch推理加速引擎)、【【微信】】(MLIR推理加速引擎)、【【微信】】(AIACC算子深度加速引擎)等组件构成。AIACC神龙AI性能加速套件能够为【【微信】】提供加速优化支持,在512x512分辨率下,可将单张图片的延迟从2秒降低至0.88秒,吞吐提速至原来的2.2倍。
23036
丶重明
一份很详细的Python语言基础
一份很详细的Python语言基础
30018
TiAmoZhang
HTML5 游戏开发实战 | 五子棋
五子棋是一种家喻户晓的棋类游戏,它的多变吸引了无数的玩家。本章首先实现单机五子棋游戏(两人轮流下),而后改进为人机对战版。整个游戏棋盘格数为 15×15,单击鼠标落子,黑子先落。在每次下棋子前,程序先判断该处有无棋子,有则不能落子,超出边界不能落子。任何一方有横向、竖向、斜向、反斜向连到 5 个棋子则胜利。
23157
长沙红胖子Qt
统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序
在【【微信】】上发布qt程序相对还好,使用脚本,但是在统信UOS麒麟上发布的时候,因为银河麒麟等不同版本,使用脚本就不太兼容,同时为了实现直接点击应用可以启动应用的效果,使用linuxdeployqt发布qt程序。
26427
倚天架构-张先国
Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
29475
弹性计算-百晓生
全面解析 | 大模型时代如何利用弹性计算服务应对大算力挑战
2023年6月20日,阿里云弹性计算团队与智东西公开课联合出品的系列课程「阿里云弹性计算技术公开课」正式播出,阿里云弹性计算产品专家张新涛作为该系列课程首位主讲人,带来了主题为《大模型时代如何应对大算力挑战》的课程分享,本次课程也在阿里云官网、钉钉视频号、阿里云官方视频号、阿里云开发者视频号、阿里云创新中心直播间&视频号等多平台同步播出。
18233
阿里开发者
这些年在阿里学到的方法论
本文从做事方法、思维方式、目标管理、数据分析、用户增长几方面介绍了相关的方法论,希望能给读者带来一些帮助!
17314
江上清风山间明月
Flutter数据库操作看这一篇就够了
Flutter数据库操作看这一篇就够了
16111
激流丶
深入浅出设计模式 - 代理模式
深入浅出设计模式 - 代理模式
11592
timerring
神经网络入门基础知识
神经网络入门基础知识
16613
坐落于亚洲之东方
C++基础入门教程(1)
C++基础入门教程(1)
23122
远方并不远。
SpringBoot bean自动装配原理,这一篇就够了! 1
SpringBoot bean自动装配原理,这一篇就够了!
5747
远航探索
深入理解Vue中的异步更新机制和$【【微信】】方法
在Vue开发中,我们经常会遇到需要在 DOM 更新完成后执行某些操作的情况。为了解决这个问题,Vue提供了`$【【微信】】`方法,它可以让我们在下次 DOM 更新完成后执行回调函数。本文将深入探讨Vue的异步更新机制、`$【【微信】】`的原理和使用场景,以及分别在 Vue2.x 与 Vue3.x 中的相同点和区别。
12052
一只正
《网络安全0-100》网络安全工具
《网络安全0-100》网络安全工具
23103
耿记磊
关于“重构”的一些思考
本文将从一个新人数次修改CR comments的角度探讨代码重构的定义、目的以及常见的重构方法,并以简单的代码案例来说明代码重构的具体实现。
4518

..天猫互助群2023微信群怎么进去,天猫互助群2023微信群怎么进去,免费助力群2023,我们的2023 天猫618 狂欢盛典天猫活动互助群微信群怎么进是一个关于2023年 618天猫狂欢盛典游戏的社群,大家分享游戏攻略、游戏心得。加入我们,互相助力