jvm

JVM笔记九-GC收集器日志信息学习

在上一篇文章中,我们通过代码运行结果,查看到JVM的堆内存逻辑上分区是三部分,物理上分区是2部分,以及是新生代分区三部分,占比分布是8/1/1。而且我们还通过代码和堆JVM参数配置,制造出了OOM异常。下面我们就来分析GC回收器的日志信息。 先来看看,OOM后,GC详细日志信息: 编辑 编辑 新生区的伊甸园区GC日志分析 新生区的Eden区的GC,叫法:GC或者是YGC或者是MinorGC或者是轻GC 我们复制一条来分析: [GC (Allocation Failure①) [PSYoungGen: 1877K②->472K③(2048K④)] 3697⑤K->2835K⑥(7680K⑦),...

JVM笔记八-堆参数调优

JVM垃圾收集器(Java Garbage Collection)。本教程均在JDK1.8+HotSpot为例来讲解的. 先来看看Java7的: 编辑 再来看看Jva8的 编辑 从上图中我们可以看出,java8之后换成了元空间。那么怎么证明,堆区是有新生代、永久代、元空间三部分组成的呢?OOM这个错误我们都熟悉,那么怎么手动制造出一个OOM呢?如果16G的物理内存,JVM堆内存能够分到多少G的内存空间呢?我们带着这些疑问来一起学习吧 在Java8中,永久带已经被移除了,被一个称为元空间的区域所取代。元空间的本质和永久带类似。 元空间与永久带之间最大的区别在于: 永久带使用的是JVM的堆内存空间...

JVM笔记六-堆区知识之对象生命周期和GC的关系

通过上一篇文章的学习,我们对JVM堆区有了初步的认识,接下来,我们继续展开讲解堆区。 对象生命周期和GC的关系。 我们已经知道了,堆区的新生区分成了三个部分:伊甸园区、幸存者0区、幸存者1区。 其中0区也叫from,1区也叫to区。但是这个from和to是固定不变的吗?NO,NO,NO不是的。当新生区执行一次GC(YGC)后,from和to区会进行交换。交换后,也就是在GC之后,谁空谁是to区。所以,from区和to区的位置和名分不是一成不变的。会发生变化的。 Java堆从GC的角度可以分为:新生区和老年代。这个是从物理分的。 编辑 新生代和老年代,占用堆区的比例是:1比2...

hs_err_pid.log日志,有趣的两个Jvm参数

遇到一个很有意思的问题,Jvm进程因系统资源不足时会被操作系统kill掉,当守护进程重新拉起该进程时,会产生一个日志文件:hs_err_pid.log,默认情况下这个日志会被生成到工作目录下。今天为了修改这个默认路径,复现了一下Jvm进程OOM后Crash的情况。 那么OOM究竟会不会导致Jvm进程被Crash掉呢?今天上网查了下资料和自己测试了下,结果是oom不会导致Jvm进程被Crash,而是oom只会导致当前线程被回收掉。 如何复现这个问题呢?有意思的是,发现了一个很有意思的Jvm参数 -XX:+CrashOnOutOfMemoryError,这个参数的大概意思是:当发生内存溢出的时...

JVM 判断对象已死亡?

本节常见面试题 如何判断对象是否死亡(两种方法)。 简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。 如何判断一个常量是废弃常量 如何判断一个类是无用的类 堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断那些对象已经死亡(即不能再被任何途径使用的对象)。 2.1 引用计数法 给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的。 这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管理内存...

内存模型学习-- Container Executor task之间的关系

(分割线前的都是废话) java8内存模型: http://www.cnblogs.com/paddix/p/5309550.html http://www.cnblogs.com/dingyingsi/p/3760447.html 帖子里提到 5、方法区: 方法区也是所有线程共享。主要用于存储类的信息、常量池、方法数据、方法代码等。 方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。 1.7和1.8后这个方法区 没有了,被原空间取代了 不过元空间与永久代之间最大的区别在于: 元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制...

JVM类加载器(二)

一个类加载器对象主要用于负责加载类,当我们将一个字符串形式的类名作为参数,传给类加载器的方法去加载类的时候,类名必须满足Java所规定的二进制名字。什么是二进制名字呢?比如下面几个例子: java.lang.String javax.swing.JSpinner$DefaultEditor java.security.KeyStore$Builder$FileBuilder$1 java.net.URLClassLoader$3$1 其中,上面的第三和第四个例子可能比较难懂。第三个例子代表KeyStore内部类的Builder的第一个匿名内部类(KeyStore$Builder...

JVM类加载器(一)

Java类加载器 Java虚拟机自带的加载器: 根类加载器(Bootstrap):该加载器没有父加载器,它负责加载虚拟机中的核心类库。根类加载器从系统属性sun.boot.class.path所指定的目录中加载类库。类加载器的实现依赖于底层操作系统,属于虚拟机的实现的一部分,它并没有集成java.lang.ClassLoader类。 扩展类加载器(Extension):它的父加载器为根类加载器。它从java.ext.dirs系统属性所指定的目录中加载类库,或者从JDK的安装目录的jre\lib\ext子目录(扩展目录)下加载类库,如果把用户创建的jar文件放在这个目录下...

性能测试JVM问题分析和优化

一,JVM内部结构 JVM内存结构分为:方法区(method),栈内存(stack),堆内存(heap),本地方法栈(java中的jni调用)、程序计数器 JVM中有堆和非堆(我们有的时候称为栈)两个区域: 堆空间(heap)说明: 说明:堆里面主要放对象,变量。非堆中主要放类,方法,线程栈----主要就是方法和栈 年轻代的说明: 1,堆内存中有年轻代(新生代)和老年代(老生代),比例为3/8和5/8(占用比例是可以配置的) 2,年轻代的主要作用就是用来存放java程序新new出来的对象 3,年轻代中又分为2块:年轻代区(年轻代区又称为伊甸园区)和存活区,其中存活区又分s0和s1...

深入理解 JVM锁 与 分布式锁

锁用来解决什么问题呢? 在我们编写的应用程序或者高并发程序中,不知道大家有没有想过一个问题,就是我们为什么需要引入锁?锁为我们解决了什么问题呢? 在很多业务场景下,我们编写的应用程序中会存在很多的 资源竞争 的问题。而我们在高并发程序中,引入锁,就是为了解决这些资源竞争的问题。 电商超卖问题 这里,我们可以列举一个简单的业务场景。比如,在电子商务(商城)的业务场景中,提交订单购买商品时,首先需要查询相应商品的库存是否足够,只有在商品库存数量足够的前提下,才能让用户成功的下单。下单时,我们需要在库存数量中减去用户下单的商品数量,并将库存操作的结果数据更新到数据库中。整个流程我们可以简化成下图所示...