jvms

每日一面

此生再无相见时 提交于 2021-01-25 05:47:19
Key TakeAways StackOverflowError: 调用栈过深,导致线程栈占用大小超过 -Xss (或者是 -XX:ThreadStackSize )的限制 OutOfMemoryError: Java heap space:堆内存不够用,无法分配更多内存,就会抛出这个异常。 OutOfMemoryError: unable to create native thread:这个在创建太多的线程,超过系统配置的极限。如Linux默认允许单个进程可以创建的线程数是1024个。 OutOfMemoryError: GC Overhead limit exceeded:默认情况下,并不是等堆内存耗尽,才会报 OutOfMemoryError,而是如果 JVM 觉得 GC 效率不高,也会报这个错误。 OutOfMemoryError: direct memory:这个是向系统申请直接内存时,如果系统可用内存不足,就会抛出这个异常 OutOfMemoryError: map failed:这个是 File MMAP(文件映射内存)时,如果系统内存不足,就会抛出这个异常 OutOfMemoryError: Requested array size exceeds VM limit:当申请的数组大小超过堆内存限制,就会抛出这个异常。 OutOfMemoryError:

java并发编程之volatile

柔情痞子 提交于 2020-11-22 14:33:46
  首先是一段简单的多线程代码 public class VolatileTest { private boolean flag = true ; public boolean isFlag() { return flag; } public void setFlag( boolean flag) { this .flag = flag; } public static void main(String[] args) throws InterruptedException, IOException { VolatileTest volatileTest = new VolatileTest(); Thread thread = new Thread(() -> { int i = 1 ; while (volatileTest.isFlag()){ i ++ ; } System.out.println(i); }); thread.start(); Thread.sleep( 2000 ); volatileTest.setFlag( false ); System.out.println( "设置结束标示" ); } }   运行main方法后,我们发现线程并不能被有效的终止,这其中有两个原因:1、cpu高速缓存2、JIT优化   在java中

Java 编译期与运行期,别傻傻分不清楚!

我是研究僧i 提交于 2020-08-16 19:12:33
来源:小小木的博客 www.cnblogs.com/wyc1994666/p/11366802.html 不知大家有没有思考过,当我们使用IDE写了一个Demo类,并执行main函数打印 hello world时都经历了哪些流程么? 想通过这篇文章来分析分析Java的执行流程,或者换句话说想聊聊Java的编译期与运行期的流程。 开门见山 编译期间都做了什么 运行期间都做了什么 1. 开门见山 public class MyApp { public static void main(String[] args) { System.out.println("hello world"); } } 假如我们写了一个MyApp.java,并要打印‘hello world’ 那它需要经过哪些步骤? 第一步 : compile 通过编译器进行编译,从Java源码 ---> Java 字节码 这个编译器则是jdk 里的javac 编译器,我们只需 javac MyApp.java 即可以编译该源码,javac 编译器位于jdk --> bin -->javac 第二步 : load and execute 加载java 字节码并执行 可以通过jdk 里的java命令运行java字节码,我们只需 java MyApp.class 即可加载并执行该字节码,当运行java命令时

一个java文件是怎么一步一步执行的

浪子不回头ぞ 提交于 2020-08-16 03:46:45
说点什么呢,java比你想的要难 写了多年java,发现好多人并不知道一个class文件怎么被解析执行的,所以我也发表下看法 1. 编写java源文件 ​ 2. 把java源文件编译成 .class字节码文件 ,JVM不认识源文件 ​ 3. JVM处理class文件 搞java开发,不得不提的就是JVM了, JVM全称是 Java Virtual Machine(简称JVM,中文叫Java虚拟机,请务必记住JVM,看到不少人整天JVM的,都不知道它的全称是什么),java的宿主环境,可以认为JVM就是虚拟仿真出来的一台计算机。简单绘了一张图,如下(一图胜千言): ​ java之所以一次编写,到处运行,就是因为虚拟机(虚拟虚拟,虚拟出来的计算机,一台被托管的电脑)的缘故。 3.1 jvm处理class文件 加载是指将java源文件编译之后的class文件读入到内存中,然后在堆区创建一个java.lang.Class对象,用于封装类在方法区内的数据结构。类加载的最终目的是封装类在方法区的数据结构,并向java程序员提供访问方法区数据的接口。 类的生命周期一共分为5个阶段,加载、连接、初始化、使用、卸载。 ​ 加载 :类的加载过程主要完成3件事件,1.通过类的全限定名来获取定义此类的二进制字节流,2.将这个类字节流代表的静态存储结构转为方法区的运行时数据结构,3

