JVM
红豆和绿豆
这个作者很懒,什么都没留下…
展开
-
内存调优的案例分析
如何解决这个问题呢?方法1:首先产看GC日志,发现是Full GC的时间很长。如果是我的话,我首先查看使用的是什么垃圾收集器,可以设置PretenuringSizeThreshold大一些,这样12G的堆可以装载下对象,而不直接进入老年代。方法2:可以建立5个32位的逻辑集群,每个进程2GB内存空间,则一共占用10GB内存。另外建立一个Apache服务器作为前段负载代理访问用户。考虑到对用原创 2015-11-03 11:41:29 · 443 阅读 · 0 评论 -
线程的模型
1、内核线程:直接由操作系统内核支持的线程。用户线程不能直接调用系统内核线程,出现一个轻量级进程供用户调用,该轻量级轛程由操作系统创建,运行,调度,切换,映射到cpu上。是1:1的模型如下图所示:其中P是用户的进程,由多个LWP(轻量级进程)同时执行,KLT(内核线程)。轻量级线程与内核线程是1:1的关系。因此,LWP的创建 、执行、调度、映射到cpu上 、进程的切换都需要操作系统原创 2015-11-08 13:41:44 · 382 阅读 · 0 评论 -
java中线程安全的实现方法
1、互斥同步(悲观并发)互斥包括的几种方式:临界区、互斥量(wait(),notify())、信号量(synchronized、java.util.concurent)synchronized 是一个重量级的锁,因为线程的切换需要操作系统的调用。如果一个线程要获取一个对象,首先获取对象的锁,如果对象已经加锁,将计数值+1,如果释放对象的锁,则计数值-1。也可以使用Lock lock=n原创 2015-11-08 15:19:40 · 3888 阅读 · 0 评论 -
JVM的运行时数据区的分块
JVM的内存主要是运行时数据区1:程序计数器,功能:主要完成当前线程执行功能的指令,包括循环,分支等,如果调用java方法,则程序计数器中记录着java虚拟机字节码指令的地址,如果调用本地的方法,程序计数器存储的是空值。每一个线程独立共享这块内存区域且JVM规范这块内存不会出现OutOfMemoryError的错误。2:JVM栈,功能:JVM栈的基本结构是栈帧,每一个栈帧代表类的一个方法,原创 2015-10-29 19:00:07 · 443 阅读 · 0 评论 -
JVM抛出OutOfMemory 的集中情况的解析
1、java堆的内存泄露和内存溢出内存泄露:一个生命周期长的对象引用一个生命周期短的对象,当生命周期短的对象不再被使用时,不能被GC进行回收。内存溢出:对象的生命周期长,一直占用内存,新的对象无法再被创建,就会抛出OutOfMemoryError的异常。/** * VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError *原创 2015-10-31 09:58:38 · 1114 阅读 · 0 评论 -
使用Memory Analyzer Tool(MAT)Eclipse插件分析内存泄露
前言在使用Memory Analyzer tool(MAT)分析内存泄漏(一)中,我介绍了内存泄漏的前因后果。在本文中,将介绍MAT如何根据heap dump分析泄漏根源。由于测试范例可能过于简单,很容易找出问题,但我期待借此举一反三。一开始不得不说说ClassLoader,本质上,它的工作就是把磁盘上的类文件读入内存,然后调用java.lang.ClassLoader.defin转载 2015-10-31 09:51:00 · 385 阅读 · 0 评论 -
java中的垃圾收集算法
1、标记-清除(Mark——Sweep):该算法分为二个部分“标记”和“清除”二个阶段,首先标记出所有可回收的对象,在标记完成之后统一进行回收所有被标记的对象。缺点:(1)标记和清除二个过程效率不是很高。(2)空间的问题,可能造成大量的不连续的空间碎片,当没有足够大的空间装载对象时,就会导致提前出发垃圾回收。2、复制算法:就是将可用的内存按照容量划分为大小相同的二块,每次只使用其中的一原创 2015-11-01 19:10:36 · 313 阅读 · 0 评论 -
对象如何在内存中分配
对象肯定是在java的堆中进行分配,一般情况下分配在新生代的Eden中,如果对象很大,可能对象直接进入老年代。如果在堆中,线程申请了TLAB本地线程缓存,则在缓存中存储对象。由于垃圾收集器的不同,则对象的分配策略也是不同的,以下是集中内存分配的策略:1、对象优先在Eden区域中分配当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC。原创 2015-11-02 17:30:59 · 1006 阅读 · 0 评论 -
理解GC日志以及垃圾收集参数的总结
1、理解以下的GC日志的含义:2、垃圾收集参数的总结,可以使用以下参数来改变JVM的垃圾收集器:原创 2015-11-02 16:53:07 · 391 阅读 · 2 评论 -
java中的垃圾收集与内存分配
以下有三个问题:1、那些内存需要回收?java堆中创建的对象需要回收,以及方法区中的类需要卸载以及常量池需要回收。2、什么时候回收?JVM通过可达性算法分析,如果一个对象到GC roots对象之间没有链,则该对象就会被GC回收。如果判断一个对象可以被回收,就将该对象放入到F_Queue队列中,JVM会启动一个低优先级的Finalizer线程,去触发对象中的对象执行finalize(原创 2015-11-01 17:46:53 · 287 阅读 · 0 评论 -
java虚拟机的性能监控工具的介绍以及指令的含义
1 性能监控的命令:2、jps的具体使用:jps - l -v -q -m 3、jstat:虚拟机统计信息监视工具这个命令的主要功能就是进程的类装载、内存、垃圾收集、JIT编译等运行的数据。jstat -gc 线程ID (2764) 查询的间隔时间(250) 执行的次数(20)3、jinfo java配置信息工具实时的查看和调整虚拟机原创 2015-11-02 20:46:48 · 426 阅读 · 0 评论 -
java中的垃圾收集器
java中的垃圾收集器如下图所示:1、Serial收集器:单线程收集器。它只会使用一个线程去完成垃圾收集工作,更重要的是,当这个线程在收集垃圾的时候,所有的其他工作线程需要停止,直到它收集结束为止。工作图如下:原创 2015-11-01 20:52:19 · 411 阅读 · 0 评论 -
JVM加载字节码文件
https://blog.csdn.net/chenqianleo/article/details/77621086https://blog.csdn.net/gjanyanlig/article/details/6818655/面试题1、字节码结构*.java文件经过javac编译后得到*.class文件,称为字节码文件,字节码文件时构成各种平台虚拟机的关键基石,字节码文件包含...转载 2018-08-26 22:46:30 · 802 阅读 · 0 评论 -
volatile的详细讲解
1、锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量原创 2015-11-08 10:53:50 · 988 阅读 · 0 评论 -
java的内存模型与线程
首先介绍一下从硬件的效率与一致性说一一下操作系统的内存模型:cpu的执行速度与内存的读取的速度不是一个数量级的,因此,为了提高CPU的利用率,提出了高速缓存,将内存的数据首先放到高速缓存,每个处理器对应一个高速缓存,当多个CPU同时进行计算的时候,可能缓存中的数据会与主内存中的数据不一致,因此多个高速缓存要遵循缓存一致模型协议,才能保证主内存中的数据是正确的,安全的。java的内存原创 2015-11-08 10:46:02 · 393 阅读 · 0 评论 -
java中class文件的结构的介绍
我们所说的java程序,一次编写,到处可以运行。每一个不同的操作系统只要安装了JVM就可以运行。其实质就是:JVM和class文件有着直接的关系,class文件是字节码(ByteCode),jvm会加载符合一定要求的class文件,不仅是java语言,Scala,JRuby Grvooy 等不同的语言,通过不同的编译器编译成class文件,JVM的默认类加载器都可以对这个class文件进行加载,增原创 2015-11-03 14:59:26 · 332 阅读 · 0 评论 -
运用上一节介绍的类加载的过程,介绍一个详细的实例
大家可以根据上一节的介绍尝试运行package classloader;class Singleton{private static Singleton singleton=new Singleton();public static int counter1;public static int counter2=0;private Singleton(){原创 2015-11-05 15:35:44 · 484 阅读 · 0 评论 -
java类加载器的父亲委托机制详细介绍
讲解一下ClassLoader这个类java.lang.Object java.lang.ClassLoader类加载器是负责加载类的对象。ClassLoader 类是一个抽象类。如果给定类的二进制名称,那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的“类文件”。ClassLoader 类使用委托模型来搜索类和资源原创 2015-11-05 19:57:03 · 1182 阅读 · 1 评论 -
JVM中类的加载过程详解
介绍一下JVM将何时结束线程的生命(1)程序执行System.exit()(2)程序正常结束(3)程序抛出异常,一直向上抛出,没有try{}catch()finally{}处理。(4)由于操作系统的异常,导致JVM退出类的加载过程主要包括三个部分:加载,连接(验证,准备,解析),初始化原创 2015-11-04 21:23:28 · 5457 阅读 · 0 评论 -
java的类加载器详解
首先写一个小例子讲解一下ClassLoader这个类package classloader;class C{static{System.out.println("C ... ....");}}public class TestClassLoader {/*** @param args*/public static void main(String[] a原创 2015-11-05 18:15:15 · 415 阅读 · 0 评论 -
java中如何创建自己的类加载器详解
要创建自己的类加载器 需要继承lava.lang.ClassLoader 这个类,重写defineClass(String name )方法,该方法根据指定的类名,返回指定的Class对象以下是简单的剖析以下ClassLoader的源码,有助于我们理解Class加载的整个流程public abstract class ClassLoader { // The parent c原创 2015-11-05 20:36:56 · 643 阅读 · 0 评论 -
jvm加载Final修饰的变量时,类是否需要加载
package classloader;class FinalTest{public static final int x=6/3;static{System.out.println("FinalTest is execute");}}public class Test1 {/*** @param args*/public原创 2015-11-05 15:56:27 · 2448 阅读 · 3 评论 -
创建自己的类加载器,从不同的目录中加载class文件
对上述类加载器的详细讲解:原创 2015-11-06 14:44:00 · 396 阅读 · 0 评论 -
java中类的卸载
但是用户自定义的类加载器加载的类是可以被卸载的。原创 2015-11-06 15:17:14 · 2769 阅读 · 1 评论 -
java线程调度方式以及线程的状态转换讲解
java线程的调度主要有二种方式:(1)协同式执行(2)抢占式执行(1)协同式执行就是一个线程执行完毕通知操作系统去执行另外一个线程,因此多线程执行,不会出现同步的问题,但是如果一个线程的执行时间很长的话,可能导致系统崩溃的问题。(2)抢占式执行,线程的执行时间是由操作系统决定。操作系统采用时间片轮转的算法,去执行每一个线程。我们用户也可以给线程设置优先级,优先级高的先执行,优先级低的后执原创 2015-11-08 14:13:58 · 464 阅读 · 0 评论 -
java中线程安全的讲解
什么叫做线程安全?线程安全应该是在多线程并发情况下,不需要额外的同步,调用对象的属性可以得到正确的结果。java中线程安全包括5个方面1、不可变性如果一个变量时不可变的,那么多个线程的访问都是安全例如 java.lang.String 类 是一个final修饰的类,它的值都是不可变的,因此是线程安全的final 修饰的变量,具有可见性,也是线程安全的。2、绝对安全:就是原创 2015-11-08 14:55:05 · 676 阅读 · 0 评论 -
java中锁的优化
1、自旋锁:多个线程在多个cpu下运行,如果一个线程没有获取对象的锁,需要阻塞。但是该线程可以不放弃cpu的执行,该线程可以自旋,等待该线程获取对象的锁,减少进程间切换的开销。2、自适应锁:该线程可以预知该线程要获取该对象需要自旋多少次3、锁清除:虚拟机在即时编译器运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行清除。4、锁粗化:一般情况下,总是推荐将同步块的作原创 2015-11-08 18:38:12 · 482 阅读 · 0 评论 -
JVM GC算法
在判断哪些内存需要回收和什么时候回收用到GC 算法,本文主要对GC 算法进行讲解。https://www.cnblogs.com/wupeixuan/p/8670341.htmlJVM垃圾判定算法常见的JVM垃圾判定算法包括:引用计数算法、可达性分析算法。引用计数算法(Reference Counting)引用计数算法是通过判断对象的引用数量来决定对象是否可以被回收。给对象...转载 2018-08-26 23:07:52 · 155 阅读 · 0 评论