jvm主要由三个子系统构成:类加载子系统,运行时数据区,执行引擎

运行时数据区主要包括:

1.本地方法栈:登记native方法,执行时加载本地方法库

2.程序计数器:就是一个指针,用来存储指向下一条执行指令的地址,也就是即将要执行的指令代码,是一个非常小得空间,可以忽略不计。

3.java栈:java线程执行方法的内存模型,一个线程对应一个栈,每个方法在执行时都会创建一个栈帧,用于存储局部变量表(引用),操作数栈,动态链接,方法出口等信息,不存在垃圾回收问题,生命周期和线程一致,线程结束该栈就释放。可以通过-Xss来设置栈空间。

4.方法区:类的所有字段和方法字节码,以及一些特殊的方法,构造函数,接口定义,所有定义的方法的信息都存放在这。此外还包括静态变量,常量,运行时常量池

5.java堆:虚拟机启动时创建,用于存放对象实例,几乎所有的对象都在堆上面分配内存,当对象无法在该空间申请到内存就会抛出OutMemoryError异常,同时也是垃圾回收器主要管理的区域,可以通过-Xmx/Xms来设置最大/最小堆

其中1.2.3都是线程私有,4.5线程共享

线程私有java栈图解:

java堆详解:

新生代:类诞生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集,结束生命。

新生代分为两部分: 伊甸园区(Eden space:亚当,夏娃造人,这名字取得还是很有意义的)和幸存者区(Survivor pace) ,所有的类都是在伊甸园被new出来的。幸存区有两个: 0区(Survivor 0 space(From))和1区(Survivor 1 space(To))。当伊甸园的空间用完时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。然后将伊甸园中的剩余对象移动到幸存From。若幸From也满了,再对该区进行垃圾回收,然后移动到To。From到To操作一次,还存在To中的对象就相当于长了一岁,默认是15岁,如果到了15岁都还存在有引用,那么就放入老年代,可以用过-XX:MaxTenuringThreshold来设置这个年龄

老年代:新生代经过多次GC仍然存活的对象移动到老年区。若老年区也满了,那么这个时候将产生FullGC,进行老年区的内存清理。若老年区执行了Full GC之后发现依然无法进行对象的保存,就会产生OOM异常“OutOfMemoryError”。可以同过减少FullGC来提高jvm性能

永久代(元数据):jdk1.8元数据区取代了永久代,本质和永久代类似,都是对JVM规范中方法区的实现,区别在于元数据区并不在虚拟机中,而是使用本地物理内存,永久代在虚拟机中,永久代逻辑结构上属于堆,但是物理上不属于堆,堆大小=新生代+老年代。元数据区也有可能发生OutOfMemory异常。

Jdk1.6及之前: 有永久代, 常量池在方法区

Jdk1.7:有永久代,但已经逐步“去永久代”,常量池在堆

Jdk1.8及之后: 无永久代,常量池在元空间

元数据区的动态扩展,默认–XX:MetaspaceSize值为21MB的高水位线。一旦触及则Full GC将被触发并卸载没有用的类(类对应的类加载器不再存活),然后高水位线将会重置。新的高水位线的值取决于GC后释放的元空间。如果释放的空间少,这个高水位线则上升。如果释放空间过多,则高水位线下降。

使用-XX:+PrintGCDetails参数打印GC日志,运行下面代码:

package jvm;

/**

* @author: create by nijunyang

* @date:2019/6/19

*/

public class Test {

public static void main(String[] args)

{

byte[] bytes1 = new byte[62000*1024];

byte[] bytes2 = new byte[10240*1024];

byte[] bytes3 = new byte[30000*1024];

// byte[] bytes4 = new byte[28000*1024];

// byte[] bytes5 = new byte[10240*1024];

}

}

可以看到伊甸园区只有65536K,byte1->62000K 大对象被直接移入了老年代,因为 Survivor区大小无法存放该对象,所以在yong gc的时候直接将该对象放入老年代,

我们也可以通过设置-XX:PretenureSizeThreshold= 60000,使得创建大于60000字节的对象直接放入老年代。但是该参数只在Serial 和ParNew两个垃圾收集器下面生效

byte2,byte3依然在伊甸园

放开bytes4之后会发现From区也有占用了99%,差不多就是bytes2的大小,说明bytes2移入了From,byte3也移入了老年代(byte1+byte3 = 92000K)

