JVM技术周报 · 第1期

JVM技术每周分享整理了JVM技术交流群每周讨论的内容,由群内成员整理归纳而成。如果你有兴趣入群讨论,请关注「Java技术精选」公众号,通过右下角菜单「入群交流」加我好友,获取入群详情。

SafePoint

safePoint是代码的特殊位置.发生GC时,jvm要判断引用关系,引用关系存在OopMap中,不可能每跑一行代码就生成一个OopMap,这会消耗大量的CPU执行时间和内存,所以jvm会在一些特殊的位置生成OopMap,这些位置就是SafePoint.GC时,jvm发出线程中断请求,线程只有跑到SafePoint才会中断,所以SafePoint不能太少.

线程中断主要有两个方式:抢先式中断 线程收到中断请求时,判断在不在safepoint,不在恢复run到safepoint(很少使用) 主动式中断 线程run的时候轮询中断标志,中断标志为真则处于safepoint.

SafeRegion

当线程正在run的时候,可以响应jvm的中断请求,跑到SafePoint中断.但是线程处于wait,blocked,sleep状态时,是无法跑到SafePoint中断的.同时这些线程不处于run的状态,引用关系不会发生变化.于是jvm规定了SafeRegion,无论何时发起GC,处于SafeRegion的线程都是安全的可以直接进行GC的.线程离开SafeRegion会检查系统是否已经完成了gc,完成可以离开去run,未完成继续等待可以离开的信号.

CMS内存碎片

CMS (Concurrent Mark Sweep)是一种以获取最短回收停顿时间为目标的Tenured generation收集器.CMS采取的是标记清清除算法.该算法是一定会产生内存碎片的,这是无法避免的.致过多的内存碎片会导致给大对象分配内存时,没有足够大的连续内存而出发full GC.
于是CMS提供了两个参数去解决这个问题:

-XX:UseCMSCompactAtFullCollection默认开启,fullGC时将老年代缩压缩.

-XX:CMSFullGCsBeforeCompaction 则是代表多少次FGC后对老年代做压缩操作,默认值为0,代表每次都压缩, 把对象移动到内存的最左边,可能会影响性能,但是可以消除碎片. 即牺牲一定性能在每次GC之后,将存活的对象整理到一块,消除内存碎片.

parNew+CMS组合 eden的YGC辨别对象的状态

问题中有个缺陷,当触发MinorGC时不仅仅是eden区,还会扫描from Survivor 区的内存.
ParNew采取的算法是复制清除算法,但是判断对象是否存活仍是可达性算法,采取对对象进行标记判断状态.

常量池

  • 常量池主要分为两个:
    静态常量池: *.class的常量池,保存了一些类的描述信息(符号引用-->1.类和方法的全限定名 2.字段的名称和描述符 3.方法的名称和描述符),以及一些字面量(1.文本字符串 2.八种基本类型的值 3.被声明为final的常量等)

  • 动态常量池: jvm在加载某个类的时候,必须经过装载、连接、初始化,而连接又包括验证、准备、解析三个阶段。而当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,由此可知,运行时常量池也是每个类都有一个.

全局字符串常量池:本质是一个HashSet,这是一个纯运行时的结构,而且是惰性维护的。注意它只存储String对象的引用,而不存储String对象的内容,根据这个引用可以得到具体的String对象。这个常量池在每个HotSpot VM的实例只有一份,被所有的类共享, JDK6 之前是存放在方法区,JDK7被移到了堆区中.(这里有很多有意思的点课自行百度)