Java字节码角度分析条件判断指令 ——提升硬实力3

[亡魂溺海] 提交于 2020-08-14 08:14:31
在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下。 1. Java字节码的一段旅行经历——提升硬实力1 2. Java字节码角度分析a++ ——提升硬实力2 下面将详细介绍一下java是if 条件判断是如何通过字节码来实现判读的。以下是java条件判断对应的字节码: 指令 助记符 含义 0x99 ifeq 判断是否 == 0 0x9a ifne 判断是否 != 0 0x9b iflt 判断是否 < 0 0x9c ifge 判断是否 >= 0 0x9d ifgt 判断是否 > 0 0x9e ifle 判断是否 <= 0 0x9f if_icmpeq 两个int 是否 == 0xa0 if_icmpne 两个int 是否 != 0xa1 if_icmplt 两个int 是否 < 0xa2 if_icmpge 两个int 是否 >= 0xa3 if_icmpgt 两个int 是否 > 0xa4 if_icmple 两个int 是否 <= 0xa5 if_acmpeq 两个引用是否 == 0xa6 if_acmpne 两个引用是否 != 0xc6 ifnull 判断是否 == null 0xc7 ifnonnull 判断是否 != null 几点说明: byte,short,char 都会按int比较,因为操作数栈都是4字节 goto

再议Java中的static关键字

a 夏天 提交于 2020-08-13 20:38:37
再议Java中的static关键字   java中的static关键字在很久之前的一篇博文中已经讲到过了,感兴趣的朋友可以参考:《 Java中的static关键字解析 》。   今天我们再来谈一谈static关键字,这次我们侧重讲述static关键字的一些使用场景和方式,以下是本文目录大纲:   一.static关键字使用场景   二.static变量和普通成员变量区别   三.类的构造器到底是不是static方法?   若有不正之处,希望谅解并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:   https://www.cnblogs.com/dolphin0520/p/10651845.html 一.static关键字使用场景   static关键字主要有以下5个使用场景: 1)静态变量   把一个变量声明为静态变量通常基于以下三个目的: 作为共享变量使用 减少对象的创建 保留唯一副本   第一种比较容易理解,由于static变量在内存中只会存在一个副本,所以其可以作为共享变量使用,比如要定义一个全局配置、进行全局计数。如: public class CarConstants {   // 全局配置,一般全局配置会和final一起配合使用, 作为共享变量   public static final int MAX_CAR_NUM = 10000; } public

一个Java方法能使用多少个参数?

