JVM学习系列:了解JVM options参数配置 & 看懂GC日志
摘要
java有内置的垃圾回收器做内存回收,通过强引用、软引用、弱引用和虚引用给对象做"标记",告诉垃圾回收器在什么时机回收什么内存。我先通过JVM options参数探测JVM内部不同垃圾回收的策略。
JVM初始参数
- minimum size of heap:10MB
- maximum size of heap:20MB
- new size of heap:5MB
-Xms10m -Xmx20m -Xmn5m -XX:ReservedCodeCacheSize=240m -XX:+UseCompressedOops -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./gclogs
JVM初始内存分配:
截图是以空main方法运行后JVM的内存使用概要。新生代内存大小为5MB,PSYoungGen区可用内存大小为4608K,eden、from和to区分别为4MB、512K和512K;老年代可用内存大小为5120K。
所需分配的内存小于新生代大小
// ONE_MB_SIZE = 1024 * 1024 byte[] allocate1 = new byte[ONE_MB_SIZE];
创建allocate1数组在eden区分配了4096KB*0.25=1MB内存。
所需分配的内存大于新生代大小:
byte[] allocate1 = new byte[3 * ONE_MB_SIZE];
JVM将3MB的对象放到了老年代:
为什么JVM不GC然后在新生代上分配3MB空间?这和内存分配与回收策略有关:
* 对象优先在eden区分配 * 大对象直接进入老年代 * 长时间还活着的对象进入老年代
即:
- 新生代初始36%的内存空间没有可GC的空间。
- 新生代的eden+from剩余3.1MB,足以提供3MB空间,但内存按page分配(4K/page),如果在新生代分配会使得对象分开保存在不同的区(eden和from),是否存储对象的内存只能在一个区里,这点待验证。
- 垃圾收集器为保吞吐量,当新生代无足够内存时,把对象分配到了老年代。
GC/Full GC
初始我们给heap分配了最大20MB的内存空间,下面看下GC的场景。
此时发生了GC和Full GC:
刨除初始被占用的36%的eden区,20MB的heap大小不满足内存分配要求,触发了java.lang.OutOfMemoryError: Java heap space错误。
此时将allocate1=null,触发GC,heap刚好可以完成内存分配。此时是在释放了eden空间后,转移到老年代进行内存分配:
看懂GC日志
To be continued...
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
安卓应用安全指南 5.4.1 通过 HTTPS 的通信 示例代码
5.4.1 通过 HTTPS 的通信 示例代码 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 你可以通过下面的图表(图 5.4-1)找出你应该实现的 HTTP / HTTPS 通信类型。 当发送或接收敏感信息时,将使用 HTTPS 通信,因为其通信通道使用 SSL / TLS 加密。 以下敏感信息需要 HTTPS 通信。 Web 服务的登录 ID /密码。 保持认证状态的信息(会话 ID,令牌,Cookie 等) 取决于 Web 服务的重要/机密信息(个人信息,信用卡信息等) 具有网络通信的智能手机应用是“系统”和 Web 服务器的一部分。 而且你必须根据整个“系统”的安全设计和编码,为每个通信选择 HTTP 或 HTTPS。 表 5.4-1 用于比较 HTTP 和 HTTPS。 表 5.4-2 是示例代码的差异。 表 5.4-1 HTTP 与 HTTPS 通信方式的比较 HTTP HTTPS 特性 URL 加密内容 内容的篡改检测 对服务器进行认证 损害的风险...
- 下一篇
列表的魔法
以中括号括起来,以","分隔每个元素,列表中的元素可以是数字,字符串,列表中可以嵌套列表。列表的列表中还能嵌套列表,也可以是布尔值。所有的都能放进去。 li = [1,12,9,"age",["hehe",2,"wang",["wanggang","xudong"]],"end"] print(li[4][3][1]) --- xudong --- 切片 li = [1,12,9,"age",["hehe",2,"wang",["wanggang","xudong"]],"end"] print(li[3:-1]) --- ['age', ['hehe', 2, 'wang', ['wanggang', 'xudong']]] # 取大于等于3,小于5 print(li[3:5]) --- ['age', ['hehe', 2, 'wang', ['wanggang', 'xudong']]] 支持for循环,while循环,break,continue for item in li: print(item) --- 1 12 9 age ['hehe', 2, 'wang', ['w...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Windows10,CentOS7,CentOS8安装Nodejs环境