Klass

Java之JVM内存结构、Java内存模型、Java对象模型

不羁的心 提交于 2021-02-14 14:35:14
Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的 JVM内存结构 、 Java内存模型 和 Java对象模型 ,这就是 三个截然不同的概念 ,但是很多人容易弄混。 可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构、Java内存模型和Java对象模型这三者的概念及其间的区别。甚至我见过有些面试官自己也搞的不是太清楚。不信的话,你去网上搜索Java内存模型,还会有很多文章的内容其实介绍的是JVM内存结构。 首先,这三个概念是完全不同的三个概念。 本文主要对这三个概念加以区分以及简单介绍。其中每一个知识点都可以单独写一篇文章,本文并不会深入介绍,感兴趣的朋友可以加入我的知识星球和球友们共同学习。 JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。其中有些区域随着虚拟机进程的启动而存在,而有些区域则依赖用户线程的启动和结束而建立和销毁。在《 Java虚拟机规范(Java SE 8) 》中描述了JVM运行时内存区域结构如下: 各个区域的功能不是本文重点,就不在这里详细介绍了。这里简单提几个需要特别注意的点: 1、以上是Java虚拟机规范,不同的虚拟机实现会各有不同

【JVM】类加载

*爱你&永不变心* 提交于 2021-01-17 14:55:30
JVM类加载 Klass InstanceKlass InstanceMirrorKlass(镜像类) InstanceRefKlass InstanceClassLoaderKlass ArrayKlass TypeArrayKlass ObjArrayKlass 类的加载过程 加载 Klass class和klass的区别: class是java类(java代码 klass是java类在JVM的存在形式(c++代码 Klass类分别由InstanceKlass和ArrayKlass继承,其中InstanceClass用来表示普通的java类即非数组类,ArrayKlass是来表示Java数组的元信息。 InstanceKlass 普通类对应的是instanceKlass类的实例。 类加载器将.class文件加载进系统,然后将.class文件生成的类的元信息就是存储在InstanceKlass的。 InstanceKlass的几个子类又去存放子类对应存放的东西,由此也可以看到class对象和存放元信息的结构是分开的(元信息是在InstanceKlass,class对象是在InstanceMirrorKlass 对象内存结构的klass pointer中的klass就是指InstanceKlass及其子类 我们把java程序中的一个地址在 HSDB解析出来就可以看到

java面试题之synchronized和lock有什么区别

情到浓时终转凉″ 提交于 2020-12-27 00:58:59
synchronized和lock的区别: 类别 synchronized lock 存在层次 java的关键字,在jvm层面上 是一个类 锁的释放 1、以获取锁的线程执行完同步代码,释放锁 2、线程执行发生异常,jvm会让线程释放锁 在finally中必须释放锁,不然容易造成线程死锁 锁的获取 假设A线程获得锁,B线程等待, 如果A线程阻塞,B线程会一直等待 分情况而定,lock有多个锁获取的方法,可以尝试获得锁, 线程可以不用功一直等待 锁状态 无法判断 可以判断 锁类型 可以重入,不可以中断,非公平 可重入 可以判断 可公平 性能 少量同步 大量同步 synchronized使用方式及原理: 作用在方法上: public synchronized void test(){}//作用在方法上JVM采用ACC_SYNCHRONIZED标记符来实现同步的; 作用在代码块上: synchronized (SynchronizedTest. class ){}//作用在同步代码块上JVM是采用monitorenter和monitorexit两个指令来实现同步的; java对象头:   synchronized用的锁是存在java对象头里的,java对象头一般占有两个机器码(在32位虚拟机中,1个机器码等于4字节,也就是32bit),那么什么是java对象头呢

Java并发编程-synchronized

心不动则不痛 提交于 2020-12-18 02:16:48
1、 为什么会用到 synchronized   Java语言的一个高级特性就是支持多线程,线程在操作系统的实现上,可以看成是轻量级的进程,同一进程中的线程都将共享进程的内存空间,所以Java的多线程在共享JVM的内存空间。JVM的内存空间主要分为:程序计数器、虚拟机栈、本地方法栈、堆、方法区和运行时常量池。   在这些内存空间中,我们重点关注栈和堆,这里的栈包括了虚拟机栈和本地方法栈(实际上很多JVM的实现就是两者合二为一)。在JVM中,每个线程有自己的栈内存,其他线程无法访问该栈的内存数据,栈中的数据也仅仅限于基本类型和对象引用。在JVM中,所有的线程共享堆内存,而堆上则不保存基本类型和对象引用,只包含对象。除了重点关注的栈和堆,还有一部分数据存放在方法区,比如类的静态变量,方法区和栈类似,只能存放基本类型和对象引用,不同的是方法区是所有线程共享的。   如上所述,JVM的堆(对象信息)和方法区(静态变量)是所有线程共享的,那么多线程如果访问同一个对象或者静态变量时,就需要进行管控,否则可能出现无法预测的结果。为了协调多线程对数据的共享访问,JVM给每个对象和类都分配了一个锁,同一时刻,只有一个线程可以拥有这个对象或者类的锁。JVM中锁是通过监视器(Monitors)来实现的,监视器的主要功能就是监视一段代码,确保在同一时间只有一个线程在执行。每个监视器都和一个对象关联

Handler系列源码解析

时光总嘲笑我的痴心妄想 提交于 2020-12-17 15:52:04
前言 老是看大佬们分析这个东西,也看了一些文章,总感觉云里雾里,决定自己来对着源码理一理,能力有限,先写下自己所理解的,后期再加上来。 在我努力认真(边玩边睡)的阅读下,终于,瞧出了一丝门道,下面就给大家分析分析。 浅谈理解 多线程 谈这个之前,我觉得首先需要聊聊多线程这个东西(毕竟Handler很多时候是跨线程通信的),那么,什么是多线程呢?比如,我们去银行办理业务,由于是淡季,我们发现办理窗口只开了一个,大家都得排着队一个一个来(这就是单线程),那么,开了两个甚至多个窗口同时处理银行的事务,那么这样子就等于开了多个线程(这就是多线程)。 了解了多线程,我们就开始转移到我们的主要战地(Handler)上面,我们使用Handler的时候,很多的时候都是在子线程中做完操作后需要UI线程(主线程)中更新界面,一般的做法就是 使用 Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { /** * 根据参数做一些操作 */ } }; ​ handler.sendEmptyMessageDelayed(1,2000); Handler是Android线程间通讯的一种方式,它常被我们用来更新UI,是的,我是这么用,还有延时,只有拿出来总结的时候,才会发现有时候使用的时候是有缺漏的

Jenkins RCE漏洞分析汇总

孤人 提交于 2020-12-12 02:36:49
No.1 声明 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。 雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。 No.2 前言 之前针对Jenkins没注意看过,看到廖师傅kcon会议上讲的Java沙箱逃逸就涉及到了Jenkins,包括今年开年时候orange发的Jenkins的组合拳,拖拖拉拉到了年底还没看,所以准备开始看。 这里根据Jenkins的漏洞触发点做了一个归类,一种是通过cli的方式触发,一种是通过我们常见的http方式触发。 No.3 环境搭建 在catalina.sh添加,或者catalina.bat内容不动用如下命令开启,默认是开启8000端口 用如下命令开启 catalina.bat jpda start(Windows) catalina.sh jpda start(linux) No.4 漏洞分析 1.Cli方式触发 CVE-2015-8103 最早开始公开Java 反序列化的时候,何使用 Apache Commons Collections 这个常用库来构造 POP 链(类ROP链),这个在Jenkins上的例子就是这个编号

java.lang.system 类源码解读

不想你离开。 提交于 2020-11-24 05:30:29
通过每块代码进行源码解读,并发现源码使用的技术栈,扩展视野。 registerNatives 方法解读 /* register the natives via the static initializer. * * VM will invoke the initializeSystemClass method to complete * the initialization for this class separated from clinit. * Note that to use properties set by the VM, see the constraints * described in the initializeSystemClass method. */ private static native void registerNatives(); static { registerNatives(); } 关键字: native,这涉及【JNI】的一些概念。简单理解就是"定义的方法并不是用java实现的,而是由系统连接的共享库实现"。 System是不能实例化的类    /** Don't let anyone instantiate this class */ private System() { }

聊聊jstack的工作原理

妖精的绣舞 提交于 2020-11-23 23:58:24
实现一个jstack 在聊Jstack得工作原理前呢,不如让我们先写一个简单的jstack玩玩。不用怕,很简单的,就几行代码的事,看: public class MyJstack { public static void main(String[] args) throws Exception { VirtualMachine virtualMachine = VirtualMachine.attach("6361" ); HotSpotVirtualMachine hotSpotVirtualMachine = (HotSpotVirtualMachine)virtualMachine; InputStream inputStream = hotSpotVirtualMachine.remoteDataDump( new String[]{}); byte [] buff = new byte [256 ]; int len; do { len = inputStream.read(buff); if (len > 0 ) { String respone = new String(buff, 0, len, "UTF-8" ); System.out.print(respone); } } while (len > 0 ); inputStream.close();

深入JVM内存区域管理,值得你收藏

做~自己de王妃 提交于 2020-11-21 04:09:30
JDK和JRE和JVM的关系 JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包 JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可 JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统 JVM内存区域 本文的讲解都从这个图一一开始,你脑海里先试着回忆一下这个几个区域的概念,是独享的还是共享的?每个区域都存储了什么?哪些区域会被垃圾回收?哪些区域会抛出OOM?哪些区域会抛出SOF?如何避免 什么是JVM运行时数据区域? Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。其中一些数据区域是在Java虚拟机启动时创建的,仅在Java虚拟机退出时才被销毁。其他数据区域是每个线程的。创建线程时创建每个线程的数据区域,并在线程退出时销毁每个数据区域。 堆内存 堆内存中存储的是所有类实例和数组的内存,在虚拟机启动时创建,虚拟机结束时销毁,归还给操作系统,堆内存中对象的销毁都JVM自行管理(垃圾收集器)

Java 内存分区之什么是 CCS区 Compressed Class Space 类压缩空间

╄→гoц情女王★ 提交于 2020-08-17 06:51:42
了解到什么是ccs区,一般都是实际执行了jstat -gc 之后,看Java堆的gc相关的几个分区的gc信息,前面的s0,s1,e区,o区,还好猜,研究过分区的,不难猜出来这个分区是啥意思,M区虽然不知道是Metaspace元空间,但是错把这个M区当成Method area 方法区,也说的过去。这个ccsc就不好说了。之前的看的文章都没人说这个区是啥。 Java之jstat的用法:Java虚拟机 统计信息查看 工具 不了解这几个简写单词是啥意思的,可以参考一下之前的这个jstat的文章,里面对每一列的title的简写都做了解释。 什么是 Compressed Class Space 在 64 位平台上,HotSpot 使用了两个压缩优化技术,Compressed Object Pointers (“CompressedOops”) 和 Compressed Class Pointers。 压缩指针,指的是在 64 位的机器上,使用 32 位的指针来访问数据(堆中的对象或 Metaspace 中的元数据)的一种方式。 这样有很多的好处,比如 32 位的指针占用更小的内存,可以更好地使用缓存,在有些平台,还可以使用到更多的寄存器。 当然,在 64 位的机器中,最终还是需要一个 64 位的地址来访问数据的,所以这个 32 位的值是相对于一个基准地址的值。 下面将描述 Compressed