大兔子大兔子 提交于 2020-08-04 11:20:44
我最近给我fork的项目QuickTheories增加了一个接口: @FunctionalInterface public interface QuadFunction<A, B, C, D, E> { E apply(A a, B b, C c, D d); } 这让非常好奇一个方法能够有多少个类型参数呢?据我所知,Java的语言规范并没有提到这个问题。 1 关于在实现上这个阈值的定义,我有两个猜测: 编译器会强制一个可预测的阈值,例如255或者65535。 由于实现细节的原因,编译器的异常处理会施加意想不到的限制。 我不想通过我薄弱的C++技能来测试源代码,所以我决定直接来测试编译器 2 。我写了一个Python脚本,通过二分法找到一个会触发错误的最小值。完整的代码请见连接 Github Repo 。 最直接的办法就是生成方法。幸运的是,我们不必使用任何已有的类型参数,只需要按照<A,B,C..>的形式来生成: def write_type_plain(count): with open('Test.java', 'w') as f: f.write("public class Test {\n") f.write("public <") for i in range(count): if (i > 0): f.write(", ") f.write("A" + str(i +

深入理解JVM虚拟机4:Java class介绍与解析实践

寵の児 提交于 2020-05-03 20:44:17
用java解析class文件 转自https://juejin.im/post/589834a20ce4630056097a56 前言 身为一个java程序员,怎么能不了解JVM呢,倘若想学习JVM,那就又必须要了解Class文件,Class之于虚拟机,就如鱼之于水,虚拟机因为Class而有了生命。《深入理解java虚拟机》中花了一整个章节来讲解Class文件,可是看完后,一直都还是迷迷糊糊,似懂非懂。正好前段时间看见一本书很不错:《自己动手写Java虚拟机》,作者利用go语言实现了一个简单的JVM,虽然没有完整实现JVM的所有功能,但是对于一些对JVM稍感兴趣的人来说,可读性还是很高的。作者讲解的很详细,每个过程都分为了一章,其中一部分就是讲解如何解析Class文件。 这本书不太厚,很快就读完了,读完后,收获颇丰。但是纸上得来终觉浅,绝知此事要躬行,我便尝试着自己解析Class文件。go语言虽然很优秀,但是终究不熟练,尤其是不太习惯其把类型放在变量之后的语法,还是老老实实用java吧。 话不多说,先贴出项目地址: github.com/HalfStackDe… Class文件 什么是Class文件? java之所以能够实现跨平台,便在于其编译阶段不是将代码直接编译为平台相关的机器语言,而是先编译成二进制形式的java字节码,放在Class文件之中,虚拟机再加载Class文件

聊聊并发

断了今生、忘了曾经 提交于 2020-04-29 12:33:40
对于Java开发者来说synchronized关键字肯定不陌生,对它的用法我们可能已经能信手扭来了,但是我们真的对它深入了解吗? 虽然网上有很多文章都已经将synchronized关键字的用法和原理讲明白了,但是我还是想根据我个人的认识,来跟大家伙来聊一聊这个关键字。 我不想上来就搞什么实现原理,我们来一起看看synchronized的用法,再由浅到深的聊聊synchronized的实现原理,从而彻底来彻底掌握它。 我们都知道synchronized关键字是Java语言级别提供的锁,它可以为代码提供有序性和可见性的保。 synchronized作为一个互斥锁,一次只能有一个线程在访问,我们也可以把synchronized修饰的区域看作是一个临界区,临界区内只能有一个线程在访问,当访问线程退出临界区,另一个线程才能访问临界区资源。 synchronized关键字的用法 1、怎么用 synchronized一般有两种用法:synchronized 修饰方法和 synchronized 代码块。 我们就通过下面的例子,一起感受一下synchronized的使用,感受一下synchronized这个锁到底锁的是什么。 public class TestSynchronized { private final Object object = new Object(); //修饰静态方法

[转帖]JProfiler诊断Java服务性能指南

。_饼干妹妹 提交于 2020-04-20 21:20:19
JProfiler诊断Java服务性能指南 https: // www.jianshu.com/p/2b307a95fd9f 云主机安装监控工具 #Download wget -S http://download-keycdn.ej-technologies.com/jprofiler/jprofiler_linux_9_2_1.sh #Install sh jprofiler_linux_9_2_1.sh # Start cd jprofiler9/bin/ ./jpenable # Attach target pid # Set port 下载安装JProfiler图形界面工具 Mac 环境,直接下载: http://download-keycdn.ej-technologies.com/jprofiler/jprofiler_macos_9_2_1.dmg 运行:Start Center -> Quick Attach -> On Another Computer,选择IP、Port。 注意:JProfiler 诊断期间,会引起服务性能降低。另外,Profiling Setting 有两个设置:建议使用Sampling,Instrumentation对性能影响过大,不建议使用。 使用诊断工具 JProfiler 图形工具可以比较直观的看到内存