jvm
文章平均质量分 64
大叶子不小
这个作者很懒,什么都没留下…
展开
-
性能测试:jstat -gcuti命令分析
新new出来的对象会存储在 Eden(伊甸园)中,当这区域满了之后JVM会进行一次垃圾回收,在回收时把有用的对象存储在S1区,没用的就销毁此对象的内存空间,这过程即第一次YoungGC,如果S1区空间也满了后,同理会将有用的对象会放到S2区中,并释放S1空间,以上反复的回收即为YoungGC。因为正常情况下是每次GC后,S0区、S1区中的空间总有一个是会被完全清空(根据GC垃圾回收算法),因此S0 S1一直存在被占用时则回收不彻底,导致内存泄漏现象,随之时间拉长,甚至出现内存溢出(OOM)现象。原创 2022-10-13 10:08:25 · 788 阅读 · 0 评论 -
Java程序员必备:jstack命令解析
jstack原创 2022-09-21 16:49:05 · 625 阅读 · 0 评论 -
LoadClass和forName的区别
一、 Java类装载过程装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象;链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;校验:检查导入类或接口的二进制数据的正确性;(文件格式验证,元数据验证,字节码验证,符号引用验证)准备:给类的静态变量分配并初始化存储空间;解析:将常量池中的符号引用转成直接引用;初始化:激活类的静态变量的初始化Java代码和静态Java代码块,并初始化程序员设置.原创 2021-01-21 15:26:52 · 437 阅读 · 0 评论 -
Java中为什么静态方法不能被重写?为什么静态方法不能隐藏实例方法?
问题描述 Java中为什么静态方法不能被重写?为什么静态方法不能隐藏实例方法?诸如此类。前期准备 首先理解重写的意思,重写就是子类中对父类的实例方法进行重新定义功能,且返回类型、方法名以及参数列表保持一致,且对重写方法的调用主要看实际类型。实际类型如果实现了该方法则直接调用该方法,如果没有实现,则在继承关系中从低到高搜索有无实现。那么问题又来了,为什么只能对实例方法才能重写?我头好晕,这两个问题在这互相推脱责任。 理解三个概念:静态类型,实际类型,方法接受者。Person stud原创 2021-01-06 19:44:45 · 703 阅读 · 0 评论 -
怎么解决引用计数 GC 的循环引用问题?
引用计数方式 GC 存在循环引用问题,导致无法辨别无用对象,而 GC ROOT 方式不存在循环引用的问题引用计数和 GC ROOT 的实现机理很易理解,面试时大家都能流利应答,那怎么才能脱颖而出呢?思考一个问题:不通过 GC ROOT,仍使用引用计数方式,怎么解决它的循环引用问题?解答此问题前,通过目标驱动法来想象一下,若 Get 了此知识点,可以这样应用到面试中:面试官: 说一下垃圾回收机制吧我: ...可以通过强、弱引用计数结合方式解决引用计数的循环引用问题,实际上 Android .原创 2020-11-19 17:43:01 · 667 阅读 · 0 评论 -
Java中的常量池(字符串常量池、class常量池和运行时常量池)
转载。 https://blog.csdn.net/zm13007310400/article/details/77534349简介:这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的说法,然后我就去CSDN、博客园等上找资料,里面说的内容真是百花齐放,各自争艳,因此,我好好整理了一下,将我自认为对的理解写下来与大家共同探讨:在Java的内存分配中,总共3种常量池:1.字符串常量池(String Constant Pool):1.1:字符串常量池在Java内存区域的哪个位置?原创 2020-10-20 15:33:05 · 112 阅读 · 0 评论 -
javaassist的用法
package com.dasenlin.baidu;import java.io.IOException;import javassist.CannotCompileException;import javassist.ClassPool;import javassist.CtClass;import javassist.CtConstructor;import javassist.CtField;import javassist.CtMethod;import javassist..原创 2020-10-19 17:43:54 · 716 阅读 · 0 评论 -
不同类加载器加载同一个class文件
不同类加载器加载同一个class文件得到的类型也是不同的。验证如下:在D:\\00-test目录下,有名为Test.class的文件,其编译前的源码如下:public class Test { public static int count = 0; public Test() { ++count; System.out.println(this.getClass().getClassLoader()); System.out.原创 2020-10-19 07:41:15 · 5037 阅读 · 1 评论 -
静态代码块,代码块,构造方法执行顺序||类加载的初始化和对象创建初始化的区别
最简单的示例package com.abchina.test_static;/** * @author : yewang * create at: 2020/10/14 9:36 上午 */public class ParentClass { static int num = 0; String name = "qqqqqq"; static String name2 = "wwwwwwwwwww";// static ParentClass parentC原创 2020-10-14 10:01:04 · 232 阅读 · 0 评论 -
jvm知识点划分
jvm知识点划分:1.class文件结构2.classloader3.jvm运行时数据区4.垃圾回收器和垃圾回收算法5.jit1.1.1类型的加载类型值得是我们java源代码通过编译后的calss文件1.1.2类型的来源1.本地磁盘2.网络下载class文件3.war,jar下加载.class文件4.从专门的数据库中读取.class文件(少见)5.将java源文件动态编译成class文件 1.典型的是动态代理,通过运行期生成class文件...原创 2020-10-09 22:35:05 · 160 阅读 · 0 评论 -
浅谈双亲委派和破坏双亲委派
一、前言笔者曾经阅读过周志明的《深入理解Java虚拟机》这本书,阅读完后自以为对jvm有了一定的了解,然而当真正碰到问题的时候,才发现自己读的有多粗糙,也体会到只有实践才能加深理解,正应对了那句话——“Talk is cheap, show me the code”。前段时间,笔者同事提出了一个关于类加载器破坏双亲委派的问题,以我们常见到的数据库驱动Driver为例,为什么要实现破坏双亲委派,下面一起来重温一下。二、双亲委派想要知道为什么要破坏双亲委派,就要先从什么是双亲委派说起,在此之前,原创 2020-10-09 16:10:23 · 219 阅读 · 0 评论 -
为什么说java spi破坏双亲委派模型?
这个问题在之前粗略的了解过,知道有这么回事,也不难理解,但是究其细节,很多点并非足够经得起推敲。现在就来抽丝剥茧梳理一遍。类加载器(classloader)先从类加载器说起,凡事先问是什么,首先什么是类加载器?我们知道,一个 *.java 的代码源文件要执行起来之前,必须通过 javac 构建抽象语法树并编译成字节码,字节码仍然是不能被机器所识别,那么一个 .class 文件要被机器识别并执行的前提就是将字节码转化成机器码加载到内存里,这一转化过程就是类加载的执行过程。...原创 2020-10-09 16:09:10 · 720 阅读 · 0 评论 -
方法区,常量池,永久代---傻傻分不清楚
字符串常量池在Java内存区域的哪个位置?在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中;在JDK7.0版本,字符串常量池被移到了堆中了。至于为什么移到堆内,大概是由于方法区的内存空间太小了。引文JDK7及之前版本的方法区(Method Area)和Java堆一样,是各个线程共享的内存区域,用于存储已经被虚拟机加载的类信息、常量、静态常量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但它有另外一个名字叫Non-...原创 2020-09-24 11:12:46 · 413 阅读 · 0 评论 -
图解JVM类加载机制与类加载过程
0、前言读完本文,你将了解到:一、为什么说Jabalpur语言是跨平台的二、Java虚拟机启动、加载类过程分析三、类加载器有哪些?其组织结构是怎样的?四、双亲加载模型的逻辑和底层代码实现是怎样的?五、类加载器与Class<T> 实例的关系六、线程上下文加载器一、为什么说Java语言是跨平台的? Java语言之所以说它是跨平台的、可以在当前绝大部分的操作系统平台下运行,是因为Java语言的运行环境是在Java虚拟机中。 Java虚拟机消除了各个平台.原创 2020-09-24 10:54:39 · 305 阅读 · 1 评论 -
JVM调优思路整理
垃圾回收维度 (1)GC日志:停顿时间和吞吐量 停顿时间:垃圾收集器进行垃圾回收终端执行响应的时间 停顿时间小适用于 和用户交互比较多的场景吞吐量:用户代码执行时间/(用户代码执行时间+垃圾收集时间) 用户代码运行占用CPU的时间较长,适合运算、跑后台任务的场景根据业务和硬件对垃圾回收器分类 停顿时间比较小的收集器:CMS、G1适用于web应用 (并发类的收集器) 吞吐量有限:ParaOld Paralle Scanvent (并行类的收集器) 串行收集器:原创 2020-09-23 22:12:20 · 1027 阅读 · 0 评论 -
JVM的一些命令
https://www.edrawsoft.cn/viewer/public/s/b6b85573046173 知识图谱–verbose:gc-Xms20M-Xmx20M-Xmn10M 新生代的大小-XX:+PrintGCDetails-XX:SurvivorRatio=8-XX:HeapDumpOnOutOfMemoryError-Xoss 设置本地方法栈的大小-Xss128k 设置栈的大小-XX:PermSize=6M-XX:MaxPermSize=6M-XX:MaxMet原创 2020-09-23 22:01:16 · 78 阅读 · 0 评论 -
CMS的问题
首先分为四个阶段:初始标记(STW)并发标记重新标记(STW)并发清除1.为了增加初始标记的速度:XX:+CMSParallelInitialMarkEnabled,同时调大并行标记的线程数,线程数不要超过cpu的核数。2.并发标记这个阶段是和用户线程并发的,可能会导致concurrent mode failure。3.重新标记的内存范围是整个堆,包含_young_gen和_old_gen。为什么要扫描新生代呢,因为对于老年代中的对象,如果被新生代中的对象引用,那么就会被视为存活对象,即使新生原创 2020-09-23 21:44:25 · 496 阅读 · 0 评论 -
由虚拟机栈搞懂i++与++i
这个文章解释的也不错这个问题看过很多次,再回顾下1.java虚拟机栈简单介绍一下,在JVM中的运行时数据区分为五大区域,分别是程序计数器、java虚拟机栈、本地方法栈、堆和方法区。而今天我们主要讲的就是java虚拟机栈。这一块区域是线程私有的,也就是每一个线程就是一个栈,在这个栈里存放的元素就是栈帧,这个栈帧说白了就是方法,每一个栈帧的入栈出栈就是一次方法的执行。在栈帧里主要有局部变量表,操作数栈,动态链接和方法出口。了解这个东西离不开代码,我们先来定义一个简单地类,就让他实现两数相原创 2020-09-23 11:08:33 · 581 阅读 · 0 评论 -
CMS垃圾回收过程
1.总体介绍:CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除。2.CMS过程:初始标记(STW initial mark)并发标记(Concurrent marking)并发预清理(Concurrent precleaning)重新标记(原创 2020-09-18 14:57:36 · 348 阅读 · 0 评论 -
jstat之gcutil数据解析
例子:##pid为4007的应用的情况,每2秒钟显示一次jstat -gcutil 4007 2000 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 37.03 0.00 20.87 86.82 94.40 89.37 1640 9.248 6 0.658 9.907S0: Survivor space 0 utilization as a pe原创 2020-09-07 16:11:30 · 1599 阅读 · 0 评论 -
理解java虚拟机垃圾回收的GC日志
1、模拟打印GC日志使用System.gc();代码如下public class TestGC {public static void main(String[] args) {System.gc();}}配置虚拟机打印垃圾回收的日志-XX:+PrintGCDetails2、日志分析新生代Gc(Minor GC)30.111:[ GC [ DefNew:3324K->152K(3712K),0.0025925secs]3324K->152K(11904K),0.0031680secs原创 2020-09-01 10:22:10 · 381 阅读 · 0 评论 -
线上CPU100%
如果CPU100%top -c按⼀下 P 可以按照CPU使⽤率进⾏排序-c: 命令/程序名 触发: 如上面所讨论到的命令,这个选项会以上次记住的程序/命令显示的状态显示(是否显示完整路径)。然后我们需要根据PID 查出CPU⾥⾯消耗最⾼的进程使⽤命令 top -Hp 2609 找出这个进程下⾯的线程,继续按P排序-H :Threads-mode operationInstructs top to display individual threads. Without this com原创 2020-08-31 15:54:50 · 148 阅读 · 0 评论 -
灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?
JVM内存结构,是很重要的知识,相信每一个精心准备过面试的程序员都可以清楚的把堆、栈、方法区等介绍的比较清楚。上图,是一张在作者根据《Java虚拟机规范(Java SE 8)》中描述的JVM运行时内存区域结构画的。很多人都知道Java对象是在堆内存中分配空间的(JIT优化除外),也知道内存分配过程中是线程安全的,那么虚拟机到底是如何保证线程安全的呢?本文就来简单介绍一下。1.Java对象的内存分配我们知道,Java是一门面向对象的语言,我们在Java中使用的对象都需要被创建出来,在Java中,创建原创 2020-08-18 17:10:00 · 168 阅读 · 0 评论