性能测试三十四:jvm内存结构(栈、堆、永久代)
Java内存管理机制
Java采用了自动管理内存的方式
Java程序是运行在Jvm之中的
Java的跨平台的基于Jvm的跨平台特性
内存的分配和对象的创建是在Jvm中
用户可以通过一系列参数来配置Jvm
Jvm运行时区域
做性能测试经常接触到的三个地方:方法区、虚拟机栈、堆

jvm主要内存结构(简化版):
永久代即上面的方法区
占用内存大小排序:堆内存 > 永久代 > 栈内存

一:栈内存(虚拟机栈)
特点:
1、线程私有
每个线程都有一块自己独有的内存,如果有10个线程,则会产生10个栈内存,100个线程则100个栈内存
2、生命周期和线程相同
线程的生命周期:当执行到main方法的时候,就会给这个线程分配一块栈内存,然后这个main方法会一直拥有这块内存,当main方法里面的代码执行完毕,线程就结束了,分配的这块内存就被回收了

3、主要存放内容
1.基本数据类型(int,char,float,double…)
2.对象的引用,指向了对象在堆内存中起始地址,凡是定义的变量和new的对象的变量,都在栈内存里面放着

3.通过-Xss参数配置
因为机器内存是固定的,所以如果这个参数配的越大,就导致并发线程数越少(如内存1G,每个线程配1M,则最多只能起1024个线程),所以一般栈内存的单位是K,如128K、256K都可以,取决于线程里面代码的长度,代码越长就需要越多的内存
二:堆内存-heap
堆内存构成
新生代:包括三块区域,eden、from survivor(s0)、to survivor(s1)
老年代:old gen
Object o = new Object()
其中,o存放在栈内存中,new Object()存放在堆内存中,变量o是Object对象的引用,o上存放了Object对象占用内存的起始地址
1.堆内存是Jvm中空间最大的区域
2.所有线程共享堆
3.所有的数组以及内存对象的实例都在此区域分配
4.堆内存大小通过参数进行配置
-Xmx:最大堆内存
-Xms:最小堆内存
堆内存是公有的,存放真正的对象,因为真正的对象有很多属性和信息,比较大,而栈内存比较小,所以放在堆内存中


