JVM
文章平均质量分 80
点滴~
进阶中的工程师
展开
-
JVM调优6大步骤
对JVM内存的系统级的调优主要的目的是:减少GC的频率和Full GC的次数。Full GC会对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个堆进行回收,所以比较慢,因此应该尽可能减少Full GC的次数。导致Full GC的原因1)年老代(Tenured)被写满调优时尽量让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要创建过大...转载 2020-04-20 16:51:35 · 365 阅读 · 1 评论 -
GC垃圾回收器:CMS收集器和G1收集器优缺点
原创 2018-11-28 13:31:33 · 1546 阅读 · 0 评论 -
写代码实现栈溢出、堆溢出、永久代溢出、直接内存溢出
栈溢出(StackOverflowError) 堆溢出(OutOfMemoryError:Java heap space) 永久代溢出(OutOfMemoryError: PermGen space) 直接内存溢出一、堆溢出创建对象时如果没有可以分配的堆内存,JVM就会抛出OutOfMemoryError:java heap space异常。堆溢出实例:/*** 堆溢出...转载 2018-10-26 12:11:40 · 2315 阅读 · 0 评论 -
深入拆解Java虚拟机
转载 2018-10-01 20:08:47 · 532 阅读 · 0 评论 -
什么是java OOM?如何分析及解决OOM问题?
最近查找了很多关于OOM,甚至于Java内存管理以及JVM的相关资料,发现这方面的东西太多了,竟有一种眼花缭乱的感觉,要想了解全面的话,恐非一篇文章能说清的,因此按照自己的理解整理了一篇,剩下的还需要继续学习。1)什么是OOM?OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError。看下关于的官方说明: Thrown w...转载 2018-06-05 10:43:49 · 828 阅读 · 0 评论 -
JVM是什么?
JVM(Java Virtual Machine,Java虚拟机) Java程序的跨平台特性主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行,Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码进行运行。因此在运行时,Java源程序需要通过编译器编译成为.class文件。众所周知java.exe是java class文件的执行程序,但实际上jav...转载 2018-04-06 21:45:59 · 1776 阅读 · 0 评论 -
深入理解JVM之六:类加载机制
前言虚拟机的类加载机制可以简单描述如下:Java虚拟机把描述类的数据从Class文件中加载到内存中,并对数据进行校验、解析和初始化,最终形成可以被虚拟机直接使用的Java类型。虚拟机加载进行类加载的过程是在程序运行期间完成的,在程序运行期间加载的好处是可以动态扩展,说白了就是在编译期间虚拟机是不知道要加载哪些类或者接口的,只有在程序运行的时候才知道需要加载的类。举个例子,我们在一个包下面写了很多类...转载 2018-04-11 12:16:12 · 134 阅读 · 0 评论 -
深入理解JVM之五:类文件结构
前言我们平时在DOS界面中往往需要运行先运行javac命令,这个命令的直接结果就是产生相应的class文件,然后基于这个class文件才可以真正运行程序得到结果。自然。这是Java虚拟机的功劳,那么是不是Java虚拟机只能编译.java的源文件呢?答案是否定的。时至今日,Java虚拟机已经实现了语言无关性的特点。而实现语言无关性的基础是虚拟机和字节码的存储格式,Java虚拟机已经不和包括Java语...转载 2018-04-11 12:13:48 · 105 阅读 · 0 评论 -
深入理解JVM之四:详解垃圾收集器
前言前面已经对垃圾收集算法有了较为详细的介绍,这里我们将对JVM中具体的垃圾回收器进行介绍,在虚拟机规范中并没有对垃圾回收器如何实现具体介绍,因此每个厂商的垃圾回收器可能会完全不同,但是我们介绍的是基于JDK1.7之后的Hotspot虚拟机(包括前面对Java虚拟机的介绍也是基于jdk1.7版本的)。在Hotspot中,虚拟机的收集器主要有下:可以看到垃圾收集器是按对象的分代来划分的,可以用线条连...转载 2018-04-11 12:12:23 · 127 阅读 · 0 评论 -
深入理解JVM之三:垃圾回收算法
前言垃圾收集算法是JVM中垃圾收集器的方法论,所以了解算法是必要的,在算法领域只做最简单的介绍,力求文章的简单易懂。垃圾收集算法主要有以下几种:标记-清除算法(mark-sweep)、复制算法(copying)和标记-整理算法(mark-compact)。随着jdk版本的升级,垃圾收集器也在不断的升级,现在最新的垃圾收集器已经能够对Java堆中一部分进行回收,也能够对Java堆中另一部分进行回收,...转载 2018-04-11 12:11:03 · 149 阅读 · 0 评论 -
深入理解JVM之七:静态分派与动态分派
前言这里所谓的分派指的是在Java中对方法的调用。Java中有三大特性:封装、继承和多态。分派是多态性的体现,Java虚拟机底层提供了我们开发中“重写”和“重载”的底层实现。其中重载属于静态分派,而重写则是动态分派的过程。除了使用分派的方式对方法进行调用之外,还可以使用解析调用,解析调用是在编译期间就已经确定了,在类装载的解析阶段就会把符号引用转化为直接引用,不会延迟到运行期间再去完成。而分派调用...转载 2018-04-11 12:09:31 · 257 阅读 · 0 评论 -
深入理解JVM之二:垃圾收集器概述
前言我们知道Java的内存区域分为程序计数器、虚拟机栈、本地方法栈、Java堆和方法区,而且其中的程序计数器、虚拟机栈和本地方法栈都是线程独立的,也就是说这三块内存区域的生命周期与线程是同生共死的。栈中帧栈在类结构确定的时候就已经知道该分配多少内存了,所以当线程结束的时候,内存也跟着一起回收了,从这个角度看,这三块的内存区域的内存分配和垃圾收集就比较固定了。反观Java堆和方法区,比如我们定义一个...转载 2018-04-10 23:27:42 · 112 阅读 · 0 评论 -
深入理解JVM之一:Java内存区域
前言Java虚拟机运行时数据区分为以下几个部分: 方法区、虚拟机栈、本地方法栈、堆、程序计数器。如下图所示:程序计数器程序计数器可以理解为当前线程执行的字节码的行号指示器,字节码解释器就是通过改变这个值来获取需要执行的下一条需要执行的字节码指令。对于多线程来说,每条线程都有自己的程序计数器,这样各线程之间的计数器互不影响,这类内存区域也叫作“私有内存”(可以看到其实并不是私有的),之所以这么设计,...转载 2018-04-10 22:58:18 · 112 阅读 · 0 评论 -
JVM:类加载过程
类加载的过程 接下来我们详细讲解一下Java虚拟机中类加载的全过程,也就是加载、验证、准备、解析和初始化这5个阶段所执行的具体动作。加载 “加载”是“类加载”( Class Loading)过程的一个阶段,希望读者没有混滑这两个看起来很相似的名词,在加载阶段,虚拟机需要完成以下3件事情1)通过一个类的全限定名来获取定义此类的二进制字节流。2)将这个字节流所代表的静态存储结构转...原创 2018-04-07 15:43:56 · 157 阅读 · 0 评论