java内存高水位_jvm(1)---java内存结构
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内存结构相关推荐
- java 内存回收参数_JVM常用参数(内存分配 内存回收日志)(七)
内存监控 -verbose:gc 测试代码 public static voidmain(String[] args){ List classes=new ArrayList();int count= ...
- java文件解析器_jvm:java类文件结构(字节码文件的解析)
1.java虚拟机简介 不是只有java编译器才能完成java程序到字节码的编译过程 (2)定义 java二进制字节码的运行环境 (3)好处 一次编写,到处运行的基础 自动内存管理,垃圾回收功能,大大 ...
- java工资高还是php_为什么java比php工资高啊?
1.语言难易比较 PHP是一种解释执行的脚本语言,语法和C语言类似,易学易用,不懂电脑的非专业人员稍经学习也能使用PHP.而Java要先编译成Class文件,然后在Java虚拟机上执行,Java开发需 ...
- java 老年代 占用空间_JVM之堆内存(年经代,老年代)
一.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...
- linux java运行class文件_jvm学习java文件运行过程
汇编 汇编的目的是把汇编语言转为机器语言. 链接 链接是要解决目标文件之间的互相依赖关系,当a文件中的aa方法中调用了b文件的bb方法时,在汇编完成后,a文件的bb方法并没有准确的内存地址,链接后会转 ...
- python工资高还是java-Python工资高还是Java工资高?Python和Java学哪个?
与Python相比,Java是一种非常严格的类型语言,必须要显示声明变量名. 对于很多想学编程的同学来说,应该会很纠结学哪门语言吧.昨天,就有同学在后台问小编:Python工资高还是Java?不如来看 ...
- PHP的开发效率比java要高,为什么现在java这么流行?
PHP和Java谁的开发效率高,这个问题看从什么角度看,不能一概而论.实际上两种语言我都略懂,避免被喷,我还是先声明一下:PHP是最好的语言. 单纯从语言层面上比较PHP和Java没有意义,需要放到项 ...
- 自学java成功率高吗,为什么自学Java编程成功率那么低?
自学Java编程平均成功率只有24%.其中,大部分自学连Java基础都还没有掌握好,便放弃了.为什么会如此呢?难道自学就真的那么难? 实际上,自学最大的问题无外乎没有学习氛围.没有专业辅导,因为没有学 ...
- java 抽奖 高并发_【java】如何设计高并发下的抽奖?
我写的伪代码如下,但出现了个bug,抽奖现在要限制每日抽奖结果出现的次数,但实际运行是在并发时不能限制住,如何解决? resultDayLimitTimes = { resultA => 2 # ...
最新文章
- RNA-Seq Transcriptome Profiling Identifies CRISPLD2 as a Glucocorticoid Responsive Gene that Modulat
- c++可达矩阵及连通性_3.9秒破百,矩阵式LED大灯加持,这台国产车可真香
- 3 - SQL Server 2008 之 使用SQL语句删除约束条件
- css 竖行进度图_css实现横向与竖向进度条效果的方法
- Qt工作笔记-使用qrand与QTime产生随机数
- 烂泥:高负载均衡学习haproxy之安装与配置
- Linux安装mysql(解决E: Package ‘mysql-server‘ has no installation candidate与ERROR 1698 (28000))
- Node.js格式化输出json文件
- 分享安卓SD卡的后台设置
- STVP提示The device is protected解决方法
- 设置单行省略的时候在搜狗浏览器里面导致页面布局紊乱
- Pwned Vulnhub
- RAC环境诊断案例一则
- 数据库一对一、一对多、多对多关系
- Power BI中计算同比、环比
- 社区发现算法中模块化度量值Q(Modularity)的计算
- 华为mate50pro和华为mate50RS的区别
- SAXReader saxReader = new SAXReader();来解析xml文件
- Android6.0源码解读之ViewGroup点击事件分发机制
- Python环境搭建—安利Python小白的Python和Pycharm安装详细教程