
jvm
马彼得
平常心
展开
-
Java jvm参数在线调优工具
HeapDump - Java虚拟机参数分析https://opts.console.heapdump.cn/原创 2022-02-24 16:57:19 · 873 阅读 · 0 评论 -
JVM: G1和CMS的区别
JVM: G1和CMS的区别_爱笑的k11的博客-CSDN博客转载 2021-09-12 19:48:05 · 334 阅读 · 0 评论 -
Java不同的包下相同的类名的问题与解决办法
参考:https://www.cnblogs.com/zhusen/p/12162222.html转载 2021-01-27 20:48:45 · 3232 阅读 · 0 评论 -
JAVA 回收方法区
参考:https://zhuanlan.zhihu.com/p/43697856转载 2021-01-27 20:46:43 · 158 阅读 · 0 评论 -
了解JVM:三种执行模式:解释模式、编译模式、混合模式
解释模式通过解释器(Bytecode Interpreter)解释执行 特点:启动快(不需要编译),执行慢 可通过-Xint参数指定为纯解释模式编译模式由JIT(Just In-Time Compiler)编译为本地代码(C语言实现)执行 特点:启动慢(编译过程较慢),执行快 可通过-Xcomp参数指定为纯编译模式混合模式混合使用解释器 + 热点代码编译 起始阶段采用解释执行 热点代码检测(HotSpot),默认-XX:CompileThreshold=10000 多次被调用的转载 2021-01-22 14:58:45 · 1081 阅读 · 1 评论 -
Jvm堆内存不包括永久代
堆大小 =新生代 + 老年代。其中,堆的大小可以通过参数 –Xms、-Xmx 来指定。永久代有它自己的大小 -XX:PermSize 永久代(方法区)的初始大小 -Xms 初始堆大小。如:-Xms256m -Xmx 最大堆大小。如:-Xmx512m ...原创 2020-10-04 00:47:24 · 628 阅读 · 0 评论 -
JAVA-JVM的钩子函数
当jvm进程退出的时候,或者受到了系统的中断信号,hook线程就会启动,一个线程可以注入多个钩子,这是一个实例:import java.io.IOException;import java.util.concurrent.TimeUnit;public class HookTest { public static void main(String[] args) throws IOException { Runtime.getRuntime().addShutdownHo转载 2020-08-28 14:03:26 · 1271 阅读 · 0 评论 -
JVM-服务器预热-JIT编译
如下图所示,编译器可以分为:前端编译器、JIT 编译器和AOT编译器。下面我们逐个讲解。前端编译器:源代码到字节码之前我们说到:对于 Java 虚拟机来说,其实际输入的是字节码文件,而不是 Java 文件。那么对于 Java 语言而言,其实怎么将 Java 代码转化成字节码文件的呢?我们知道在 JDK 的安装目录里有一个 javac 工具,就是它将 Java 代码翻译成字节码,这个工具我们叫做编译器。相对于后面要讲的其他编译器,其因为处于编译的前期,因此又被成为前端编译器。通过 java转载 2020-08-28 13:48:20 · 1866 阅读 · 0 评论 -
Java线程内存模型和线程
引子在物理机中,并发执行多个任务,充分利用计算机处理器的性能,看起来顺理成章,但实际上并不像看起来那么简单。其中一个重要的原因就是绝大多数的任务不能只靠处理器“计算”就能完成,处理器至少要与内存交互,比如读取、存储数据,这个I/O操作是很难消除的。而储存设备和处理器的运算速度差了好几个量级,所以引入了高速缓存(cache)来作为缓冲。即将运算要使用的数据复制到缓存,让运算快速进行,运算结束后从缓存同步回主存,这样处理器就无须等待缓慢的内存读写了。虽然解决了处理器和内存的速度矛盾,但是引入了新的问题:转载 2020-06-15 15:01:06 · 184 阅读 · 0 评论 -
线程池的submit和execute方法区别
1.接收的参数不一样;2.submit()有返回值,而execute()没有;例如,有个validation的task,希望该task执行完后告诉我它的执行结果,是成功还是失败,然后继续下面的操作。3.submit()可以进行Exception处理;例如,如果task里会抛出checked或者unchecked exception,而你又希望外面的调用者能够感知这些exception并做出及时的处理,那么就需要用到submit,通过对Future.get()进行抛出异常的捕获,然后对...原创 2020-05-16 19:11:26 · 1065 阅读 · 0 评论 -
单核cpu多线程有必要吗?
通常一个任务不光 cpu 上要花时间, io 上也要花时间(例如去数据库查数据,去抓网页,读写文件等)。 一个进程在等 io 的时候, cpu 是闲置的,另一个进程正好可以利用 cpu 进行计算。 多几个进程一起跑,可以把 io 和 cpu 都跑满了。现在一般都是虚拟资源,资源有弹缩机制,所以一般该跑多线程的时候就可以跑多线程。单核cpu多线程有必要吗?问题分析#现代计算机一般都是多...原创 2020-05-13 00:24:52 · 7358 阅读 · 2 评论 -
JAVA8 G1 CMS 区别
1.堆(Heap)空间分配不同CMS 将堆逻辑上分成Eden,Survivor(S0,S1),Old,并且他们是固定大小JVM启动的时候就已经设定不能改变,并且是连续的内存块 G1 将堆分成多个大小相同的Region(区域),默认2048个,在1Mb到32Mb之间大小,逻辑上分成Eden,Survivor,Old,巨型,空闲,他们不是固定大小,会根据每次GC的信息做出调整2.并发标记阶段三色标记算法处理结果不同CMS 在三色标记算法阶段,如果将白色对象重新分配给黑色对象时,在分配期间采用增量更新转载 2020-05-11 14:18:07 · 2461 阅读 · 0 评论 -
G1-Card Table和Remember Set
这两个数据结构是专门用来处理Old区到Young区的引用。Young区到Old区的引用则不需要单独处理,因为Young区中的对象本身变化比较大,没必要浪费空间去记录下来。RSet:全称Remembered Sets, 用来记录外部指向本Region的所有引用,每个Region维护一个RSet。 Card: JVM将内存划分成了固定大小的Card。这里可以类比物理内存上page的概念。下图展示的是RSet与Card的关系。每个Region被分成了多个Card,其中绿色部分的Card表示该Card中转载 2020-05-11 14:10:35 · 6666 阅读 · 2 评论 -
Java服务器应用崩溃的原因(2)
Java的应用有时候会因为各种原因Crash,这时候会产生一个类似java_errorpid.log的错误日志。可以拿到了这个日志,怎样分析Crash的原因呢?下面我们来详细讨论如何分析java_errorpid.log的错误日志。一. 如何得到这个日志文件如果有一个严重的错误引起Java进程非正常退出,我们叫Crash,这时候会产生一个日志文件。缺省情况下,这个文件会产生在工作目录下。但是...转载 2020-05-04 00:49:41 · 1931 阅读 · 0 评论 -
Java服务器应用崩溃的原因(1)
像这种大型视频网站服务器都能遇到服务器崩溃的突发问题,何况中小型企业的服务器呢那么问题来了,致使服务器崩溃的原因有哪些?服务器用户又该如何去避免这些问题的出现?一般来说,服务器崩溃的原因主要有以下几点:访问峰值或请求超过服务器的承受力第一,访问峰值或请求超过服务器的承受力企业平时租用和托管的服务器是有峰值承受限制的,一旦超过了该承受能力,就会导致服务器瘫痪,网站访问不了,而出现这样...转载 2020-05-04 00:48:39 · 1387 阅读 · 0 评论 -
java面试-什么是GC root
哪些对象可以作为 GC Roots 的对象:虚拟机栈中局部变量(也叫局部变量表)中引用的对象 方法区中类的静态变量、常量引用的对象 本地方法栈中 JNI (Native方法)引用的对象public class GCRootDemo { private byte[] byteArray = new byte[100 * 1024 * 1024]; private s...转载 2020-05-01 21:52:24 · 1239 阅读 · 0 评论 -
并发收集器和并行收集器的区别
并行收集器(parallel)多条垃圾收集线程同时进行工作,此时用户线程处于等待状态并发收集器(concurrent)指多条垃圾收集线程与用户线程同时进行(但不一定是并行的,有可能交替进行工作)如cms就是典型的并发收集器...原创 2020-05-01 19:33:03 · 1230 阅读 · 0 评论 -
CMS参数调优
1:-XX:+UseConcMarkSweepGCCMS全称 Concurrent Mark Sweep,是一款并发的、使用标记-清除算法的垃圾回收器,如果老年代使用CMS垃圾回收器,需要添加虚拟机参数-"XX:+UseConcMarkSweepGC"。2:– XX:CMSInitiatingOccupancyFraction =nCMS的另一个缺点是它需要更大的堆空间。因为C...转载 2020-05-01 17:39:25 · 6723 阅读 · 0 评论 -
JVM性能调优监控工具jps、jmap、jstack、jstat使用详解
方式一、top jmap定位1:测试程序import java.util.ArrayList;import java.util.List;/** * @author yuchen * @version 1.0 * @date 2020-04-29 14:29 */public class JvmTest { public static void main(Str...原创 2020-04-29 20:48:11 · 999 阅读 · 0 评论 -
G1垃圾收集
https://www.cnblogs.com/webor2006/p/11147545.html转载 2020-04-27 14:57:49 · 159 阅读 · 0 评论 -
CMS并发标记清除收集器
并发标记清除收集器组合 ParNew + CMS + Serial Old开启选项:-XX:+UseConcMarkSweepGC并发标记清除(CMS)是以关注延迟为目标、十分优秀的垃圾回收算法,开启后,年轻代使用STW式的并行收集,老年代回收采用CMS进行垃圾回收,对延迟的关注也主要体现在老年代CMS上。年轻代ParNew与并行收集器类似,而老年代CMS每个收集周期都要经历...转载 2020-04-22 20:38:16 · 1110 阅读 · 0 评论 -
class文件常量池和运行时常量池
最近一直被方法区里面存着什么东西困扰着? 1.方法区里存class文件信息和class文件常量池是个什么关系。 2.class文件常量池和运行时常量池是什么关系。 方法区存着类的信息,常量和静态变量,即类被编译后的数据。这个说法其实是没问题的,只是太笼统了。更加详细一点的说法是方法区里存放着类的版本,字段,方法,接口和常量池。常量...转载 2020-04-22 14:10:57 · 1019 阅读 · 1 评论 -
字符串常量池、class常量池和运行时常量池
在java的内存分配中,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上说法都有问题,笔者尝试着来区分一下这几个概念。1.全局字符串池(string pool也有叫做string literal pool)全局字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符...转载 2020-04-22 14:07:27 · 207 阅读 · 0 评论 -
java中String s = new String("abc")创建了几个对象
一、java中String s = new String("abc")创建了几个对象答案是两个,现在我们具体的说一下:String s = new String("abc");首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量。所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字池中...转载 2020-04-22 13:34:41 · 11314 阅读 · 6 评论 -
引用传递和值传递的jvm解释
一.基本类型的值传递示例代码:public class ByValueDemo1 { public static void main(String[] args) { int num = 10; changeValue(num); System.out.println("main:num="+num); // ? } ...转载 2020-04-21 19:42:42 · 326 阅读 · 0 评论 -
JVM内存区域,开线程影响哪块内存
JVM运行时数据区概括地说来:JVM初始运行的时候都会分配好Method Area(方法区)和Heap(堆),而JVM 每遇到一个线程,就为其分配一个Program Counter Register(程序计数器), VM Stack(虚拟机栈)和Native Method Stack (本地方法栈),当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释...转载 2020-01-07 18:01:48 · 572 阅读 · 0 评论 -
Java Minor GC、Major GC和Full GC之间的区别以及触发条件
1:Java Minor GC、Major GC和Full GC之间的区别Minor GC Minor GC指新生代GC,即发生在新生代(包括Eden区和Survivor区)的垃圾回收操作,当新生代无法为新生对象分配内存空间的时候,会触发Minor GC。因为新生代中大多数对象的生命周期都很短,所以发生Minor GC的频率很高,虽然它会触发stop-the-world,但是它的回收速度很...转载 2019-12-31 14:49:21 · 4097 阅读 · 2 评论 -
java中int与Integer用==比较详解
前言:越是简单的东西,我们往往越是没有去把它明白,但我们大部分时间又常常在用,就像我们今天说的int与Integer的使用,我们程序员基本天天都在用,但是我今天没用详细弄清楚之前我也是不清楚,我们来看看这两个在用==号比较给我们带来的疑问。先看看下面的代码,看看我们是否都会 @Test public void testEquals() { int...转载 2019-12-31 10:58:55 · 412 阅读 · 0 评论 -
方法区(Method Area)存储的方法(Method)
程序运行时会加载类编译生成的字节码,这个过程中静态变量(类变量)和静态方法及普通方法对应的字节码加载到方法区。 但是!!!方法区中没有实例变量,这是因为,类加载先于对应类对象的产生,而实例变量是和对象关联在一起的,没有对象就不存在实例变量,类加载时没有对象,所以方法区中没有实例变量 静态变量(类变量)和静态方法及普通方法在方法区(Method Area)存储方式是有区别的 ...原创 2019-12-31 10:56:23 · 360 阅读 · 0 评论 -
方法区(Method Area)存储的静态变量
1:方法区(Method Area)存储的静态变量静态变量又称为类变量,类中被static修饰的成员变量都是静态变量(类变量)静态变量之所以又称为类变量,是因为静态变量和类关联在一起,随着类的加载而存在于方法区(而不是堆中)八种基本数据类型(byte、short、int、long、float、double、char、boolean)的静态变量会在方法区开辟空间,并将对应的值存储在方法方...原创 2019-12-31 10:54:21 · 2376 阅读 · 2 评论 -
栈帧(Stack Frame)结构
栈帧(Stack Frame)结构栈帧是用于支持虚拟机进行方法执行的数据结构,是属性运行时数据区的虚拟机站的栈元素。见上图, 栈帧包括:局部变量表 (locals大小,编译期确定),一组变量存储空间, 容量以slot为最小单位。 操作栈(stack大小,编译期确定),操作栈元素的数据类型必须与字节码指令序列严格匹配 动态连接, 指向运行时常量池中该栈帧所属方法的引用,为了 动态连接使用...转载 2019-12-30 15:56:12 · 900 阅读 · 0 评论 -
Java方法区
方法区(Method Area)① 对每个加载的类型,JVM必须在方法区中存储以下类信息:1) 这个类型的完整有效名(类型信息)类型名称在Java类文件和JVM中都以完整有效名出现。在java源代码中,完整有效名由类的所属包名称加一个".",再加上类名组成。例如,类Object的所属包为java.lang,那它的完整有效名为java.lang.Object,但在...转载 2019-12-30 15:18:19 · 252 阅读 · 0 评论 -
写入运行时常量池的2种渠道
我们了解到类的字节码在加载时会被解析并生成不同的东西存入方法区。类的字节码中不仅包含了类的版本、字段、方法、接口等描述信息,还包含了一个常量池。字面量 进入运行时常量池的2种方式:常量池用于存放在字节码中使用到的所有字面量(是用于表达源代码中一个固定值的表示法(如文本字符串,声明为final的常量值等))和符号引用(符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用...原创 2019-12-30 14:35:31 · 171 阅读 · 1 评论 -
可达性分析算法中不可达的对象-非是“非死不可”
生存还是死亡?即使在可达性分析算法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚...转载 2019-12-30 14:01:16 · 1070 阅读 · 1 评论 -
Java强引用、软引用、弱引用、虚引用垃圾回收都代码示例
1:强引用强引用就是指在程序代码之中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。Java中finalize()方法的使用:finalize()方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。其在Object中定义如下:p...转载 2019-12-30 12:00:14 · 223 阅读 · 0 评论 -
java静态方法之线程安全问题
静态方法和实例方法的区别是静态方法只能引用静态变量,静态方法通过类名来调用,实例方法通过对象实例来调用 每个线程都有自己的线程栈,栈与线程同时创建,每一个虚拟机线程都有自己的程序计数器PC,在任何时刻,一个虚拟机线程只会执行一个方法的代码,这个方法称为该线程的当前方法,如果这个方法不是native的,程序计数器就保存虚拟机正在执行的字节码指令的地址。 线程调用方法的时候会创建栈帧,用于保存局部...原创 2019-12-27 17:55:47 · 560 阅读 · 0 评论 -
Java中值传递和引用传递的理解
一、基本类型和引用类型的理解Java中的数据类型分为两种为基本类型和引用类型。1、基本类型的变量保存原始值,所以变量就是数据本身。常见的基本类型:byte,short,int,long,char,float,double,Boolean,returnAddress。2、引用类型的变量保存引用值,所谓的引用值就是对象所在内存空间的“首地址值”,通过对这个引用值来操作对象。...转载 2019-12-16 18:03:06 · 120 阅读 · 0 评论 -
parallel scavenge 与parnew 区别:
Parallel Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器……看上去和ParNew都一样,那它有什么特别之处呢?Parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Through...转载 2019-02-24 13:33:29 · 14121 阅读 · 4 评论 -
Java对象内存分配策略
1. 对象优先在Eden分配大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。代码示例:private static final int _1MB = 1024 * 1024; /** * VM参数:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -...转载 2019-02-24 14:55:53 · 859 阅读 · 0 评论 -
Java垃圾回收(整理)
什么样的对象才是垃圾?怎样判断一个对象引用是不是垃圾? 垃圾回收算法:Mark-Sweep(标记-清除)算法,Copying(复制)算法,Mark-Compact(标记-整理)算法,分代收集算法Generational Collection,分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(...转载 2019-02-24 15:05:30 · 133 阅读 · 0 评论