![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
霁空
这个作者很懒,什么都没留下…
展开
-
JVM - 虚拟机
转载:https://www.cnblogs.com/guchunchao/p/10497177.html1. Sun Classic VM jdk1.0 第一款商用虚拟机。 只能使用纯解释器来运行Java代码。没有自己的判断,会把每一个方法每一行代码都编译,效率不好。导致大家普遍认为Java代码运行效率比较慢。 使用jit编译器的话需要外挂完全接管虚拟机的执...转载 2019-07-23 20:54:45 · 105 阅读 · 0 评论 -
JVM - 内存分配策略
Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存;回收分配给对象的内存。对象的内存分配,往大方向上讲就是在堆上的分配,对象主要分配在新生代的Eden区上。少数也可能分配在老年代,取决于哪一种垃圾收集器组合,还有虚拟机中的相关内存的参数设置。下面先简单介绍一下JVM中的年代划分:新生代、老年代、永久代(JDK1.8后称为元空间)。一、JVM堆的...转载 2019-08-26 20:13:13 · 120 阅读 · 0 评论 -
JVM - 内置工具使用
JDK内置工具使用jps(Java Virtual Machine Process Status Tool) 查看所有的jvm进程,包括进程ID,进程启动的路径等等。 jstack(Java Stack Trace) ①观察jvm中当前所有线程的运行情况和线程当前状态。 ②系统崩溃了?如果java程序崩溃生成core文件,jstack工具可以用来获得core...转载 2019-08-27 15:38:05 · 224 阅读 · 0 评论 -
JVM - 逃逸分析、栈上分配、标量替换、同步消除
一、逃逸分析逃逸分析是编译语言中的一种优化分析,而不是一种优化的手段。通过对象的作用范围的分析,为其他优化手段提供分析数据从而进行优化。逃逸分析包括:全局变量赋值逃逸 方法返回值逃逸 实例引用发生逃逸 线程逃逸:赋值给类变量或可以在其他线程中访问的实例变量.public class EscapeAnalysis { public static Object obje...转载 2019-08-29 21:51:45 · 513 阅读 · 0 评论 -
JVM - 排查Java内存泄漏
没有经验的程序员经常认为Java的自动垃圾回收完全使他们免于担心内存管理。这是一个常见的误解:虽然垃圾收集器做得很好,但即使是最好的程序员也完全有可能成为严重破坏内存泄漏的牺牲品。让我解释一下。当不必要地维护不再需要的对象引用时,会发生内存泄漏。这些泄漏很糟糕。首先,当程序消耗越来越多的资源时,它们会对计算机施加不必要的压力。更糟糕的是,检测这些泄漏可能很困难:静态分析通常很难精确识别这些冗余...转载 2019-08-30 17:50:18 · 625 阅读 · 1 评论 -
JVM - 优化案例(SoftRefLRUPolicyMSPerMB)
1、本文背景本文会给大家讲解一个比较特殊的JVM优化案例,这个优化案例本身是因为新手工程师对JVM优化可能了解了一个半吊子,然后不知道从哪里找来了一个非常特殊的JVM参数错误的设置了一下,就导致线上系统频繁的出现Full GC的问题。但是我们后续大量的优化案例其实都是各种各样奇形怪状的场景,因为正是各种奇怪场景才能让大家逐步积累出来较为丰富的JVM优化实战经验了解的场景越多,自己未来在...转载 2019-09-10 15:31:15 · 19463 阅读 · 9 评论 -
JVM - Class类文件结构
1.Class类文件结构 Class 文件是一组以 8 位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件之中,中间没有添加任何分隔符,这使得整个 Class 文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。 当遇到需要占用 8 位字节以上空间的数据项时,则会按照高位在前(Big-Endian)的方式分割成若干个 8 位字节进行存储。...转载 2019-09-16 11:35:32 · 113 阅读 · 0 评论 -
JVM - 字节码指令解释执行
JVM指令主要包含了一下几种类型:加载和存储指令、运算指令、类型转换指令、对象创建与访问指令、操作数栈管理指令、控制转移指令、方法调用和返回指令、异常处理指令、同步指令等。基于栈的解释器执行过程 下面看一下一个简单的代码片段,如下所示public class StackTest { public int calc() { int a = 100; int b...转载 2019-09-18 11:18:32 · 413 阅读 · 0 评论 -
JVM - 类加载过程及加载器
当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。一、类加载过程1.加载加载指的是将类的class文件读入到内存...转载 2019-09-18 16:03:23 · 88 阅读 · 0 评论 -
JVM - 运行时栈帧结构
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素。栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。第一个方法从调用开始到执行完成,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。每一个栈帧都包括了局部变量表,操作数栈,动态连接,方法返回地址和一些额外的附...转载 2019-09-19 20:01:30 · 90 阅读 · 0 评论 -
JVM - 垃圾回收器
图解HotSpot虚拟机所包含的收集器:图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。新生代收集器:Serial、ParNew、Parallel Scavenge老年代收集器:CMS、Serial Old、Parallel Old整堆收集器: G1几个相关概念:并行收...转载 2019-08-16 15:10:29 · 127 阅读 · 0 评论 -
JVM - 垃圾回收算法
垃圾回收算法有很悠久的历史。早在20 世纪 60 年代,Lisp 就开始采用垃圾回收器来自动管理内存。但是出于现实复杂的度、效率的考虑以及程序员的执念,使得自动管理内存在当时并没有流行起来。直到90 年代出现 java 大法。现在的大部分高级语言,如Python、Object-C、Swift、C#等都有相应的垃圾回收机制,只是在回收垃圾的实现上有差异。垃圾回收算法最简单的是标记-清除算法...转载 2019-08-14 10:53:13 · 121 阅读 · 0 评论 -
JVM - 内存区域
转载:https://www.cnblogs.com/vinsen/p/7873495.html一. 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. Java虚拟机所管理的内存将会包括以下几个运行时数据区域: 1...转载 2019-07-29 17:47:16 · 79 阅读 · 0 评论 -
JVM - 深入分析对象的内存布局
转载:https://www.cnblogs.com/zhengbin/p/6490953.html概述一个对象本身的内在结构需要一种描述方式,这个描述信息是以字节码的方法存储在方法区中的。Class 本身就是一个对象,都以 KB 为单位,如果 new Integer() 为了表示一个数据就占用KB级别的内存就有点不值了,下面讲解 JVM 是如何做的。为了表示对象的属性、方法等信息...转载 2019-07-30 17:43:43 · 89 阅读 · 0 评论 -
JVM - 对象的访问定位
转载:https://www.cnblogs.com/YYfish/p/6722258.htmlhttps://blog.csdn.net/Searchin_R/article/details/84348946虚拟机栈是 java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。局部变量表...转载 2019-07-30 17:49:28 · 142 阅读 · 0 评论 -
JVM - 模拟内存溢出(OOM)
一、代码:二、结果:三、设置dump堆快照,当发生OOM时:四、Mat打开进行分析原创 2019-07-22 20:40:34 · 1736 阅读 · 0 评论 -
JVM - TLAB
JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆、栈、方法区等介绍的比较清楚。上图,是一张在作者根据《Java虚拟机规范(Java SE 8)》中描述的JVM运行时内存区域结构画的。很多人都知道Java对象是在堆内存中分配空间的(JIT优化除外),也知道内存分配过程中是线程安全的,那么虚拟机到底是如何保证线程安全的呢?本文就来简单介绍一下。...转载 2019-08-05 18:04:06 · 1735 阅读 · 0 评论 -
interviews - jvm
Q1:JVM管理的内存结构是怎样的?Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。《Java虚拟机规范》中规定了JVM所管理的内存需要包括以下几个运行时区域:Java虚拟机运行时数据区域主要包含了PC寄存器(程序计数器)、Java虚拟机栈、本地方法栈、Java堆、方法区以及运行时常量池。各个区域有各自不同的作用,关于各个区域的作用就不在本文中...转载 2019-08-05 19:27:21 · 113 阅读 · 0 评论 -
e.printStackTrace() 导致系统卡崩
e.printStackTrace() 会导致锁死?这仅仅是打印啊,怎么可能?!先别惊呼不可能,且听我细细道来。先看截图1:注意右下角区域,红框部分。这块内存是什么呢?非堆!那么,左边是代码缓存区内存,右边红框就是字符串池,常量,基本类型数据的内存区。然后呢?已经满了。什么原因呢?e.printStackTrace()!满了的后果...转载 2019-08-09 10:57:03 · 1055 阅读 · 0 评论 -
JVM - 判断一个Java对象是否存活
1. 判断方式垃圾收集器对Java堆里的对象 是否进行回收的判断准则:Java对象是存活 or 死亡判断对象为死亡才会进行回收在Java虚拟机中,判断对象是否存活有2种方法: 引用计数法 引用链法(可达性分析法) 下面会进行详细介绍。2. 引用计数法2.1 方式描述给Java对象添加一个引用计数器 每当有一个地方引用它时,计数器 +1;引用失效则 -1;...转载 2019-08-13 20:45:24 · 273 阅读 · 0 评论 -
JVM - 对象在finalize()方法中复活
根搜索算法:这个算法的基本思路是通过一系列名为“GC roots”的对象作为起点,从这些节点开始向下搜索,搜索走过的路径称为引用连,当一个对象到GC roots没有任何引用链,则证明对象是不可用的。将被判定为可回收对象。不可达对象要被垃圾回收,至少要经历两次标记过程。第一次标记时执行finalize()方法,并做记号,第二次标记则不会再执行finalize()方法了。执行finalize()方法后...转载 2019-08-13 21:08:09 · 385 阅读 · 0 评论 -
JVM - 静态分派和动态分派
静态分派public class Solution { public void fun(Object i){ System.out.println("obbject"); } public void fun(Integer i){ System.out.println("Integer"); } public void fun(Float i){ Syste...转载 2019-09-19 20:08:00 · 123 阅读 · 0 评论