
jvm
我钟意饮王老菊
Just lose it
展开
-
JAVA堆溢出
前言:看到学校课程q群里面有个同学说遇到oom问题怎么办,然后有一个同学给出了分析dump文件,这让我回想当时看深入理解jvm这本书的时候也看到了相关的例子,不过当时没有跟着操作下去。现在来补一补实现内存泄漏–java堆溢出配置vm参数-Xms20m 堆的最小值-Xmx20m 堆的最大值 避免堆自动扩展-XX:+HeapDumpOnOutOfMemoryError 发生堆溢出的时候生成dump文件以便与后面分析java代码:// vm args:-Xms20m -Xmx20m -XX原创 2020-05-27 19:53:36 · 303 阅读 · 0 评论 -
单例模式双重检测锁详解以及为何双重检测
前言:在了解完volatile关键字之后,再仔细思考了单例模式的双重检测,发现以前挺多东西还没懂的。DCL(Double Check Lock)public class Singleton { private volatile static Singleton uniqueInstance; private Singleton() {} public static Singleton getInstance() { //第一次检测 if (uniqueInstance == null原创 2020-05-22 11:49:55 · 4411 阅读 · 4 评论 -
线程安全与锁优化
前言:唏唏唏嘘嘘,终于看完了《深入理解jvm》这本书,虽然看的是跳着看的,部分性能调优方面并没有看,弥补了很多重要的知识,虽然写的博客都是根据书本摘抄而来带上一些个人的体会,但张家辉话斋:你最紧要记得自己为咩上台。没计,既然选择了这条路,点都要顶落去!线程安全与锁优化线程安全的实现方式: 同步是指在多线程并发访问共享数据时,保证共享数据在同一时刻只被一个线程使用。1.互斥同步互斥同步是一种常见并发正确性保障手段。互斥时实现同步的一种手段,临界区、互斥量、信号量都是主要互斥的实现方式。互斥同步原创 2020-05-21 22:44:18 · 318 阅读 · 0 评论 -
JAVA内存模型与线程(二)
JAVA线程调度协同式线程调度线程的执行时间由线程本身来控制,线程把自己的工作执行完了之后,要主动通知系统切换到另外一个线程上。优点:实现简单。缺点:执行时间不可控制。抢占式线程调度每个线程由系统分配执行时间,线程的切换不由线程本身决定。Java使用的就是这种线程调度方式。在这种实现线程调度的方式下,线程的执行时间是系统可控的,不会有一个线程导致整个进程阻塞的问题。Java提供10个级别的线程优先级设置,来让某个线程可以分配多一点的执行时间,不过Java线程是被映射到系统的原生线程原创 2020-05-21 14:30:04 · 159 阅读 · 0 评论 -
JAVA内存模型与线程(一)
前言:《深入理解jvm》差不多看完了重点的部分,揭秘下下一本书是《java并发艺术》,继续冲冲冲。JAVA内存模型(JMM)Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。 C/C++等则直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台上内存模型的差异而导致程序的移植性比较差。Java内存模型必须定义得足够严谨,才能让Java的并发原创 2020-05-20 10:50:47 · 256 阅读 · 0 评论 -
双亲委派模型的破坏(JDBC例子)
双亲委派模型的破坏双亲委托模型并不是一个强制性的约束模型,而是java设计者推荐给开发者的泪加载器实现方式。但是双亲委托模型存在着缺陷,它虽然解决了各个类加载器的基础类的统一问题,基础被称为基础,就是因为他们总是被用户代码调用,但是如果基础类又要调用回用户代码呢?那么在就会使用基础类的类加载器(启动类加载器)去加载用户的代码,而启动类加载器是加载java_home\lib目录下的。而用户代码都是保存在classpath下,根本就不可能加载到啊=。=其中这个方面最典型的就是jdbc对于双亲委派模型的破坏了。原创 2020-05-17 10:56:23 · 2005 阅读 · 1 评论 -
虚拟机类加载机制
前言: 虚拟机并没有约束一定是本地文件才能进行加载,网络文件也是可以的,也没有约束必须是Java文件,一切遵守虚拟机解析规则的文件都能被加载,Java对应的就是Class字节码文件了。 不同于其他语言,在编译时就需要进行连接,Java语言中,类型的加载,连接和初始化都是在程序运行期间完成的,这会带来一定的开销,但是会为Java提供高度的灵活性。比如编写一个面向接口的程序,可以在运行时再指定其实际的实现类。虚拟机类加载机制 类从被加载到虚拟机内存开始,到卸载处内存,它的整个生命周期包括:卸载、验原创 2020-05-16 18:43:31 · 200 阅读 · 0 评论 -
垃圾收集器与内存分配策略(二)
前言:续更《深入理解jvm》,本来昨晚就可以出来的这篇,偷懒了=。=,keep going!!!垃圾收集器垃圾回收器是内存回收的具体实现。两个收集器间有连线,表明它们可以搭配使用:Serial/Serial OldSerial/CMSParNew/Serial OldParNew/CMSParallel Scavenge/Serial OldParallel Scavenge/Parallel OldG1其中Serial Old作为CMS出现"Concurrent Mode F原创 2020-05-15 21:33:38 · 226 阅读 · 0 评论 -
垃圾收集器与内存分配策略(一)
前言:好像蛮久没有更新《深入理解jvm》这本书了,又回来填坑了。垃圾收集器与内存分配策略。程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而灭。这几个区域的内存分配和回收都具备确定性,在这几个区域基本不需要考虑回收问题。因为方法结束或者线程结束,内存自然就回收了。而java堆和方法区则不一样。方法区存放类信息,一个接口中的多个实现类需要的内存不一样,并且只有在程序运行期间才知道会创建哪些对象。这部分内存的分配和回收都是动态的,所以垃圾回收器所关注的就是java堆和方法区。如何判断对象已死原创 2020-05-14 18:03:06 · 247 阅读 · 0 评论 -
Java内存区域与内存溢出异常(二)
前言读书笔记《深入理解java虚拟机》,这个系列得慢慢更新,因为每个知识都是未接触过的。对象的创建的流程类加载虚拟机在遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用(类名),并且检查这个符号引用的类是否以及被加载、解析和初始化过。如果没有就必须先执行类加载的过程。为新生对象分配内存对象所需要的内存大小在类加载之后便可以完全确认,为对象分配空间的任...原创 2020-04-28 13:54:57 · 145 阅读 · 0 评论 -
Java内存区域与内存溢出异常(一)
前言:开了新坑,读书笔记了又。《深入理解java虚拟机》。慢慢坚持下去吧,看砖头书很难,但没办法,顶到既,订到既。基本概念java虚拟机运行时数据区:方法区、虚拟机栈、本地方法栈、堆、程序计数器线程共享内存:方法区、堆线程私有内存:虚拟机栈、本地方法栈、程序计数器那么到底什么是线程私有和共享呢?解答:各个线程之间该模块具有独立的内存空间,各个线程中此模块互不影响、独立存储则为线程私有...原创 2020-04-14 01:31:36 · 171 阅读 · 0 评论