JVM技术周报第1期的更多相关文章

  1. JVM技术周报第2期

    JVM技术周报第2期 JVM技术周报分享JVM技术交流群的讨论内容,由群内成员整理归纳而成.如果你有兴趣入群讨论,请关注「Java技术精选」公众号,通过右下角菜单「入群交流」加我好友,获取入群详情. ...

  2. iOS移动开发周报-第24期

    iOS移动开发周报-第24期 [摘要]:本期iOS移动开发周报带来如下内容:苹果更新了iTunes Connect的设计.UIKit Dynamics 教程:抛掷 Views.iOS APP 架构漫谈 ...

  3. iOS移动开发周报-第19期

    iOS移动开发周报-第19期 前言 欢迎国内的iOS同行或技术作者向我提交周报线索,线索可以是新闻.教程.开发工具或开源项目,将相关文章的简介和链接在微博上发布并 @唐巧_boy 即可. [摘要]:本 ...

  4. iOS移动开发周报-第17期

    lhq iOS移动开发周报-第17期 前言 欢迎国内的iOS同行或技术作者向我提交周报线索,线索可以是新闻.教程.开发工具或开源项目,将相关文章的简介和链接在微博上发布并 @唐巧_boy 即可. [摘 ...

  5. iOS移动开发周报-第25期

    iOS移动开发周报-第25期 [摘要]:本期iOS移动开发周报带来如下内容:苹果发布 iPhone6 和 Apple Watch.Swift 1.0 GM发布.Xcode 6支持PDF Vector作 ...

  6. iOS移动开发周报-第23期

    iOS移动开发周报-第23期 [摘要]:本期iOS移动开发周报带来如下内容:苹果发出9月9日发布会邀请函,AFNetworking2.0源码解析,objc与鸭子对象,Protecting iOS Ap ...

  7. iOS移动开发周报-第22期

    iOS移动开发周报-第22期 [摘要]:本期iOS移动开发周报带来如下内容:苹果股价创新高,iOS8自动调整UITableView布局,Swift学习心得等. 新闻 <苹果股价创新高 市值全球第 ...

  8. iOS移动开发周报-第21期

    iOS移动开发周报-第21期 [摘要]:本期iOS移动开发周报带来如下内容:苹果iCloud中国数据转存中国电信,Swift Operators,100 个 Swift 必备 tips,FLEXLoa ...

  9. 极客技术专题【008期】:CSS3核心技术:选择器

    日期:2013-8-19  来源:GBin1.com 技术专题介绍 技术专题:CSS3核心技术:选择器 专题演讲稿:CSS3选择器 分享人:知名前端技术博客 - w3cplus.com 博主 - 大漠 ...

随机推荐

  1. LeetCode题解之Insertion Sort List

    1.题目描述 2.题目分析 利用插入排序的算法即可.注意操作指针. 3.代码 ListNode* insertionSortList(ListNode* head) { if (head == NUL ...

  2. SqlServer PIVOT函数快速实现行转列,UNPIVOT实现列转行

    我们在写Sql语句的时候没经常会遇到将查询结果行转列,列转行的需求,拼接sql字符串,然后使用sp_executesql执行sql字符串是比较常规的一种做法.但是这样做实现起来非常复杂,而在SqlSe ...

  3. SQL Server Management Studio记住的密码丢失的问题

    不知道各位经常使用SSMS的时候有没有碰到过这样的烦恼: 记住的密码总是丢失: 步骤如下: 登陆时,选择记住密码 在任何一个存储过程上点击右键,选择修改 这时候再次连接对象资源管理器时,刚刚记住的密码 ...

  4. 纯Css实现Div高度根据自适应宽度(百分比)调整

    在如今响应式布局的要求下,很多能自动调整尺寸的元素能够做到高宽自适应,如img,通过{width:50%;height:auto;}实现图片高度跟随宽度比例调整. 然而,用的最多的标签一哥Div却不能 ...

  5. 转:sql语句优化

    性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化. 为了获得稳定的执行性能,SQL语句越简单越好.对复杂的SQL语句,要设 ...

  6. route命令详解与使用实例 ,同时访问内外网

    route命令详解与使用实例     2011-10-18 12:19:41|  分类: 其他 |  标签:route   |字号 订阅   1.   使用背景 需要接入两个网络,一个是部署环境所在内 ...

  7. IIS中添加MIME类型

    今天上传一个html5后台管理模版的时候,在服务器上预览发现网页加载的远程woff类型的字体不显示,如下图所示: 在本地预览的时候,正常加载字体文件应该是这样的: 利用url访问字体文件的时候提示:该 ...

  8. 基于CNN网络的汉字图像字体识别及其原理

    现代办公要将纸质文档转换为电子文档的需求越来越多,目前针对这种应用场景的系统为OCR系统,也就是光学字符识别系统,例如对于古老出版物的数字化.但是目前OCR系统主要针对文字的识别上,对于出版物的版面以 ...

  9. Priority Queue

    优先队列 集合性质的数据类型离不开插入删除这两操作,主要区别就在于删除的时候删哪个,像栈删最晚插入的,队列删最早插入的,随机队列就随便删,而优先队列删除当前集合里最大(或最小)的元素.优先队列有很多应 ...

  10. centos限制远程尝试密码次数

    CentOS中有一个pam_tally2.so的PAM模块,来限定用户的登录失败次数,如果次数达到设置的阈值,则锁定用户.编译PAM的配置文件 # vim /etc/pam.d/login添加: au ...