美文网首页JVM
01. JVM 入门

01. JVM 入门

作者: 哈哈大圣 | 来源:发表于2019-03-19 21:33 被阅读91次

JVM 入门

一、谈谈对java的理解

语言层面 方向如下:

  • 平台无关性 Wirte once, run anywhere
  • GC 内存模型
  • 语言特性(泛型、反射、Lambda表达式)
  • 面向对象特点
  • 类库(集合、并发、IO库...)
  • 异常处理

1).JER,JDK,JVM之间的区别与联系

比如 编译器 javac ,就需要jdk环境


jvm_jre_jdk.png
jvm_jre_jdk的关系.png

2).java的平台无关性是如何实现的


平台无关性.png

3).谈谈ClassLoader 双亲委派机制


内存模型.png
ClassLoader的种类.png
双亲委派机制.png

双亲委派机制是一个锤石的坑爹过程,每需要加载一个类的时候,都会问问他父亲 (非继承的父子关系,而是组合关系),看父亲加载没有,一致询问到顶级的父亲,如果过程中,有谁加载了,就不会重复加载当前的类,如果都没有加载,会从顶级开始尝试加载,没个级别加载的访问路径是有严格区分的;这样做的好处是安全性高,防止核心类库的代码被篡改覆盖,同时也避免了重复加载的冗余!
静态代码块在类被初始化时执行,而不是笼统的在被加载时执行

二、内存模型

1). Java内存模型


内存模型图解.png

2). 程序计数器


程序计数器.png

3). 虚拟机栈


虚拟机栈详细结构.png

4). 本地方法栈

调用其他语言方法的模板


Native.png

5). 元空间|永久代


元空间与永久代.png

6). 堆内存


Java内存中的分部.png
调优.png
堆和栈的区别.png

7). 转储文件分析

转储文件:JVM启动参数;


转储文件.png

使用 Memory Analyze 工具分析dump下是转储文件分析当时内存情况

三、GC

1). 引用计数算法

解决的问题:标记垃圾

  1. 对象应用的次数 == 0时被清理
  2. 高效快捷
  3. 无法清理 循环应用
    • 比如两个对象,外部没有任何执行他们的应用,但是连个引用相互为组合关系!

2). 可达性算法

解决的问题:标记垃圾 -> 循环引用


可达性算法.png

那些可以作为GCRoots?

  1. 静态成员变量
  2. 虚拟机栈重点局部变量表
  3. 常量池
  4. ...

3). 标记清除算法

解决的问题:清除垃圾


标记清除算法.png

遗留的问题:空间碎片太多

3). 复制算法

解决的问题:空间碎片化


复制算法.png

事先预留一份空间,用于复制生存下来的对象;对于大部分的对象,生命周期很短;

  1. 效率高
  2. 空间利用率低

4). 标记整理算法

解决的问题,垃圾标记并整理:效率略低


标记整理算法.png

5). 分代收集算法

将复制算法和标记整理算法糅杂与一身


分代收集算法.png

Eden中放置新出生的对象,第一次回收(Eden/from/to/(或者含有老年))之后,将生存的放入From Survivor 中,并将该年龄加一;第二次回收后,生存下来的对象与From Survivor中存活的 一起复制到 To Survivor;第三次 Eden /To Survivor 到 From Survivor ....;如果年龄超过15此就放到老年代(老年代也指接放置一些大的对象);如果从平均添加到老年代的对象大于老年代剩余空间,将会触发一次FullGC;

新生代向老年代过度的条件

  1. 默认经历了15次MinorGC依然存活(-XX:MaxTenuringThreshold)
  2. Survivor存放不下
  3. 新生的大对象

MinorGC与FullGC

  1. MinorGC: 收集新生代的内存空间;效率是 FullGC的 10倍
  2. FullGC: 收集整个堆内存
    • 触发条件:
      1. 老年代空间不足
      2. 从MinorGG晋升到老年代的平均大小大于老年代的剩余空间
      3. 调用System.gc(); 还不一定执行

Finalize() 方法

  • 对象存在几种状态
    • 存活
    • 可恢复:可以被抢救
    • 回收

复写Finalize()方法,可以在里面临时抢救这个对象;处于可恢复状态的对象如果被抢救成功,能够存活;
Finalize()方法只能被执行一次;JVM会有一个低优先级的队列去执行这些方法!所以这个方法也不可靠!

相关文章

  • 01. JVM 入门

    JVM 入门 一、谈谈对java的理解 语言层面 方向如下: 平台无关性 Wirte once, run anyw...

  • 1-JavaBasisBegin

    Java入门 JDK && JRE && JVM JVM(Java Virtual Machine ):Java虚...

  • JVM内存模型(jvm 入门篇)

    概述 jvm 入门篇,想要学习jvm,必须先得了解JVM内存模型,JVM内存模型,JVM内存模型,JVM内存模型,...

  • 万字长文把[JVM]从头到尾讲一遍

    第一篇:[JVM入门指南01]内存区域与溢出异常——主要介绍JVM的运行时数据区第二篇:[JVM入门指南02]GC...

  • 九神带你入门JVM(上)

    概述 本篇较长,九神带你从0入门JVM,全文包括包括JVM的分类、JVM垃圾回收综述、JVM的内存模型(Java ...

  • 01.入门

    入门 将Parse SDK集成到JavaScript项目中的最简单方法是通过npm模块。但是,如果要使用预编译文件...

  • 01. 入门

    Source Youtube Excel 基础教学 Excel官方文档Screen Shot 2019-10-02...

  • idea中设置JVM参数,简单理解JVM常见参数,JVM调优

    idea中设置JVM参数,简单理解JVM常见参数,JVM调优简单入门 前面学习了JVM的内存分布,今天就来验证下。...

  • JVM系列之 _call_stub_entry初始化

    在上文JVM系列之函数调用入门已经简单介绍了JVM是如何调用方法的:JVM先调用call_stub()方法将_ca...

  • JVM入门

    Java虚拟机内存包括: 程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、运行时常量池、直接内存。 ...

网友评论

    本文标题:01. JVM 入门

    本文链接:https://www.haomeiwen.com/subject/nbromqtx.html