JVM
intimexy
这个作者很懒,什么都没留下…
展开
-
深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题
一.概述 定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。类加载和连接的过程都是在运行期间完成的。 二. 类的加载方式 1):本地编译好的class中直接加载 2):网络加载:java.net.URLClassLoader可以加载url指定的类 3):从jar、zip等等压缩...转载 2020-11-27 16:22:43 · 291 阅读 · 0 评论 -
JVM优化之 -Xss -Xms -Xmx -Xmn 参数设置
XmnXmsXmxXss有什么区别 Xmn、Xms、Xmx、Xss都是JVM对内存的配置参数,我们可以根据不同需要区修改这些参数,以达到运行程序的最好效果。 -Xms 堆内存的最小大小,默认为物理内存的1/64 -Xmx 堆内存的最大大小,默认为物理内存的1/4 -Xmn 堆内新生代的大小。通过这个值也可以得到老生代的大小:-Xmx减去-Xmn -Xss 设置每个线程可使用的内存大小,即栈的大小。在相同物...转载 2020-11-27 16:20:39 · 343 阅读 · 0 评论 -
JVM参数调优八大技巧
原帖地址:http://developer.51cto.com/art/201009/227078.htm 这里和大家分享一下JVM参数调优的八条经验,JVM参数调优,这是很头痛的问题,设置的不好,JVM不断执行FullGC,导致整个系统变得很慢,网站停滞时间能达10秒以上,相信通过本文的学习你对JVM参数调优有新的认识。 实例讲解JVM参数调优的八条经验 本文将介绍JVM参数调优,这是很头痛...转载 2020-11-27 16:18:40 · 203 阅读 · 0 评论 -
为什么执行引擎中既有解释器,又有JIT及时编译器?
执行引擎结构图 解释器特点 1、逐行解释字节码,逐行生成机器指令执行; 2、效率低; 3、响应速度块,拿到字节码,就开始执行; JIT特点 1、先进行编译,将字节码编译成本地机器指令; 2、响应速度慢,编译占用了时间,编译完成后才开始执行; 3、因为先编译,编译过程做了优化,执行效率比较高; 两者互补 1、对于一般代码,用解释器,这样响应快,给人的感觉就是速度快; 2、对于热点代码,用JI...转载 2020-11-26 16:34:22 · 134 阅读 · 0 评论 -
详解 JVM Garbage First(G1) 垃圾收集器
前言 Garbage First(G1)是垃圾收集领域的最新成果,同时也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命。如果使用Java 8/9,那么有很大可能希望对G1收集器进行评估。本文详细首先对JVM其他的垃圾收集器进行总结,并与G1进行了简单的对比;然后通过G1的内存模型、G1的活动周期,对G1的工作机制进行了介绍;同时还在介绍过程中,描述了可能需要引起注意的优化点。笔者希望通过本文,让有一定JVM基础的读者能尽快掌握G1的知识点。 第一章 概述 G1(Garbage .转载 2020-11-26 16:31:05 · 139 阅读 · 0 评论 -
JVM参数设置(吞吐量和响应时间性能调优)
文章目录 一、吞吐量与响应时间二、垃圾回收器算法比较三、JDK参数配置(IDEA中vm options)四、[GC日志设置以及日志的分析](https://blog.csdn.net/qq_21383435/article/details/80702205) 一、吞吐量与响应时间 吞吐量 = CPU在用户应用程序运行的时间 / (CPU在用户应用程序运行的时间 + CPU垃圾回收的时间)FULL GC,串行垃圾回收会使用应用停顿,响应用户时间长 二、垃圾回收器算法比较 串行回收算法:会..转载 2020-11-26 16:27:59 · 1064 阅读 · 0 评论 -
【JVM笔记】如何打破双亲委派机制?
以下主要为重写loadClass()和使用线程上下文类加载器这两种打破双亲委派模型方法的总结,并结合具体实例进行分析。 参考:破坏双亲委派模型 什么地方违反了双亲委派模型 以JDBC为例谈双亲委派模型的破坏 ...转载 2020-11-24 16:54:31 · 778 阅读 · 0 评论 -
为什么JVM CMS(并发表及和扫描)需要两次GC暂停
CMS回收器回收周期与短暂停开始,称为初始标志,标识初始设置活动对象直接到达的来自应用程序代码。然后,在并发标记阶段,收集器将标记所有可从该集合中传递到的活动对象。因为应用程序正在运行并在标记阶段发生时更新引用字段,所以并不是所有活动对象都会在并发标记阶段结束时进行标记。为了处理这个问题,应用程序再次停止第二次暂停,称为备注,通过重新访问在并发标记阶段修改的任何对象来完成标记。由于备注暂停比初始标记更为实质,因此多个线程并行运行以提高效率。 在备注阶段结束时,堆中的所有活动对象都会被标记,所以后续的并发清除原创 2020-11-24 16:04:48 · 422 阅读 · 0 评论 -
JVM关闭及线程的退出
JVM关闭及线程的退出 一,关闭方式 JVM的关闭意味着将停止系统中所有的任务,可以由其自动关闭也可以主动触发。下面的几个条件都可以使JVM关闭: 1,所有的非守护都已经运行结束。 2,调用了System.exit方法。 3,杀死JVM进程 4,通过系统平台发送关闭信号(比如按Ctrl+C) ...转载 2020-11-18 18:13:50 · 1172 阅读 · 0 评论 -
双亲委派机制
类加载器虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取此类的二进制字节流”这个动作放到 Java 虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。从 Java 虚拟机的角度来讲,只存在以下两种不同的类加载器: 启动类加载器(Bootstrap ClassLoader),使用 C++ 实现,是虚拟机自身的一部分所有其它类的加载器,使用 Java 实现,独立于虚拟机,并且全部继承自抽象类 java.lang.ClassLoader。 从转载 2020-11-06 19:23:52 · 67 阅读 · 0 评论 -
GC日志中sys时间比user时间长该如何处理?
原文在这里: GC日志中sys时间比user时间长该如何处理? GC日志中会详细的记录每一次GC事件所花费的时间信息,每一个GC事件所花费的时间都会以’user’、‘sys’、'real’3个维度来记录,这3个时间是什么意思呢?他们之间有什么区别?1.real time:GC事件整个过程自然流逝的绝对时间,这个跟钟表上的时间是一致的。(ps:如果GC从8点开始,8点30结束,real time就是30分钟)。 2.user time:cpu花在用户态的时间 3.sys time:cpu花在内核态的时转载 2020-11-04 18:12:00 · 521 阅读 · 0 评论 -
JVM中GC Root对象有哪些
众所周知,我们目前最常用的虚拟机hotspot使用可达性分析来进行垃圾回收,而可达性分析需要依赖GC Root。下面我就来介绍下可以作为GC Root的对象。 (一)虚拟机栈中引用的对象 虚拟机栈中的引用的对象可以作为GC Root。我们程序在虚拟机的栈中执行,每次函数调用调用都是一次入栈。在栈中包括局部变量表和操作数栈,局部变量表中的变量可能为引用类型(reference),他们引用的对象即可作为GC Root。不过随着函数调用结束出栈,这些引用便会消失。 (二)方法区中类静态属性引用的对象 简单的转载 2020-11-04 18:06:24 · 5087 阅读 · 1 评论 -
GC日志中real时间比user+sys时间长该如何处理
原文在这里: GC日志中real时间比user+sys时间长该如何处理? GC日志中会详细的记录每一次GC事件所花费的时间信息,每一个GC事件所花费的时间都会以’user’、‘sys’、'real’3个维度来记录,这3个时间是什么意思呢?他们之间有什么区别?1.real time:GC事件整个过程自然流逝的绝对时间,这个跟钟表上的时间是一致的。(ps:如果GC从8点开始,8点30结束,real time就是30分钟)。 2.user time:cpu花在用户态的时间 3.sys time:cpu花在转载 2020-11-03 20:32:14 · 877 阅读 · 0 评论 -
JVM实用参数 吞吐量与暂停时间
在实践中我们发现对于大多数的应用领域,评估一个垃圾收集(GC)算法如何根据如下两个标准: 吞吐量越高算法越好暂停时间越短算法越好首先让我们来明确垃圾收集(GC)中的两个术语:吞吐量(throughput)和暂停时间(pause times)。 JVM在专门的线程(GC threads)中执行GC。 只要GC线程是活动的,它们将与应用程序线程(application threads)争用当前可用CPU的时钟周...转载 2020-11-03 20:27:57 · 1659 阅读 · 0 评论 -
成员变量在堆内存里,局部变量在栈内存里
成员变量在堆内存里,局部变量在栈内存里。(基础类型)我有疑惑:既然成员变量存在于对象中,对象存在于堆中,所以成员变量存在于堆中。那么按照这样的推理,局部变量存在于方法中,而方法存在于对象中,对象存在于堆中,那是不是可以说局部变量存在于堆中?解决思想当对象new出来,实体存在于堆,对象的成员变量已经在堆上分配空间,但对象里面的方法是没有出现的,只出现方法的声明,方法里面的局部变量并没有创建。等到对象调用此方法时,为了加快运行的速度,方法中的局部变量才会在栈中创建,所以,方法中的局部变量是在栈...转载 2020-11-02 18:58:53 · 3428 阅读 · 1 评论 -
标记、清除算法是如何处理循环引用
目前的GC算法有两个大分类:引用计数与可达性。下面来说说引用计数法是如何统计所有对象的引用计数的,再对比分析可达性算法是如何解决引用技术算法的不足,好比说循环引用。循环引用 举个栗子:有两个对象,A引用B,B引用A。 这种情况下两个对象都存在引用,那么是否这两个对象就无法被GC了呢?先卖个关子,让我们记住这种情况,带着疑问往下读,接下来了解一下GC算法的一些概念。 GC采用的算法 1.引用计数算法:每个对象都有一个引用计数器,当对象被引用时计数器+1,对象引用失效的时候,引用计数器-1,当计数为0转载 2020-11-02 18:54:30 · 898 阅读 · 0 评论 -
JVM7、8详解及优化
1. JVM堆内存划分这两天看到下面这篇文章的图不错。 一图读懂JVM架构解析 1.1 JDK7及以前的版本 其中最上一层是Nursery内存,一个对象被创建以后首先被放到Nursery中的Eden内 存中,如果存活期超两个Survivor之后就会被转移到长时内存中(Old Generation)中。 永久内存中存放着对象的方法、变量等元数据信息。通过如果永久内存不够,就会得到如下错误: Java.lang.OutOfMemoryError: PermGen 1.2 JDK8版本转载 2020-10-25 17:06:03 · 781 阅读 · 1 评论 -
JVM 栈分配与TLAB
我们在学习使用Java的过程中,一般认为new出来的对象都是被分配在堆上,但是这个结论不是那么的绝对,通过对Java对象分配的过程分析,可以知道有两个地方会导致Java中new出来的对象并一定分别在所认为的堆上。这两个点分别是Java中的逃逸分析和TLAB(Thread Local Allocation Buffer)。本文首先对这两者进行介绍,而后对Java对象分配过程进行介绍。1. 逃逸分析1.1 逃逸分析...转载 2020-10-23 18:07:01 · 197 阅读 · 0 评论 -
JVM中的STW和CMS
Java中Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外)。Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互;这些现象多半是由于gc引起。GC时的Stop the World(STW)是大家最大的敌人。但可能很多人还不清楚,除了GC,JVM下还会发生停顿现象。JVM里有一条特殊的线程--VM Threads,专门用来执行一些特殊的VM Operation,比如分派.转载 2020-10-22 13:32:41 · 400 阅读 · 0 评论 -
java中什么样的对象才能作为gc root对象,gc root对象有哪些
GC管理的主要区域是Java堆,一般情况下只针对堆进行垃圾回收。方法区、栈和本地方法区不被GC所管理,因而选择这些区域内的对象作为GC roots,被GC roots引用的对象不被GC回收。 详细: GC Root 常说的GC(Garbage Collector) roots,特指的是垃圾收集器(Garbage Collector)的对象,GC会收集那些不是GC roots且没有被GC roots引用的对象。 一个对象可以属于多个root,GC root有几下种: Clas..转载 2020-10-22 13:30:06 · 828 阅读 · 0 评论 -
方法区中都包括什么
一、方法区与永久代这两个是非常容易混淆的概念,永久代的对象放在方法区中,就会想当然地认为,方法区就等同于持久代的内存区域。事实上两者是这样的关系:《Java虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。那么,在不同的 JVM 上方法区的实现肯定是不同的了。 同时大多数用的JVM都是Sun公司的HotSpot。在HotSpot上把GC分代收集扩展至方法区,或者说使用永久代来实现方法区。换句话说:方法区是一种规范,永久代是Hotspot针对这一规范的一种实现。而永久代本身也在迭转载 2020-10-20 18:10:53 · 3358 阅读 · 0 评论 -
为什么执行引擎中既有解释器,又有JIT及时编译器
执行引擎结构图 解释器特点 1、逐行解释字节码,逐行生成机器指令执行; 2、效率低; 3、响应速度块,拿到字节码,就开始执行; JIT特点 1、先进行编译,将字节码编译成本地机器指令; 2、响应速度慢,编译占用了时间,编译完成后才开始执行; 3、因为先编译,编译过程做了优化,执行效率比较高; 两者互补 1、对于一般代码,用解释器,这样响应快,给人的感觉就是速度快; 2、对于热点代码,用JI...转载 2020-10-19 18:14:11 · 129 阅读 · 0 评论 -
深入理解JVM字节码执行引擎
我们都知道,在当前的Java中(1.0)之后,编译器讲源代码转成字节码,那么字节码如何被执行的呢?这就涉及到了JVM的字节码执行引擎,执行引擎负责具体的代码调用及执行过程。就目前而言,所有的执行引擎的基本一致: 输入:字节码文件 处理:字节码解析 输出:执行结果。 物理机的执行引擎是由硬件实现的,和物理机的执行过程不同的是虚拟机的执行引擎由于自己实现的。 运行时候的栈结构 每一个线程都有一个栈,也就...转载 2020-10-19 18:07:36 · 119 阅读 · 0 评论 -
JVM的程序计数器
一、概念多线程的Java应用程序:为了让每个线程正常工作就提出了程序计数器(Programe Counter Register),每个线程都有自己的程序计数器这样当线程执行切换的时候就可以在上次执行的基础上继续执行,仅仅从一条线程线性执行的角度而言,代码是一条一条的往下执行的,这个时候就是程序计数器;JVM就是通过读取程序计数器的值来决定下一条需要执行的字节码指令,进而进行选择语句、循环、异常处理等;二、举例1.生活案例比如老王正在看片,他看到三十五分钟的时候,突然他的QQ好友苍老师给他开视频,这时转载 2020-10-19 18:03:03 · 190 阅读 · 0 评论