![](https://img-blog.csdnimg.cn/20190927151132530.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
jvm--杂谈
文章平均质量分 73
jvm--杂谈
A__17
这个作者很懒,什么都没留下…
展开
-
JVM-GC大纲
JVM-垃圾收集算法 VS 垃圾收集模式 VS 垃圾收集器-CSDN博客原创 2015-09-24 14:26:37 · 745 阅读 · 0 评论 -
Java内存模型
目录一、前言:二、java内存模型(JMM):三、volatile关键字volatile的使用:四、java中的synchronized关键字五、volatile与synchronized的比较:一、前言:在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。 java的并发采用的是共享内存模型:通过读/写内存中的公共状态进行隐式通信。二、java内存模型(JMM):概念:java线程之间的通信是由java内存模型控制的,JMM决定一个线程对共享变量的原创 2015-10-30 23:35:14 · 1171 阅读 · 0 评论 -
JVM-jdk提供的工具
【代码】堆、栈的分析工具--jmap、jstack。原创 2017-12-11 21:55:27 · 1876 阅读 · 0 评论 -
JVM内存结构
目录一、官网:二、JVM内存结构2.1类加载器2.2运行时数据区2.2.1程序计数寄存器(Program Counter Register / PC Register)2.2.3方法区概念:运行时常量池:方法区的回收:元数据区:2.2.3Java虚拟机栈:概念:栈帧:局部变量表(Local Variables Table):操作数栈(Operand Stack):动态连接方法返回地址2.2.4本地方法栈(Native Method St原创 2020-03-11 22:34:38 · 1106 阅读 · 0 评论 -
JVM中类加载的机制
Class类文件的结构常量池:常量池中主要存放两大类常量:字面量(Literal)和符号引用 (Symbolic References)字面量:比较接近于Java语言层面的常量概念,如文本字符串、被声明为final的常量值等。符号引用:符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。 符号引用与虚拟机的内存布局无关,引用的目标并不一定加载到内存中。 符号引用的字面量形式明确定义在Java虚拟机规范的Class文件格式中。在Cla原创 2015-10-04 13:17:31 · 1359 阅读 · 0 评论 -
JVM中编译器
前端编译器:概念:把.java文件转变成.class文件。举例:javac、各种IDE中的编译器。即时编译器(JIT编译器: Just In Time Compiler):概念:JIT编译器在运行时会针对那些频繁被调用的“热点代码”做出深度优化,并将其直接编译为对应平台的本地机器指令,以此提升Java程序的执行性能。由于这种编译方式发生在方法的执行过程中,因此也被称之为栈上替换,或简称为OSR (On StackReplacement)编译。HotSpot VM 中的JIT编译原创 2015-05-03 18:45:07 · 1372 阅读 · 0 评论 -
JVM-内存分配
对象优先在eden区分配大对象直接进入老年代长期存活的对象晋升到老年代对象年龄动态判断空间分配担保机制原创 2015-06-09 17:29:20 · 1335 阅读 · 0 评论 -
JVM-线程本地分配缓冲区(TLAB)
TLAB原创 2015-06-25 10:12:39 · 1703 阅读 · 0 评论 -
JVM-内存逃逸分析
内存逃逸方法逃逸概念:一个方法内部创建的对象被外部方法引用(比如将对象作为返回值传递到其它方法中),我们称之为方法逃逸。线程逃逸概念:一个线程内部创建的对象被外部线程引用(比如将对象作为返回值传递到其它线程中),我们称之为线程逃逸。内存逃逸分析:概念:通过动态分析对象的作用域,分析某些对象是否存在方法逃逸或线程逃逸,为其它优化手段(如栈上分配、同步消除和标量替换等)提供依据。作用:若jvm开启了逃逸分析,JIT会对代码进行如下优化:栈上分配对象:若某个对象不存在方法逃原创 2015-05-03 18:56:23 · 1951 阅读 · 0 评论 -
JVM-内存回收
目录标记-清除算法(Mark-Sweep)标记-整理算法(Mark-Compact)复制算法(Copying) 分代收集算法垃圾收集的3种模式:串行收集(Serial GC)并行收集(Parallel GC)并发收集(CMS GC)标记-清除算法(Mark-Sweep)概念:首先标记出所有需要回收的对象,在标记完成后统一回收所有标记的对象。 特点: 效率问题:标记和清除的效率都不高。 空间问题:标记清除之后会产生大量不连续的内存碎片,碎片太多可能会导...原创 2015-10-04 13:06:29 · 902 阅读 · 0 评论 -
JVM中的垃圾收集器 -- CMS
垃圾收集器新生代收集器1.Serial收集器概念:Serial收集器是一个单线程的收集器,它在进行垃圾收集的时候,必须暂停其他所有的工作线程,直到它搜集结束。(Stop the world) 优点:简单而高效(与其它单线存放收集器相比) 应用:运行在Client模式下的虚拟机的默认新生代收集器。 说明:在桌面应用中,分配给虚拟机管理的内存一般不会很大,收集几十兆或者几百兆的新生代,停顿的时间还不到一秒,只要不是频繁发生,这点停顿还是可以接受的2.Parallel Scavenge.原创 2015-10-04 13:08:38 · 2441 阅读 · 1 评论 -
JVM中的垃圾收集器 -- G1
JVM中的垃圾收集器 -- G1原创 2015-10-19 19:58:40 · 2315 阅读 · 0 评论 -
JVM - GC过程中存活对象的标记
从根节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象与根节点之间不存在任何引用链时,则证明此对象是不可用的。虚拟机栈(栈帧中的本地变量表)中引用的对象、本地方法栈中JNI(即native方法)引用的对象。方法区中:类静态属性引用的对象、常量引用的对象。概念:给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器就减1;当计数器为0时,对象就不能再使用了。说明:Java虚拟机里面没有采用 引用计数算法 来管理内存。原因:不能解决对象之间相互循环引用的问题。原创 2015-09-24 14:10:34 · 1520 阅读 · 0 评论 -
java中对象的可达性 && 弱引用简介
package java.lang.ref;/** * 对象的可达到性(Reachability): * 1>被强引用的对象: * 定义:如果一个对象不需要遍历任何引用链就可以被某些线程访问,那么这个对象就是被强引用的对象。new出来的对象被创建它的线程强引用着。An object is strongly reachable if it can be reached by some thread without traversing any reference obj.原创 2021-03-31 14:54:06 · 590 阅读 · 0 评论 -
GC问题分析&解决
现象:每次Full GC后老年代使用率呈现断崖式下跌,Full GC触发间隔低于预期。原因:大量无效对象晋升,导致Old区占用率增长过快。原创 2021-09-06 20:17:45 · 2240 阅读 · 0 评论 -
GC日志分析
打印gc日志:-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGC -Xloggc:logs/gc.logYoung GC# --- Young GC start --- # 之前young gc次数、之前full gc次数{Heap before GC invocations=124398 (full 12): # 新生代使用情况 par new generat...原创 2018-03-29 21:15:43 · 715 阅读 · 0 评论 -
JVM中参数的设置
堆栈: 【堆】 -Xms 或 -XX:InitialHeapSize 初始堆大小,默认空余堆内存小于40%(MinHeapFreeRatio参数可以调整)时,JVM就会增大堆直到-Xmx的最大限制。 -Xmx 或 -XX:MaxHeapSize 最大堆大小,默认空余堆内存大于70%(MaxHeapFreeRatio参数可以调整)时,JVM会减少堆直到-Xms的最小限制。 -Xmn...原创 2017-12-26 23:29:24 · 858 阅读 · 0 评论 -
jdk8中的metaspace
概述metaspace,顾名思义,元数据空间,专门用来存元数据的,它是jdk8里特有的数据结构用来替代perm,这块空间很有自己的特点,前段时间公司这块的问题太多了,主要是因为升级了中间件所致,看到大家讨论来讨论去,看得出很多人对metaspace还是模棱两可,不是很了解它,因此我觉得有必要写篇文章来介绍一下它,解开它神秘的面纱,当我们再次碰到它的相关问题的时候不会再感到束手无策。通过这篇文章,你...转载 2018-06-20 21:21:46 · 3961 阅读 · 0 评论 -
java内存模型中的happens-before
java内存模型中的happens-before 1)概念:JMM用happens-before的概念来指定两个操作之间的执行顺序,这两个操作可以在一个线程内,也可以在不同线程之间,并且保证了内存的可见性。 2)happens-before的定义: 1)从程序员的角度看: 如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个原创 2017-10-09 22:31:32 · 504 阅读 · 0 评论 -
CAS(Compare and Swap)算法
CAS(Compare and Swap)算法: 1)原理: 1)CAS有3个操作数,内存值V,预期值(旧值)A,要写入的新值B。 2)当且仅当 预期值A=内存值V 时,将内存值V修改为新值B,否则什么都不做。 3)CAS可以看作是一种乐观锁。 2)应用:用于管理对共享数据的并发访问。 3)CAS存在的问题: 1)ABA问题:如果一个变量的值原来是A,然...原创 2017-10-09 22:02:44 · 978 阅读 · 0 评论 -
java进程意外退出
java进程意外退出: jvm crash导致进程意外退出: 当jvm出现致命错误时,会生成一个错误文件 hs_err_pid.log ,可根据这个日志文件来分析进程挂掉的原因。 非jvm crash导致进程意外退出: 常见的case:系统内存不足,系统主动kill掉进程,即linux的OOM-killer机制。 排查: dmesg | grep java | g...原创 2020-01-07 21:03:05 · 1498 阅读 · 0 评论 -
NoClassDefFoundError异常分析 & 类的立即加载
NoClassDefFoundError异常分析 & 类的立即加载现象:Java进程启动后,在new TestClassByJxn()对象时,抛出异常:java.lang.NoClassDefFoundError: com/jxn/TestClassByJxn原因: java进程启动后,并不会立即加载TestClassByJxn类,当new TestClassByJxn()对...原创 2019-12-03 20:07:13 · 649 阅读 · 0 评论 -
采用延迟初始化来降低初始化类和创建对象的开销
在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销。CASE: public class Singleton{ private static Singleton instance = null; private Singleton(){ // 将构造函数私有化 } public static Singleton ge原创 2017-10-09 22:26:42 · 1223 阅读 · 0 评论 -
java对象的内存布局
HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。1)对象头:包括标记字段和类型指针两部分内容(注:如果是数组对象,则包含三部分内容): 1)Mark Word(标记字段):用于存储运行时对象自身的数据。 1>占用内存大小与虚拟机位长一致,在运行期间,考虑到JVM的空间效率,Mark Word被设计成为一个非固定的数据结构,以便存储更多有效的数据。原创 2017-10-09 21:32:33 · 1858 阅读 · 1 评论