Java笔记之 1. JVM学习

一、 JVM学习笔记

JVM:Java Virtual Machine
JVM总感觉那么的神秘,底层的东西,试着把一些复杂的概念,用简单的方式做一个总觉。
那么学习JVM主要是学习哪些内容。
1.运行时数据区。
2.堆模型。
3.垃圾回收算法。
4.引用分类。

JVM在开发中的位置:


image

1.1、运行时数据区:

image
  • 程序计数器program Counter Register:
    线程私有,当前线程。
    指向当前线程正在执行的字节码指令地址。每条现成都有一个独立的程序计数器,互不影响、独立存储。字节码解释器通过改变这个计数器来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程回复都需要依赖它。
  • 虚拟机栈 VM Stack:
    线程私有,当前线程执行方法。
    • 每个方法都包含:局部变量表、操作数栈、动态链接(运行时多态)、出口(去哪里-正常、非正常)
    • StackOverflowError,如果线程请求的栈深度大于虚拟机允许的深度时。
    • OutOfMemoryError,如果虚拟机栈进行扩展无法申请到足够的内存时。
  • 本地方法栈 Native Method Stack:C++、C提供的功能。
    • StackOverflowError
    • OutOfMemoryError
  • 方法区 Method Area(永久代):类信息、常量final、静态变量static、JIT。
    • OutOfMemoryError,申请不到内存时。
  • 堆 Heap:所有线程共享,存放对象实例。
    • 通过-Xmx 和 -Xms 控制
    • OutOfMemoryError,当堆无法申请到内存时。

1.2、堆模型

年轻代Young Generation

一般都是朝生夕死的对象,大约80%以上,采用复制算法进行垃圾回收。(复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片)

年轻代分为:1个eden['i:dən]、两个survivor sə'vaɪvə。默认比例为Eden:Survivor0:Survivor1=8:1:1。survivor区的意义在于它进行筛选进入老年代的对象,减少被送到老年代对象的数量,进而减少FullGC的开销。两个survivor区主要解决内存碎片化,也是使用复制算法的前提。

新创建的的对象会分配到eden区(大对象可能会特殊)。进行MinorGC以后,在eden区中存过下来的对象会移动到Survivor的to区,在Survivor的from区的存活的对象根据年龄(一次GC涨一岁)进行判断,达到临界值(可以通过-XX:MaxTenuringThreshold来设置) 会被复制到老年代,未达到的复制到To区。经过这次GC以后eden区和From区就会被清空。这个时候From和To交换角色。此时Eden区和To区都是空的,等待下一轮GC。一直等待To区填满,就会把这些对象移动到老年代。

年轻代GC(MinorGC),非常频繁,回收速度也比较快。GC算法:复制算法。

老年代Old Generation

在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到老年代中。因此,可以认为老年代中存放的都是一些生命周期较长的对象。

老年代GC(Major GC/Full GC),比新生代慢10倍。GC算法:标记清楚或标记整理。

永久代(持久代)Permanent Generation:

用于存放静态文件,如今Java类、方法等。
永久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Spring Hibernate 等,在这种时候需要设置一个比较大的永久代空间来存放这些运行过程中新增的类。
永久代大小通过-XX:MaxPermSize=<N>进行设置。
永久带也称为方法区。

永久代在java8以后的HotSpot将被废弃,原因主要有两个:

  1. 由于永久代内存经常不够用或发生内存泄露,引发恼人的java.lang.OutOfMemoryError: PermGen (在Java Web开发中非常常见)。
  2. 移除永久代可以促进HotSpot JVM与 JRockit VM的融合,因为JRockit没有永久代。

根据上面的各种原因,永久代最终被移除,方法区移至Metaspace,字符串常量移至Java Heap。JDK 8开始把类的元数据放到本地化的堆内存(native heap)中,这一块区域就叫Metaspace,中文名叫元空间。

元空间

JDK 8开始把类的元数据放到本地化的堆内存(native heap)中,这一块区域就叫Metaspace,中文名叫元空间。

最直接的表现就是java.lang.OutOfMemoryError:
PermGen空间问题将不复存在,因为默认的类的元数据分配只受本地内存大小的限制,也就是说本地内存剩余多少,这解决了空间不足的问题。不过,让Metaspace变得无限大显然是不现实的,因此我们也要限制Metaspace的大小:使用-XX:MaxMetaspaceSize参数来指定Metaspace区域的大小。JVM默认在运行时根据需要动态地设置MaxMetaspaceSize的大小。

如果Metaspace的空间占用达到了设定的最大值,那么就会触发GC来收集死亡对象和类的加载器。根据JDK 8的特性,G1和CMS都会很好地收集Metaspace区

新增参数

  • -XX:MetaspaceSize是分配给类元数据空间(以字节计)的初始大小(Oracle逻辑存储上的初始高水位,the initial high-water-mark),此值为估计值。MetaspaceSize的值设置的过大会延长垃圾回收时间。垃圾回收过后,引起下一次垃圾回收的类元数据空间的大小可能会变大。
  • -XX:MaxMetaspaceSize是分配给类元数据空间的最大值,超过此值就会触发Full GC,此值默认没有限制,但应取决于系统内存的大小。JVM会动态地改变此值。
  • -XX:MinMetaspaceFreeRatio表示一次GC以后,为了避免增加元数据空间的大小,空闲的类元数据的容量的最小比例,不够就会导致垃圾回收。
  • -XX:MaxMetaspaceFreeRatio表示一次GC以后,为了避免增加元数据空间的大小,空闲的类元数据的容量的最大比例,不够就会导致垃圾回收。

1.3 垃圾回收

  • 引用计数法Reference Counting

    • 实现简单、效率高,适合简单场景。Flash、Python使用.
    • 很难解决循环引用问题。
  • 标记-清除法

  • 复制算法

  • 标记-整理算法

  • 分代收集算法

  • 新生代-复制算法(Scavenge)
    通过Eden和两个Survivor区的复制,可避免碎片化。

  • 老生代-标记清楚或标记整理CMS(Concurrent MarkSweep)

    • 初始标记,需要Stop The World
    • 并发标记,需要Stop The World
    • 重新标记
    • 并发清除
      当找不到足够的连续控件分配会进行一次Full GC

1.4 引用类型

  1. 强引用:不会被回收。
Object o=new Object();   //  强引用

  1. 软引用:非必须的对象。当内存足够不会被回收,当内存不足,就会被回收。可以被程序使用。使用类java.lang.ref.SoftReference定义
    `
String str=new String("abc");// 强引用  
SoftReference<String> softRef=new SoftReference<String>(str);     // 软引用  Browser prev = new Browser();// 获取页面进行浏览  
SoftReference sr = new SoftReference(prev); // 浏览完毕后置为软引用         
if(sr.get()!=null) {   
    rev = (Browser) sr.get();
    // 还没有被回收器回收,直接获取  
} else {  
    prev = new Browser();
    // 由于内存吃紧,所以对软引用的对象回收了  
    sr = new SoftReference(prev);  // 重新构建      
} 
  1. 弱引用:非必须对象,只能生存到下一次垃圾收集发生之前。可以获取对象。
String str=new String("abc");
WeakReference<String> abcWeakRef = new WeakReference<String>(str);  

  1. 虚引用:幽灵引用、幻影引用。不会对对象生存时间构成影响,也无法通过虚引用取得一个对象的实例。唯一目的是在背收集器回收时受到一个系统通
    知。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容