摘要:一、为什么要有Survivor区 如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC。 又因为老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多。频发的Full GC消耗的时间是非常可
阅读全文
摘要:引入TLAB的原因 多线程环境下,在堆上创建对象很容易造成线程不安全现象。 可能出现线程A正在给对象O1分配内存M,指针还没来得及修改,线程B又同时使用了内存M来给对象O2分配内存的情况。 如何开启TLAB? 开启本地线程分配缓冲(Thread Local Allocation Buffer,TLA
阅读全文
摘要:总结 //例1:User类型的对象u就没有逃逸出方法test public void test(int x,int y ){ String s = “”; User u = …. ….. } //例2:User类型的对象u就逃逸出方法test public User test(int x,int y
阅读全文
摘要:总结 1.当JVM通过GC Roots可达性分析,判断某对象可以被回收后,会判断是否重写了finalize方法,如果没有,直接回收 2.如果重写了,把该对象放入F-Queue队列,有线程(一个级别很低的daemon线程)专门遍历并执行这些的finalize方法 3.执行finalize()后,等下一
阅读全文
摘要:总结 -Xms256m:初始化堆大小为 256m; -Xmx2g:堆最大内存为 2g; -Xmn50m:新生代的大小50m; -XX:+PrintGCDetails 打印 gc 详细信息 -XX:+HeapDumpOnOutOfMemoryError 在发生OutOfMemoryError错误时,来
阅读全文
摘要:总结 -XX:+UseConcMarkSweepGC ,表示新生代使用ParNew,老年代的用CMS CMS 是英文 Concurrent Mark-Sweep 的简称,是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动 JVM 的
阅读全文
摘要:总结 并行:垃圾收集的多线程的同时进行。并发:垃圾收集的多线程和应用的多线程同时进行。 吞吐量 = CPU在用户应用程序运行的时间 / (CPU在用户应用程序运行的时间 + CPU垃圾回收的时间) 垃圾回收器算法比较: 串行回收算法:会停止当前应用进程,回收垃圾,停顿时间久,吞吐量大,响应时间长 并
阅读全文
摘要:功能方面:对象存储在堆上;基本数据类型的变量(int、short、long、byte、float、double、boolean、char等)以及对象的引用变量存储在栈上。 共享性:堆是线程共享的,栈是线程私有的。 空间大小:堆大小远远大于栈。 补充:栈帧的知识 https://www.cnblogs
阅读全文
摘要:类加载器(ClassLoader) 运行时数据区(Runtime Data Area) 执行引擎(Execution Engine) 本地库接口(Native Interface) 作用: 首先通过类加载器(ClassLoader)会把 .class字节码文件加载到内存中——运行时数据区(Runti
阅读全文
摘要:1. JMM是干嘛的? 作用: 是一个“缓存一致性协议”,用于定义数据读写的规则 : JMM定义了线程工作内存和主内存之间的抽象关系: 线程之间的共享变量存储在主内存(Main Memory)中, 每个线程都有一一个私有的本地内存(Local Memory) 而在多线程环境下,可能会存在主内存和线程
阅读全文
摘要:1. Jprofiler有什么用? MAT是Eclispe里用来分析OOM故障的工具,和Jprofiler类似。 2. Jprofiler 安装 2.1 Jprodiler插件安装 2.2 Jprofiler客户端安装 百度搜索“Jprofiler安装包”即可 2.3 Jprofiler配置 3.
阅读全文
摘要:总结 JVM中的堆: jdk1.7之前:一般分为三大部分:新生代、老年代、永久代 jdk1.8起:一般分为两大部分:新生代、老年代(永久代已经移除,1.8后用元空间代替,并移出堆) GC算法:JVM - 垃圾回收算法 对象object在堆heap的分配过程 1.Java新对象的会在新生代的Eden区
阅读全文
摘要:总结 N代表内存的大小。 复制算法只访问一半的内存,所以它最快; 标记清除要遍历一整个内存N; 标记压缩除了遍历一遍内存N,还要走一遍移动的过程; 1. 标记-清除算法(Mark-Sweep) 算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
阅读全文
摘要:一般有两种方法来判断: 引用计数器:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题; 可达性分析:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何
阅读全文
摘要:栈上分配 虚拟机提供的一种优化技术,基本思想是,对于线程私有的对象,将它打散分配在栈上,而不分配在堆上。好处是对象跟着方法调用自行销毁,不需要进行垃圾回收,可以提高性能。栈上分配需要的技术基础,逃逸分析。逃逸分析的目的是判断对象的作用域是否会逃逸出方法体。注意,任何可以在多个线程之间共享的对象,一定
阅读全文
摘要:总结 静态分配,用于方法的重载 动态分配,用于方法的多态 请看蓝色的标记部分: 当通过h1, h2去调用共同的接口方法时,就是常见的多态应用。这时是动态分配,看“实际类型 Actual Type”。 当把h1, h2作为参数传给“重载的方法”时,这时是静态分配,要看“静态类型 Static Type
阅读全文
摘要:总结 1. 加载阶段 (Loading) 简单描述: 在Java程序运行之前JVM会把编译完成的.class二进制文件加载到内存,后续提供程序使用,这里用到的就是类加载器ClassLoader(JVM - 双亲委派机制 Parent-Delegation Model)。 详细描述: 虚拟机需要完成以
阅读全文
摘要:1. 双亲委派模型 不是继承关系,而是委托关系。 从Java虚拟机的角度来讲,只存在两种不同的类加载器: 一种是启动类加载器(Bootstrap ClassLoader),仅按照文件名识别,如rt.jar,名字不符合的类库即使放在lib目录中也不会被加载。这个类加载器使用C++语言实现,是虚拟机自身
阅读全文
摘要:1. 各版本之间的变化 黄色的模块是线程私有的;绿色的模块是线程共有的。 JVM的优化,都集中在线程共有的区域(99%都是堆) jdk 1.6 jdk 1.7 jdk 1.8 2. 运行时数据区 各部分的作用 程序计数器 program counter register Java栈 java sta
阅读全文