face_jvm

  1. 内存模型以及分区

JVM分为虚拟机栈、堆、方法区、本地方法区

  • ,用来存放实例化对象、非static成员变量,属于线程共享的,并发处理的主要就是
    堆中的共享
  • 虚拟机栈,由栈帧组成,每个方法运行打包成一个栈帧,当前正在执行的方法就是
    虚拟机栈顶的栈帧,栈帧缺省大小1M,可通过-Xss256k进行设置,栈帧由局部变量表
    操作栈动态连接返回地址
  • 方法区,用来存放类信息、静态常量编译后的字节码文件等,
  • 本地方法区,用来存放native方法服务
  • 程序计数器,记录程序执行的行号
  1. 堆的内存区域划分和特点

分为新生代、老年代、永久代(永久代1.8及以后替换为metaspcace)

  • 新生代,包含Eden区和survivor from、to区,分配比例为8:1:1,新建对象存放在Eden区,当Eden区空间
    不足会触发GC进行回收,幸存者进入survivor区
  • 老年代,经过N次GC后幸存的对象会进入老年代,大对象创建会直接放入老年代,当老年代
    空间不足时触发full GC
  1. GC 的判定方法
  • 引用计数法,当对象被引用时计数器+1,被释放时,计数器-1,当为0则会被回收,会存在相互
    引用的问题
  • 可达性分析法,是通过计算GC roots的对象向下搜索,不能达到的对象进行回收,GC roots
    对象有以下几种

①虚拟机栈中引用的对象

②方法区类静态属性引用的对象

③方法区常量池引用的对象

④本地方法栈 JNI 引用的对象

  1. GC有哪些内存回收算法
  • 复制算法,会浪费一半内存,内存移动,需要修改引用
  • 标记清除,产生大量不连续的碎片内存,大内存分配不便
  • 标记整理,通过标记、整理、删除,优点是内存连续但耗时长
  1. GC收集器有哪些,特点是什么
  • serial是新生代收集器,单线程独占,速度快,会阻塞,采用复制算法
  • ParNew是新生代收集器,多线程版serial,采用复制算法
  • Parallel Scavenge,吞吐量优先的新生代收集器,采用复制算法,适合后台运算,不需要太多交互任务
  • Serial Old,老年代收集器,采用单线程,采用标记整理算法
  • Parallel,老年代收集器,多线程,注重吞吐量(执行时长/(执行时长+垃圾回收时间) 即使用率),采用标记整理
  • CMS是并行与并发的收集器,收集时间短,适合快速响应,采用标记清除算法,JVM可以设置N次FGC后进行一次标
    记整理,执行过程如下

一、初始标记,短暂STW,标记GC roots可达的对象引用

二、并发标记,GC roots Tracing(GC roots 追踪)

三、重新标记,短暂STW,修整标记期间变动记录

四、并发清理。两次STW时间都比较短,整体来算是并发的。

  • G1,跨越新老年代,将内存切分为N个region局部块,每块都有新老年代,整体采用标记整理算法,
    只对部分region区域进行增量清理,所以G1的STW时间短,整体执行过程如下
  1. 新生代GC,Eden清空,幸存进入survivor
  2. 并发清除周期,具体步骤如下,

a.根区域扫描,survivor能进入olden的

b.并发标记

c.重新标记

d.独占标记

e.并发清除

  1. 混合回收,含有垃圾比例高的region进行回收
  2. 可能的fullGC
  • ZGC,内存划分为一个个region区,没有分代概念,每次清理所有的region,采用分区复制进行清理
    ,执行过程如下,
  1. Pause Mark Start 初始停顿标记
  2. Concurrent Mark并发标记,递归标记其他对象
  3. Relocate移动对象
  4. Remap - 修正指针
  1. 简述JVM垃圾回收机制

JVM采用了一个垃圾回收的守护线程,当虚拟机空闲或堆内存不足时,才会触发执行,扫描
未被引用的对象,把它们添加到要回收的集合中,进行回收

  1. java内存模型是什么

java 内存模型(JMM)是线程间通信的控制机制,JMM 定义了主内存和线程之间抽象关系。
线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的
本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。
本地内存是 JMM 的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,
寄存器以及其他的硬 件和编译器优化。

  1. 类的加载过程
  • 加载,首先加载二进制字节流,并转换成方法区或元空间的运行时结构,在内存中生成class
    对象作为方法区或元空间的入口
  • 连接,连接分为三步,

    1.验证,验证文件格式(即千4字节魔数)、元数据、字节码等等

    2.准备,类变量进行初始化和分配内存

    3.解析,将常量池中符号引用替换为直接引用
  • 初始化,clinit指令对构造方法执行变量的赋值,只能有一个线程能执行这个类的clinit,
    多线程环境中被正确地加锁、同步,耗时很长的操作,可能造成多个进程阻塞
  • 使用
  • 卸载
  1. 类加载器双亲委派模型机制是什么

当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类 去加载,
如果此时父类不能加载,反馈给子类,由子类去完成类的加载。类加载器主要有如下四种

  • 启动加载器(Bootstrap),用来加载java核心类库,如:jre/lib/ext
  • 扩展类加载器(Extension),用来加载java的扩展库
  • 系统类加载器(system class loader)根据 Java 应用的类路径(CLASSPATH) 来加载 Java 类
  • 应用加载器(Application),用户自定义类加载器,通过继承 java.lang.ClassLoader 类的方式实现。
  1. 性能优化

性能优化按结构分可分为3类

  • 前端
  • 客户端减少请求
  • CDN加速加载资源
  • 反向代理缓存(静态资源存放nginx)
  • web组件分离(js/css/图片放在不同服务,加大浏览器并发数)
  • 服务端优化
  • 缓存(优先第一考虑原则),缓存离用户越近越好,减少多余请求,如:redis、memcach
  • 异步处理(可以有效避免阻塞),如:serverlet异步、多线程、消息队列
  • 集群(更多机器,提供更高的吞吐量)
  • 程序
  • 合适的数据结构(集合给定容器长度,减少扩容)
  • 更优的算法/更少的代码
  • 并发编程(充分利用CPU资源,需要避免线程安全)
  • 减少锁竞争(轻量锁、偏向锁如CAS、读写锁)
  • 单例模式
  • 池化技术
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容

  • 第二部分 自动内存管理机制 第二章 java内存异常与内存溢出异常 运行数据区域 程序计数器:当前线程所执行的字节...
    小明oh阅读 1,138评论 0 2
  • 《深入理解Java虚拟机》笔记_第一遍 先取看完这本书(JVM)后必须掌握的部分。 第一部分 走近 Java 从传...
    xiaogmail阅读 5,069评论 1 34
  • JVM架构 当一个程序启动之前,它的class会被类装载器装入方法区(Permanent区),执行引擎读取方法区的...
    cocohaifang阅读 1,650评论 0 7
  • 工作之余,想总结一下JVM相关知识。 Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的...
    Huang远阅读 630评论 0 2
  • 介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明 程序计数器:看做当前线程所执行的字节码行号指示器...
    jemmm阅读 2,225评论 0 9