Klass

Java 类加载出现死锁? 转

半腔热情 提交于 2020-08-14 18:01:22
出处: Java 类加载还会死锁?这是什么情况? 一、前言 先贴一份测试代码,大家可以先猜测一下,执行结果会是怎样的: import java.util.concurrent.TimeUnit; public class TestClassLoading { public static class A{ static { System.out.println( "class A init" ); try { TimeUnit.SECONDS.sleep( 1 ); } catch (InterruptedException e) { e.printStackTrace(); } new B(); } public static void test() { System.out.println( "aaa" ); } } public static class B{ static { System.out.println( "class B init" ); new A(); } public static void test() { System.out.println( "bbb" ); } } public static void main(String[] args) { new Thread(() -> A.test()).start(); new Thread(() ->

小师妹学JVM之:JIT中的LogCompilation

自闭症网瘾萝莉.ら 提交于 2020-08-13 10:38:34
简介 我们知道在JVM中为了加快编译速度,引入了JIT即时编译的功能。那么JIT什么时候开始编译的,又是怎么编译的,作为一个高傲的程序员,有没有办法去探究JIT编译的秘密呢?答案是有的,今天和小师妹一起带大家来看一看这个编译背后的秘密。 更多精彩内容且看: 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新 Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新 Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新 java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程 LogCompilation简介 小师妹:F师兄,JIT这么神器,但是好像就是一个黑盒子,有没有办法可以探寻到其内部的本质呢? 追求真理和探索精神是我们作为程序员的最大优点,想想如果没有玻尔关于原子结构的新理论,怎么会有原子体系的突破,如果没有海森堡的矩阵力学,怎么会有量子力学的建立? JIT的编译日志输出很简单,使用 -XX:+LogCompilation就够了。 如果要把日志重定向到一个日志文件中,则可以使用-XX:LogFile= 。 但是要开启这些分析的功能,又需要使用-XX:+UnlockDiagnosticVMOptions。 所以总结一下,我们需要这样使用: -XX:

【整理】JVM知识点大梳理

為{幸葍}努か 提交于 2020-08-12 15:05:41
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 ----来源:百度百科 前言: Java 虚拟机,是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件( .class )。 跨平台的是 Java 程序(包括字节码文件),,而不是 JVM。JVM 是用 C/C++ 开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的 JVM 。 JVM 组成部分 类加载器,在 JVM 启动时或者类运行时将需要的 class 加载到 JVM 中。 内存区,将内存划分成若干个区以模拟实际机器上的存储、记录和调度功能模块,如实际机器上的各种功能的寄存器或者 PC 指针的记录器等。 执行引擎,执行引擎的任务是负责执行 class 文件中包含的字节码指令,相当于实际机器上的 CPU 。 本地方法调用,调用 C 或 C++ 实现的本地方法的代码返回结果。 1、类加载器

JVM速补知识,还不来抱大腿恶补一下吗?

泄露秘密 提交于 2020-08-10 20:13:14
概述 1、什么是虚拟机? Java 虚拟机,是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件( .class )。 跨平台的是 Java 程序(包括字节码文件),,而不是 JVM。JVM 是用 C/C++ 开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的 JVM 。 2、JVM 组成部分 类加载器,在 JVM 启动时或者类运行时将需要的 class 加载到 JVM 中。 内存区,将内存划分成若干个区以模拟实际机器上的存储、记录和调度功能模块,如实际机器上的各种功能的寄存器或者 PC 指针的记录器等。 执行引擎,执行引擎的任务是负责执行 class 文件中包含的字节码指令,相当于实际机器上的 CPU 。 本地方法调用,调用 C 或 C++ 实现的本地方法的代码返回结果。 1、类加载器 从类被加载到虚拟机内存中开始,到卸御出内存为止,它的整个生命周期分为7个阶段,加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸御(Unloading)。其中验证、准备、解析三个部分统称为连接。 7个阶段发生的顺序如下: 加载(Loading)、验证(Verification)、准备

在 Java 虚拟机上班是一种怎样的体验?

陌路散爱 提交于 2020-08-10 04:15:56
  其实在JVM工作没有你们想象的那么辛苦,其他部门不清楚,就拿我所在的垃圾回收部(这名字不好听,叫GC部门吧)来说说。   我的工作是负责执行对象的finalize方法,你们也知道,现在的程序员,很少实现类的这个方法了,所以我的工作大部分时间都可以摸鱼。   评论里有人问我对象的finalize方法是如何被执行的,这里统一回复一下。   JVM的ClassLoader部门在加载一个class的时候,会检查它是否有实现finalize方法,具体细节我不太清楚,请 @AppClassLoader同学来帮忙解答一下。   如果发现有finalize方法,以后创建这个类的所有对象都会附带创建一个Finalizer对象。   这个Finalizer有两个关键点:   继承自Reference类,本身也是一个引用,引用的正是跟它一起创建的那个对象   里面有一个名叫queue的成员,指向了一个队列:ReferenceQueue,正是Finalizer的一个静态成员变量。   除此之外,Finalizer里面还有一个静态线程FinalizerThread,这个其实就是我了。我的工作就是不断上面的队列里面取出Finalizer对象,然后执行它引用对象的finalize方法。   什么?你问我Finalizer对象是什么时候进入这个队列里的?这我就不知道了,超出了我的工作范围,可以请

JAVA并发编程入门篇,思考同步锁Synchronized背后的实现哲学

时光怂恿深爱的人放手 提交于 2020-08-09 18:11:10
多线程在概念上类似抢占式多任务处理,线程的合理使用能够提升程序的处理能力,但是使用的同时也带来了弊端,对于共享变量访问就会产生安全性的问题。下面来看一个多线程访问共享变量的例子: public class ThreadSafty { private static int count = 0; public static void incr() { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } count ++; } public static void main(String[] args) throws InterruptedException { for (int i = 0 ; i < 1000; i++) { new Thread(()->{ ThreadSafty.incr(); },"threadSafty" + i).start(); } TimeUnit.SECONDS.sleep(3); System.out.println("运行结果是:" + count); } } 变量count的运行结果始终是小于等于1000的随机数,因为线程的可见性和原子性。 一、多线程访问的数据安全性 如何保证线程并行运行的数据安全性问题,这里首先能够想到的是加锁吧

一个导致JVM物理内存消耗大的Bug

大憨熊 提交于 2020-07-27 01:20:18
本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 概述 最近我们公司在帮一个客户查一个JVM的问题(JDK1.8.0_191-b12),发现一个系统老是被OS Kill掉,是内存泄露导致的。在查的过程中,阴差阳错地发现了JVM另外的一个Bug。这个Bug可能会导致大量物理内存被使用,我们已经反馈给了社区,并得到快速反馈,预计在OpenJDK8最新版中发布(JDK11中也存在这个问题)。 PS:用户的那个问题最终也解决了,定位下来算是C2的一个设计缺陷导致大量内存被使用,安全性上没有得到保障。 找出消耗大内存的线程 接下来主要分享下这个BUG的发现过程,先要客户实时跟踪进程的情况,当内存使用明显上升的时候,通过/proc/<pid>/smaps,看到了不少64MB的内存分配,Rss也基本消耗完了。 7fd690000000-7fd693f23000 rw-p 00000000 00:00 0 Size: 64652 kB Rss: 64652 kB Pss: 64652 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 64652 kB Referenced: 64652 kB Anonymous: 64652 kB AnonHugePages: 0 kB Swap:

阿里面试官:小伙子,你给我说一下JVM对象创建与内存分配机制吧

 ̄綄美尐妖づ 提交于 2020-07-24 00:39:58
内存分配机制 逐步分析 类加载检查: 虚拟机遇到一条new指令(new关键字、对象的克隆、对象的序列化等)时,会先去检查这个指令的参数在常量池中定位到一个类的符号引用,并且这个符号引用代表的类是否应被加载过,如果没有那么就去加载该类 分配内存 类加载完毕后会给对象分配内存空间。对象的所需的内存大小在类加载完毕后就便可完全确认,为对象分配内存大小的空间等同于把一块确定大小的内存从java堆中划分出来。 如何划分内存? 指针碰撞(默认使用指针碰撞):如果java堆内存是绝对规整的,那么会把所有用过的内存放在一边,空闲的内存放在另外一边,中间用一个指针来作为分界点的指示器,那所分配的内存仅仅把那个指针空闲空间的挪动一段与对象大小相同的距离。 空闲列表:如果java堆内存不是绝对规整的,已使用的空间和未使用的空间互相交错,那么虚拟机维护一份列表,记录哪些内存块是可用的,在划分内存空间的时候从列表中找到一块足够大的内存空间分配给对象实例,并更新列表上的记录。 分配内存遇到高并发的问题?现在有多个线程同时并发需要进行内存分配 CAS :虚拟机采用失败重试的机制方式保证操作的原子性对分配内存空间的动作进行同步处理,第一个线程抢占到了分配空间,第二个线程没有抢占到就重试抢占后面一块内存空间 本地线程分配缓冲:把内存分配的动作按照线程分配在不同的空间之中完成

python pip安装扩展报错

核能气质少年 提交于 2020-05-08 10:36:12
1.安装tldr报错 (1)报错详情: [root@linuxnode1 ~]# pip install tldr Collecting tldr Downloading https://files.pythonhosted.org/packages/ff/bb/0870bf90ad1137172b3cc0758d18e99fd2325243139e0bb7652556c77e0e/tldr-0.5.tar.gz Complete output from command python setup.py egg_info: /usr/lib64/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'long_description_markdown_filename' warnings.warn(msg) Traceback (most recent call last): File "<string>", line 1, in <module> File "/tmp/pip-build-ZBdOo2/tldr/setup.py", line 39, in <module> "Topic :: System" File "/usr/lib64/python2.7/distutils

Ubuntu Sublime 配置

那年仲夏 提交于 2020-05-01 06:13:06
2018.4.14 Ubuntu Sublime 配置   承 Ubuntu Apache 域名配置篇 一 . 序言 LAMP 搭建好了, 选一个合适自己的武器进行作战, 选个自己喜欢的开发工具, 或者接受一个然后慢慢熟悉它。 这样让你更得心应手。 感觉很 cool 。 二 . 需求 Sublime Text3 三 . 开始 1) Ubuntu 上安装 Sublime 官网网址, 很方便, 跨平台, 选择 Linux 版本下载。 https://www.sublimetext.com/docs/3/linux_repositories.html ----------------------------------------+ Tips : 查看电脑信息。 cat /etc/issue # 查看 Ubuntu 版本 uname -a # 查看 Linux 系统全部信息 uname -m # 查看你电脑是多少位操作系统 -----------------------------------------+ 用仓库管理下载, 点击 apt 。 会出现以下的话。 apt Install the GPG key:                    # GPG 加密 key wget -qO - https://download.sublimetext.com/sublimehq-pub