博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jvm
阅读量:4317 次
发布时间:2019-06-06

本文共 1008 字,大约阅读时间需要 3 分钟。

内存模型

《深入理解java虚拟机》

 

 

包括新生代和老年代,不包括元数据区

在Minor GC时会将新生代中还存活着的对象复制进一个Survivor中,然后对Eden和另一个Survivor进行清理。所以,平常可用的新生代大小为Eden的大小+一个Survivor的大小 S0=S1

分配担保机制:当Minor GC时,新生代存活的对象大于Survivor的大小时,这时一个Survivor装不下它们,那么它们就会直接进入老年代

new大对象 ?

 

GC经验值:

Minor GC 执行快 (50 ms内). 

Minor GC 执行不频繁 (大概10s 执行一次). 
Full GC 执行快 (1 second内). 
Full GC 执行不频繁 (10 minutes 一次).

 

非堆==方法区

  只包含Metaspace/Perm

存放类的方法和名称等 静态数据

非堆也会出发GC (哪种GC?)

 

设置非堆的大小

  • -XX:MinMetaspaceFreeRatio 扩大空间的最小比率,当GC后,内存占用超过这一比率,就会扩大空间
  • -XX:MaxMetaspaceFreeRatio 缩小空间的最小比率,当GC后,内存占用低于这一比率,就会缩小空间

 

直接内存区

非堆的一部分?

netty应用, MaxDirectMemorySize可能较大

 

虚拟机栈

jvm以栈帧为单位保存线程的运行状态。每当启动一个新线程时 java虚拟机都会为它分配一个java栈。

虚拟机只会对java栈执行两种操作:以栈帧为单位的压栈或者出栈。也就是说个数由线程的上线决定。

还有就是栈帧由三部分组成的,局部变量区,操作数栈和帧数据区。 局部变量区和操作数栈要视对应的方法而定,它们是按照字长计算的。

栈深度与栈帧大小(变量多少, 方法的长度)有关, 可以在启动时使用Xss设置栈帧大小, 越小时栈深度越大 stackOverflowException出现的概率越小

线程引用多个栈帧,栈帧中的操作数区引用堆中的对象

 

 

 

 

其它总结:

常见的是老年代比新生代大, 但是某些应用场景新生代可能比老年代大

非堆也可能比堆大的多,  一个反面例子是metaspace没有限制

直接内存看应用场景:如果是做文件服务器, 视频流.... , 这块可以设置大些

 

转载于:https://www.cnblogs.com/yszzu/p/9246340.html

你可能感兴趣的文章
初始化 Flask 虚拟环境 命令
查看>>
脚本简介jQuery微信开放平台注册表单
查看>>
将PHP数组输出为HTML表格
查看>>
Java中的线程Thread方法之---suspend()和resume() 分类: ...
查看>>
经典排序算法回顾:选择排序,快速排序
查看>>
BZOJ2213 [Poi2011]Difference 【乱搞】
查看>>
c# 对加密的MP4文件进行解密
查看>>
Flask 四种响应类型
查看>>
AOP面向切面编程C#实例
查看>>
怎么让win7右下角只显示时间不显示日期 ?(可行)
查看>>
AngularJs学习笔记-慕课网AngularJS实战
查看>>
数据库三大范式
查看>>
工作总结之二:bug级别、优先级别、bug状态
查看>>
访问修饰符、封装、继承
查看>>
更换pip源到国内镜像,提升pip下载速度.
查看>>
POJ 2265 Bee Maja (找规律)
查看>>
Kendo MVVM 数据绑定(七) Invisible/Visible
查看>>
DB Intro - MySQL and MongoDB
查看>>
Practical Mathematical Handwriting
查看>>
[zz]kvm环境使用libvirt创建虚拟机
查看>>