New generation:新生代 / 年轻代
新创建的对象,就放在eden区里面,当多线程运行起来以后,每秒钟都会有大量的对象被创建,而eden的容量有限,总有被放满的时候,当eden区满之后,会扫描eden+s0或者eden+s1,看有没有还存活(有用的,代码还没执行完,需要用到)的对象(这里以eden+s1为例),扫描完成后,会把eden+s1里面还有用的、存活着的对象复制到s0里面,并清空eden+s1,达到释放内存的目的,此时eden区任然每秒钟会产生大量的对象,过一段时间又会满,此时,s1是空的,则会扫描eden+s0,将eden+s0里面还存活的对象复制到s1里面,清空eden+s0······一直如此循环,所以s0和s1永远有个区域是空的,用于准备存放存活着的对象
如果以10为单位的话,一般eden:s0:s1的比例是8:1:1
Old generation:老年代生代 / 老生代
由于eden+s0/s1占了9/10,而要把存活下来的对象放到s0/s1,也就是说要把9/10里面的一部分放到1/10的空间里面,所以很有可能放不下,这个时候,新生代里面的空间已经不足了,所以会把存活的对象放到老年代里面,清空整个新生代空间(eden+s0+s1)
在新生代做迭代扫描的时候,会给每个对象打个标记,当同一个对象的标记达到15次都还是存活状态,则此对象不再参与新生代的迭代,直接放到老年代空间(如,jmeter运行5分钟,脚本里面的前置条件,则会存活5分钟到结束才失效)
所以老年代里面放的都是长期有效的对象
当老年代空间也满的时候,会触发一次整个堆内存的清理(新生代+老年代),同样的,把有用的对方放在老年代,其他空间全部清空,达到释放空间的目的
三:永久代-PermGen(方法区)(jdk1.8以后叫元空间)
永久代也叫(Method Area):
只要程序一运行起来,永久代里面的数据就已经固定了,比如一个类里面,定义了多少静态变量、常量,是固定的
各线程共享,主方法区要存放类信息、常量、静态变量,如:public static int a = 10
永久代里面放的都是些固定的、不变的数据,所以垃圾回收行为比较少见,当进程结束的时候,才做回收操作
Jvm结构总结
年轻代 = Eden+Survivor
Survivor = From Space(s0) + To Space(s1)
年轻代 = Eden+From Space+To Space
堆内存 = 年轻代+老年代
堆内存=Eden+From Space+To Space+老年代
jvm=栈+堆+永久代
性能测试三十四:jvm内存结构(栈、堆、永久代)的更多相关文章
- JVM内存结构之堆、栈、方法区以及直接内存、堆和栈区别
JVM内存结构之堆.栈.方法区以及直接内存.堆和栈区别 一. 理解JVM中堆与栈以及方法区 堆(heap):FIFO(队列优先,先进先出):二级缓存:*JVM中只有一个堆区被所有线程所共享:对象和数 ...
- 性能测试三十六:内存溢出和JVM常见参数及JVM参数调优
堆内存溢出: 此种溢出,加内存只能缓解问题,不能根除问题,需优化代码堆内存中存在大量对象,这些对象都有被引用,当所有对象占用空间达到堆内存的最大值,就会出现内存溢出OutOfMemory:Java h ...
- JVM内存结构、参数调优和内存泄露分析
1. JVM内存区域和参数配置 1.1 JVM内存结构 Java堆(Heap) Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都 ...
- JAVA内存模型与JVM内存结构
问题:什么事java内存模型? 首先呢不要答堆.栈.方法区.这是JVM的内存结构.下面阐述了JMM和JVM的区别和自己对JMM的见解 1.Java内存模型(JMM):即多线程相关的.定义了一个线程对另 ...
- [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义
前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine ,既然是虚拟机, ...
- 基于JDK1.8的JVM 内存结构【JVM篇三】
目录 1.内存结构还是运行时数据区? 2.运行时数据区 3.线程共享:Java堆.方法区 4.线程私有:程序计数器.Java 虚拟机栈.本地方法栈 5.JVM 内存结构总结 在我的上一篇文章别翻了,这 ...
- 区分 JVM 内存结构、 Java 内存模型 以及 Java 对象模型 三个概念
本文由 简悦 SimpRead 转码, 原文地址 https://www.toutiao.com/i6732361325244056072/ 作者:Hollis 来源:公众号Hollis Java 作 ...
- jvm:内存结构(堆、方法区、程序计数器、本地方法栈、虚拟机栈)
1.jvm内存结构 静态编译:把java源文件编译成字节码文件class,这个时候class文件以静态方式存在. 类加载器:把java字节码文件加载到内存中 方法区:将字节码放到方法区作为元数据(简单 ...
- “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
随机推荐
- centos6.5环境下安装zk
第一步:先下载安装包,解压. 第二步:进去根目录,创建data文件夹 mkdir data 第三步:进去conf文件夹,修改 zoo_sample.cfg 的名字 mv zoo_sam ...
- UVALive 4254 Processor(二分)
题目链接 题意 有n个任务,每个任务有三个参数ri,di和wi,表示必须在时刻[ri,di]之内执行,工作量为wi.处理器执行速度可以变化,当执行速度为s时,工作量为wi.处理器的速度可以变化,当执行 ...
- WebSocket 实战之——【WebSocket 原理】
一.WebSocket是什么? HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算). 首先HTTP有1.1和1.0之说,也就 ...
- 02-里氏替换原则(LSP)
1. 背景 有一个功能p1,由类A完成,现在需要将功能p1进行扩展,扩展后的功能为p3,p3由原功能p1和新功能p2组成,而新功能p3和p2均由类A的子类B来完成,子类B在完成新功能p2的同时,可能会 ...
- Java基础其他
1. 二进制 进制就是进位制,常见的有二进制.十进制.十六进制等 在进制中,可用符号的数量称为基数,基数为n就称为n进制,逢n进一位: 二进制:0 1 十进制:0 1 2 3 4 5 6 7 8 9 ...
- linux4.10.8 内核移植(四)---字符设备驱动_led驱动程序
一.字符设备驱动程序介绍 app里面用 open.read.write等等函数出来操作底层硬件.驱动程序中也有对应的xxx_open等函数.怎么找到驱动程序中的函数依赖于驱动程序框架. 二.搭建驱动程 ...
- centos7 redmine安装过程
mysql安装配置 redmine 部署过程 redmin官方文档写的太烂加上不熟悉ruby搞了半天,回到家后觉得还是记录下好,希望可以帮助有需要的人,少走弯路. 版本说明 下面的版本很重要re ...
- tessaract ocr简介
Tesseract的历史Tesseract是一个开源的OCR引擎,惠普公司的布里斯托尔实验室在1984-1994年开发完成.起初作为惠普的平板扫描仪的文字识别引擎.Tesseract在1995年UNL ...
- OpenCV入门(2)- Java第一个程序
1.下载和安装OpenVC环境 从官方连接 https://opencv.org/releases.html 下载Windows的安装包 下载下来的就是一个压缩包,安装解压后,对Java开发有效的目录 ...
- C++ vector 使用笔记
map 插入 vector #include <string> #include <iostream> #include <algorithm> #include ...