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内存结构(栈、堆、永久代)的更多相关文章

  1. JVM内存结构之堆、栈、方法区以及直接内存、堆和栈区别

    JVM内存结构之堆.栈.方法区以及直接内存.堆和栈区别 一.  理解JVM中堆与栈以及方法区 堆(heap):FIFO(队列优先,先进先出):二级缓存:*JVM中只有一个堆区被所有线程所共享:对象和数 ...

  2. 性能测试三十六:内存溢出和JVM常见参数及JVM参数调优

    堆内存溢出: 此种溢出,加内存只能缓解问题,不能根除问题,需优化代码堆内存中存在大量对象,这些对象都有被引用,当所有对象占用空间达到堆内存的最大值,就会出现内存溢出OutOfMemory:Java h ...

  3. JVM内存结构、参数调优和内存泄露分析

    1. JVM内存区域和参数配置 1.1 JVM内存结构 Java堆(Heap) Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都 ...

  4. JAVA内存模型与JVM内存结构

    问题:什么事java内存模型? 首先呢不要答堆.栈.方法区.这是JVM的内存结构.下面阐述了JMM和JVM的区别和自己对JMM的见解 1.Java内存模型(JMM):即多线程相关的.定义了一个线程对另 ...

  5. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  6. 基于JDK1.8的JVM 内存结构【JVM篇三】

    目录 1.内存结构还是运行时数据区? 2.运行时数据区 3.线程共享:Java堆.方法区 4.线程私有:程序计数器.Java 虚拟机栈.本地方法栈 5.JVM 内存结构总结 在我的上一篇文章别翻了,这 ...

  7. 区分 JVM 内存结构、 Java 内存模型 以及 Java 对象模型 三个概念

    本文由 简悦 SimpRead 转码, 原文地址 https://www.toutiao.com/i6732361325244056072/ 作者:Hollis 来源:公众号Hollis Java 作 ...

  8. jvm:内存结构(堆、方法区、程序计数器、本地方法栈、虚拟机栈)

    1.jvm内存结构 静态编译:把java源文件编译成字节码文件class,这个时候class文件以静态方式存在. 类加载器:把java字节码文件加载到内存中 方法区:将字节码放到方法区作为元数据(简单 ...

  9. “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

随机推荐

  1. 特征选取1-from sklearn.feature_selection import SelectKBest

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  2. MySQL_异常

    问题1 描述:在连接MYSQL数据库时出现问题:“ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)” 分 ...

  3. centos7环境下开启指定端口

    参考原博:https://www.cnblogs.com/eaglezb/p/6073739.html 查看已经开放的端口: firewall-cmd --list-ports 开启端口 firewa ...

  4. Simple Sort

    题目描述 You are given an unsorted array of integer numbers. Your task is to sort this array and kill po ...

  5. VMware WorkStation9.0 安装centos-6.4

    1,设置虚拟机内存为8G时,启动报内存不足错误: Not enough physical memory is available to power on this virtual machine 解决 ...

  6. ueditor 百度编辑器,自定义右键菜单

    如图:有2种自定义方法,一种是改源码,一种是初始化 初始化,如下代码: var ue = UE.getEditor('XXXid',{ // contextMenu:[ {label:'', cmdN ...

  7. charCodeAt() 和charAt()

    charAt() 方法可返回指定位置的字符. charCodeAt() 方法可返回指定位置的字符的 Unicode 编码.这个返回值是 0 - 65535 之间的整数. 方法 charCodeAt() ...

  8. luogu P3304 [SDOI2013]直径

    树的直径两遍dfs救星了 至于一定在直径中的边数,可以发现这些边一定是连续的(不然你两条直径中间能有空挡?),然后,如果某个点往下有多条直径,那么这条点以下都不算入答案.所以以直径分别两端点为根,找出 ...

  9. POJ1258 Agri-Net【最小生成树】

    题意: 有n个农场,已知这n个农场都互相相通,有一定的距离,现在每个农场需要装光纤,问怎么安装光纤能将所有农场都连通起来,并且要使光纤距离最小,输出安装光纤的总距离. 思路: 又是一个最小生成树,因为 ...

  10. 字符加密 Valentino 函数 (伪分治)

    题面 \(solution:\) 这一题重点不在字符串加密,而是我们最后的求值:\(K^{s}\mod M\)(\(s\leq36^{100000}\)) 而我们发现它的指数十分巨大,但众所周知的指数 ...