- 博客(48)
- 收藏
- 关注
原创 【JVM】参数设置列表
1、参数查看参数功能-XX:+PrintFlagsInitial查看所有的参数默认值-XX:+PrintFlagsFinal查看所有参数的最终值(可查看修改过后的值)2、内存设置参数功能-Xms600m设置堆空间初始值为600m(默认为本机物理内存的1/64)-Xmx600m设置堆空间最大值为600m(默认为本机物理内存的1/4)-Xmn600m直接设置新生代的大小。优先于参数-XX:NewRatio(初始值和最大值)-XX
2022-08-19 11:50:57 168
原创 【JVM19】类的加载过程详解*
1、概述2、过程1:Loading(加载)阶段(1)加载的理解所谓加载,简而言之就是将Java类的字节码文件加载到机器内存中,并在内存中构建出Java类的原型——类模型类的加载器只涉类加载的第一阶段——类的记载阶段,后面的链接初始化与类加载器无关。(2)类模型与Class的位置类模型的位置加载的类在JVM中创建相应的类结构,类结构会存储在方法区(JDK1.8之前:永久代;JDK1.8及之后:元空间)。Class实例的位置类将.class文件加载至元空间后,会在堆中创建一个Ja
2022-06-09 18:32:06 269
原创 【JVM16】垃圾回收的相关概念的概述
举例:System.gc()没有回收掉buffer。可以看到局部变量表的长度为2,但是局部变量只有args参数,其实还隐藏这一个buffer。这个方法里没有其他变量把buffer的slot占据,所以回收不了buffer。原因:对象不会被程序用到了(但是这个对象可能还是被引用到),但是垃圾收集器无法回收这种对象。举例:描述:当内存足够,是不会回收软引用的可达对象,当内存不够时(不一定是要发生OOM),则回收软引用可以到达的对象;软引用是用来描述一些还有用,但非必需的对象。只被软引用关联着的对
2022-06-03 19:40:25 64
原创 【JVM15】垃圾回收相关算法实现原理*
标记阶段:判断哪些是垃圾?清除阶段:怎么回收垃圾?1、标记阶段:引用计数算法(Hotspot虚拟机不用这个算法标记)判断对象存活引用计数算法引用计数算法无法解决循环引用4. 小结(1)引用计数算法,是很多语言的资源回收选择,例如因人工智能而更加火热的Python,它更是同时支持引用计数和垃圾收集机制。(2) 具体哪种最优是要看场景的,业界有大规模实践中仅保留引用计数机制,以提高吞吐量的尝试。(3)Java并没有选择引用计数,是因为其存在一个基本的难题,也就是很难处理循环引用关系
2022-06-03 14:19:19 60
原创 【JVM14】垃圾回收概述
1、什么是垃圾垃圾是指程序运行中没有任何指针指向的对象2、为什么需要GC3、早期垃圾回收如如何实现4、Java的垃圾回收机制
2022-05-29 16:54:04 50
原创 【JVM13】String Table(关于String)
1、String的基本特性string :字符串,使用一对""引起来表示。string sl = “atguigu” ;//字面量的定义方式string s2 = new string ( “hello”);string声明为final的,不可被继承string实现了serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示string可以比较大小String在jdk8及以前内部定义了final char[] value用于存储字符串数据。jdk9时改
2022-05-29 15:46:29 227
原创 【JVM12】执行引擎
提问:为什么不直接把Java语言用JVM解释执行呢?还要加一个中间产物字节码文件呢?原因:JVM如果直接执行Java语言花费的时间成本太高了。JVM专注于把字节码指令翻译成机器指令效率更高。1、执行引擎概述"虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集。和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的
2022-05-27 11:00:47 73
原创 【JVM11】直接内存(了解)noIO
直接内存描述不是虚拟机运行时数据区的一部分,也不是《Java虛拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。.来源于NIO,通过存在堆中的DirectByteBuf fer操作Native内存。通常,访问直接内存的速度会优于Java堆。 即读写性能高。➢因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。➢Java的NIO库允许Java程序使用直接内存,用于数据缓冲。也可能导致OutOfMemoryError异常由于直接内存在Java堆外,因此它的
2022-05-26 17:01:58 403
原创 【JVM10】对象的实例化内存布局与访问定位*
1、对象的实例化美团:对象在Java虚拟机中是怎么存储的?对象头信息里面有哪些信息?(1)创建对象的方式(2)创建对象的步骤2、对象的内存布局3、对象的访问定位
2022-05-26 16:13:00 49
原创 【JVM9】方法区
1、栈、堆、方法区的交互关系运行时数据结构图:从线程共享与否的角度看2、方法区的理解方法区与堆空间一样,是各个线程共享的区域方法区是JVM启动时创建的,并且它也是逻辑上连续,物理上不连续。如果你系统家加载了太多的类,导致HotSpot的方法区溢出,虚拟机会抛出OOM:MeatSpace;关闭虚拟机就会释放方法区的内存;到了Java8,HotSpot虚拟机用元空间代替了永久代的概念;元空间使用的是本地内存,如果加载的类太多,本地内存放不下,照样会抛出异常:OOM:MeatSpace.
2022-05-25 16:24:55 59
原创 【JVM8】堆
1. 堆的核心概述一个进程对应一个JVM实例,一个JVM实例只存在一个堆内存。java堆区在JVM启动时就被创建,其空间大小就被固定了。堆内存大小是可以调节的。《Java虚拟机规范》规定,堆可以在物理上不连续空间。但在逻辑上它是连续的。所有线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)下面第10大点会详细讲到。在《Java虚拟机规范》中描述:所i有对象以及数组都对应在运行时分配的堆上。但是
2022-05-24 09:56:53 915
原创 【JVM6】虚拟机栈
1、虚拟机栈出现背景(1)由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器,基于寄存器与CPU耦合太高。(2)基于栈的优点:跨平台,指令集小(8位),编译器容易实现。缺点:性能下降,实现同样功能需要更多指令。2、内存中的堆与栈......
2022-05-21 16:29:02 62
原创 【JVM5】程序计数器|PC寄存器
一、介绍二、作用1.它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。2.在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。3.任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序序计数器会存储当前线程正在执行的Java方法的JVM指令地址;或者,如果是在执行native方法,则是未指定值 (undefned)......
2022-05-17 22:03:57 48
原创 【JVM4】线程回顾
前言:1、线程是一个程序里的单元。JVM允许一个应用有多个线程并行执行。2、在Hotspot虚拟机里,每个线程都与操作系统的本地线程直接映射。(1)当一个Java线程执行终止后,本地线程也会回收3、操作系统负责所有线程的安排调度到任何一个可用的CUP上,一旦本地线程初始化成功,它就会调用Java线程中的run()方法...
2022-05-17 20:44:46 39
原创 【JVM3】双亲委派机制
工作原理(1)如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;(2)如果父类加载器还无法加载,则再向上委托,依次递归,请求最终到顶层的引导类加载器;(3)如果父类加载器可以加载,则父类加载器加载,如果父类加载器无法加载任务,子类加载器才会去尝试自己加载。优势1、避免类的重复加载2、保护程序安全,防止核心API被恶意篡改......
2022-05-17 19:29:11 68
原创 【JVM2】类装载子系统
类加载器加载.class具体还要成三步:一、加载生成代表该类的Class实例二、链接1、验证:主要是验证字节码文件无误,因为字节码文件是可以被认为修改的。2、准备:准备阶段会进行默认初始化,如下代码:public class Test01 { private int i=88; public static void main(String[] args) { }}默认初始化就是在准备阶段先把 i 赋值为0,当然如果是String类型就是null;3、解析三、.
2022-05-17 16:59:07 61
原创 【注解和反射10】通过反射获取 泛型:generic—也叫参数化类型
通过反射获取 泛型:generic—也叫参数化类型package com.yiheng.yiheng_05_getSomething;import java.lang.reflect.Method;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.List;import java.util.Map;//通过反射获取 泛型:generic——————也叫参数化类型
2022-05-13 16:59:09 127
原创 【注解和反射9】如何通过反射获得注解
package com.yiheng.yiheng_05_getSomething;import java.lang.annotation.*;//通过反射获得注解//框架底层就是利用反射机制读取注解public class getAnnotation { public static void main(String[] args) throws NoSuchFieldException { Class<Student> studentClass = Stu
2022-05-13 16:56:34 42
原创 【注解和反射8】测试普通、反射、关闭安全检测的反射三种方式调用10亿次方法的速度差距
package com.yiheng.yiheng_04_CreatObject;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;//测试普通、反射、关闭安全检测的反射三种方式调用10亿次方法的速度差距public class Test02 { public static void main(String[] args) throws InvocationTargetEx
2022-05-13 16:53:28 43
原创 【注解和反射7】通过类的Class对象创建对象
import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;//通过该类对应的Class对象创建对象public class CreatObject { public static void main(String[] args) throws C
2022-05-13 16:46:37 248
原创 【注解和反射6】通过一个类对应的Class对象获得该类的一些信息
上代码import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;//通过获得Person对应的Class对象获,得Person类的一些信息public class Test04 { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldExc
2022-05-13 16:44:06 41
原创 【注解和反射5】获取类的类加载器
类加载器有3种1、系统类类加载器,经常用的2、扩展类的类加载器<——系统类类加载器的父类3、根加载器<——扩展类类加载器的父类//1、获取类的类加载器public class Test03 { public static void main(String[] args) throws ClassNotFoundException { //1、获取系统类的类加载器,负责我们写的一些类-----如负责Java-classpath或java.class.path目录
2022-05-13 16:41:18 175
原创 【注解和反射4】类的初始化
1、类在什么情况下会被初始化//类什么时候会发生初始化public class Test02 { static { System.out.println("main被加载"); } public static void main(String[] args) throws ClassNotFoundException { //1、主动引用 NEW————初始化// D d = new D(); //2、主动
2022-05-13 16:32:40 45
原创 【注解和反射3】获得对应Class类的方法和那些对象可以获得Class类的对象
1、测试获得Class类的方法1、对象.getClass();2、Class.forName(“包名+类名”)3、类名.class//测试获得Class类的方法public class Test01 { public static void main(String[] args) throws ClassNotFoundException { Student student = new Student(); System.out.println("这是个
2022-05-13 16:23:48 73
原创 【注解和反射2】Classl类的分析、类加载过程
1、什么是Class类类加载器在加载一个类时,会为这个类生成一个对应的Class对象的实例,通过该类可以获得这个类的很多信息,比如:类名,构造器,属性,注解。2、类加在过程
2022-05-13 16:13:06 67
原创 java中hashCode的作用
java中hashCode的作用:1、Java对象的存储是存在内存当中,可当我们要查找一个对象时,按照常规思路,我们需要把要查找的对象与内存中的对象一一匹配.但是这样的匹配会占用较多的时间。2、所以,加入我们把内存分为很多区域,一个区域又可以存放很多对象,在查找想要对象时,我们只需要知道对象在那块区域,然后在那块区域和其他对象一一匹配就行,这样极大节约了时间。3、hashCode()方法就是计算在哪块区域的;equals()方法就是进行匹配4、重写了equals()方法就必须重写hashCode()
2022-05-10 16:08:51 446
原创 线程池的基本概念
背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大作用:提前创建多个线程,放入线程池中,使用是直接获取,避免了频繁创建和销毁,实现重复利用。好处:1、提高相应熟读(减少了创建新线程的时间)2、降低了资源消耗(不需要重新创建线程)3、便于管理线程:(1)corePoolSize:核心池大小(2):maximumPoolSize:最大线程数(3):keepAliveTime:线程没有任务后最多保持多长时间被销毁。package com.yiheng.threadPoo
2022-05-10 09:45:24 35
原创 生产者与消费者模式
生产者与消费者模式1、主要思想:使用数组是实现缓存机制,当数组满时线程A(生产者)释放锁,并通知另一个线程B(消费者)拿锁操作资源,当消费者操作了资源就释放锁并通知生产者拿锁,操作资源这里使用了管程法//生产者和消费者模式:管程法//生产者——>生产鸡//消费者——>消费鸡public class ProducerAndConsumer { public static void main(String[] args) { Buffer buffer = ne
2022-05-10 09:32:22 45
原创 线程同步,多个线程操作同一个资源;关键词:synchronized、死锁、Lock
1、并发并发:同一个对象被多个线程同时操作2、线程同步处理多线程问题时,多个线程访问同一个对象,又可能会出错,所以我们需要让这些线程排对等候,一个一个访问这些对象。线程同步就是一种等待机制,多个需要访问这个对象的线程进入这个对象的等待池 形成队列,等前面的线程使用完毕,下一个线程在使用。3、队列和锁遇到的问题:1、一个线程持有了这个对象的锁,会使其他所有需要此锁的线程挂起。2、在多线程竞争下,拿锁,释放锁会导致较多的上下文切换和调度时延,引起性能问题3、如果一个优先级高的线程等待一个优先级
2022-05-06 21:14:42 1636
原创 线程优先级、守护线程
线程优先级线程优先级为:1~10,线程的默认优先级都是5,主线程和分线程都是。要测试优先级,我们应该先设置线程优先级再运行线程。CPU选接下来要运行的线程时,不一定选中优先级最高的,优先级越高只是表示这个线程的权重越大,接下来是否选他还是看脸//测试线程优先级public class ThreadPriority { public static void main(String[] args) { //获取主线程的优先级 System.out.println
2022-05-06 13:58:36 106
原创 线程五大基本状态
NEW—新生状态新创建的线程处于这个状态RUNNABLE—就绪状态状态再准备接受CPU调度时处于这个状态TERMINATED—结束状态线程结束后,处于这个状态TIMED_WAITING—正在等待另一个线程执行动作达到指定时间的线程处于此状态像处于休眠的线程处于这个状态运行状态运行的线程处于这个状态//测试线程状态public class ThreadState { public static void main(String[] args) throws Interrupte
2022-04-28 10:01:14 103
原创 线程休眠、线程停止、线程礼让、线程插队
线程休眠采用Thread.sleep()一个抢票的例子,三个线程同时访问一个静态资源,让票数递减,我们单独让一个线程休眠,比如500毫秒。public class ThreadSleep { //把票数设置为唯一 private static int stick=10; public static void main(String[] args) { //lambda表达式实现Runnable接口,并从写run()方法; Runnable
2022-04-28 09:49:55 110
原创 线程的基本创建
一、创建线程方式一:继承Thread类,重写run()方法,调用start开启线程,然后JVM会执行run()方法public class TestThread1 extends Thread{ @Override public void run() { //run方法线程体 for (int i = 0; i < 200; i++) { System.out.println("我在看代码。。。"); }
2022-04-28 09:26:57 271
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人