java内存高水位_jvm(1)---java内存结构相关推荐

  1. java 内存回收参数_JVM常用参数(内存分配 内存回收日志)(七)

    内存监控 -verbose:gc 测试代码 public static voidmain(String[] args){ List classes=new ArrayList();int count= ...

  2. java文件解析器_jvm:java类文件结构(字节码文件的解析)

    1.java虚拟机简介 不是只有java编译器才能完成java程序到字节码的编译过程 (2)定义 java二进制字节码的运行环境 (3)好处 一次编写,到处运行的基础 自动内存管理,垃圾回收功能,大大 ...

  3. java工资高还是php_为什么java比php工资高啊?

    1.语言难易比较 PHP是一种解释执行的脚本语言,语法和C语言类似,易学易用,不懂电脑的非专业人员稍经学习也能使用PHP.而Java要先编译成Class文件,然后在Java虚拟机上执行,Java开发需 ...

  4. java 老年代 占用空间_JVM之堆内存(年经代,老年代)

    一.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...

  5. linux java运行class文件_jvm学习java文件运行过程

    汇编 汇编的目的是把汇编语言转为机器语言. 链接 链接是要解决目标文件之间的互相依赖关系,当a文件中的aa方法中调用了b文件的bb方法时,在汇编完成后,a文件的bb方法并没有准确的内存地址,链接后会转 ...

  6. python工资高还是java-Python工资高还是Java工资高?Python和Java学哪个?

    与Python相比,Java是一种非常严格的类型语言,必须要显示声明变量名. 对于很多想学编程的同学来说,应该会很纠结学哪门语言吧.昨天,就有同学在后台问小编:Python工资高还是Java?不如来看 ...

  7. PHP的开发效率比java要高,为什么现在java这么流行?

    PHP和Java谁的开发效率高,这个问题看从什么角度看,不能一概而论.实际上两种语言我都略懂,避免被喷,我还是先声明一下:PHP是最好的语言. 单纯从语言层面上比较PHP和Java没有意义,需要放到项 ...

  8. 自学java成功率高吗,为什么自学Java编程成功率那么低?

    自学Java编程平均成功率只有24%.其中,大部分自学连Java基础都还没有掌握好,便放弃了.为什么会如此呢?难道自学就真的那么难? 实际上,自学最大的问题无外乎没有学习氛围.没有专业辅导,因为没有学 ...

  9. java 抽奖 高并发_【java】如何设计高并发下的抽奖?

    我写的伪代码如下,但出现了个bug,抽奖现在要限制每日抽奖结果出现的次数,但实际运行是在并发时不能限制住,如何解决? resultDayLimitTimes = { resultA => 2 # ...

最新文章

  1. RNA-Seq Transcriptome Profiling Identifies CRISPLD2 as a Glucocorticoid Responsive Gene that Modulat
  2. c++可达矩阵及连通性_3.9秒破百,矩阵式LED大灯加持,这台国产车可真香
  3. 3 - SQL Server 2008 之 使用SQL语句删除约束条件
  4. css 竖行进度图_css实现横向与竖向进度条效果的方法
  5. Qt工作笔记-使用qrand与QTime产生随机数
  6. 烂泥:高负载均衡学习haproxy之安装与配置
  7. Linux安装mysql(解决E: Package ‘mysql-server‘ has no installation candidate与ERROR 1698 (28000))
  8. Node.js格式化输出json文件
  9. 分享安卓SD卡的后台设置
  10. STVP提示The device is protected解决方法
  11. 设置单行省略的时候在搜狗浏览器里面导致页面布局紊乱
  12. Pwned Vulnhub
  13. RAC环境诊断案例一则
  14. 数据库一对一、一对多、多对多关系
  15. Power BI中计算同比、环比
  16. 社区发现算法中模块化度量值Q(Modularity)的计算
  17. 华为mate50pro和华为mate50RS的区别
  18. SAXReader saxReader = new SAXReader();来解析xml文件
  19. Android6.0源码解读之ViewGroup点击事件分发机制
  20. Python环境搭建—安利Python小白的Python和Pycharm安装详细教程

热门文章

  1. oracle一体机高水位,oracle 移动高水位:
  2. php网站xml链接,xml图像超链接的制作代码
  3. php性能需求,PHP语言性能考察
  4. java 擦出,Java擦除和转换实例分析
  5. 20220201--CTF刷题MISC方向--第5题
  6. python进阶教程day_python从零进阶之路——day4
  7. Spring------自动化装配Bean(一)
  8. scala的多种集合的使用(6)之映射Map的操作方法
  9. linux日常管理-防火墙selinux
  10. Takeown--夺取文件or文件夹所有权