
优化
xiaoliuliu2050
这个作者很懒,什么都没留下…
展开
-
JVM:内存常见的问题,以及分析处理方法
一.前言各位开发和运维同学,在项目实施落地的过程中,尤其是使用EDAS、DRDS、MQ这些java中间件时,肯定会遇到不少JAVA程序运行和JVM的问题。我结合过去遇到的各种各样的问题和实际处理经验,总结了JAVA问题的处理方式,希望能帮助到大家。二.问题处理总体概括如下图所示:问题处理分为三大类:1.问题发生后的紧急处理原则2.问题归类和分析3.分析排查工具和命...原创 2019-10-23 17:13:54 · 418 阅读 · 0 评论 -
Minor GC、Major GC和Full GC之间的区别 gc的触发时机
概念:● 新生代 GC(Minor GC):从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。这一定义既清晰又易于理解。但是,当发生Minor GC事件的时候,有一些有趣的地方需要注意到:1. 当 JVM 无法为一个新的对象分配空间时会触发 Min...转载 2019-10-23 15:40:47 · 1205 阅读 · 0 评论 -
java 程序内存监控工具使用jps jstat,jmap,jinfo
名称 主要功能 jps JVM Process Status Tool,显示指定系统内所有HotSpot虚拟机进程 jstat JVM Statistics Minitoring Tool,用于收集HotSpot虚拟机各方面的运行数据 jinfo Configuration Info for Java,显示虚拟机配置信息 jmap Memory Map...原创 2019-10-18 17:59:33 · 322 阅读 · 0 评论 -
dcl的问题
DCL单例模式针对延迟加载法的同步实现所产生的性能低的问题,我们可以采用DCL,即双重检查加锁(Double Check Lock)的方法来避免每次调用getInstance()方法时都同步。实现方式如下:public class LazySingleton { private int someField; private static LazySingleton i转载 2017-06-30 15:25:40 · 411 阅读 · 0 评论 -
java 多线程协作 Semaphore 信号量
Semaphore简介Semaphore是一个计数信号量,它的本质是一个"共享锁"。信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。Semaphore的函数列表// 创建具有给定的许可数和非公平的公平设...转载 2017-06-30 15:14:03 · 453 阅读 · 0 评论 -
多线程协作之 CyclicBarrier (多个线程之间相互等待, 都到了之后继续执行或者另外一个线程开始执行)
CyclicBarrier简介CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。注意比较CountDownLatch和CyclicBarrier:(01) CountDownLatch的作用是允许1或N个线程等待其他线程...转载 2017-06-30 15:12:03 · 490 阅读 · 0 评论 -
java多线程协作之CountDownLatch (线程等待其他一个或者多个线程执行完毕之后开始执行)
CountDownLatch简介CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。CountDownLatch和CyclicBarrier的区别(01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。(02) CountDownLatch的计数...转载 2017-06-30 15:09:29 · 558 阅读 · 0 评论 -
java CAS 和ABA问题
ava CAS 和ABA问题2014-06-03 23:42 by Loull, 5460 阅读, 2 评论, 收藏, 编辑独占锁:是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。乐观锁:每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止。一、CAS 操作乐观锁用到的机制就是CAS,转载 2017-06-30 11:32:37 · 403 阅读 · 0 评论 -
常用的JDK自带命令行工具
名称主要功能jpsJVM Process Status Tool,显示指定系统内所有HotSpot虚拟机进程jstatJVM Statistics Minitoring Tool,用于收集HotSpot虚拟机各方面的运行数据jinfoConfiguration Info for Java,显示虚拟机配置信息jmapMemory M转载 2017-07-01 09:09:10 · 3546 阅读 · 0 评论 -
SimpleDateFormat 使用注意事项
SimpleDateFormat类的继承关系:java.text Class SimpleDateFormatjava.lang.Object | +----java.text.Format | +----java.text.DateFormat| +----java.text.SimpleDateFormat转载 2017-07-27 11:33:29 · 898 阅读 · 0 评论 -
Unicode和UTF-8之间的关系
需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。 比如,汉字“严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。 这里就有两个严重的问题,第一个问题是,如何才能区别unicod转载 2017-07-02 11:08:47 · 385 阅读 · 0 评论 -
synchronized 原理
记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着我们学习的进行我们知道synchronized是一个重量级锁,相对于Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。 诚然,随着Javs转载 2017-06-30 10:13:29 · 585 阅读 · 0 评论 -
7.1 :OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题。我们需要找造成OutOfMemoryError原因。一般有两种情况:
OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题。我们需要找造成OutOfMemoryError原因。一般有两种情况:1、内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收,通过找出泄露的代码位置和原因,才好确定解决方案;2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生原创 2016-10-20 10:05:56 · 12318 阅读 · 1 评论 -
6.1 java 选项 -javaagent、-agentlib、-agentpath
-javaagent、-agentlib、-agentpath都是 jvm 启动的时候可以设置的参数,那这些参数都是什么作用呢? -agentlib:libname[=options] 用于装载本地lib包; 其中libname为本地代理库文件名,默认搜索路径为环境变量PATH中的路径,options为传给本地库启动时的参数,多个参数之间用逗号分隔。在Windows平台上jv...转载 2016-11-11 10:39:25 · 18186 阅读 · 0 评论 -
4.1 jvm 深入学习之 java 引用
java 引用分几种?一、Java引用的四种状态:强引用: 用的最广。我们平时写代码时,new一个Object存放在堆内存,然后用一个引用指向它,这就是强引用。 如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。原创 2016-11-04 18:38:59 · 339 阅读 · 0 评论 -
1.3 运行j2ee 程序的时候,tomcat服务器 和jvm 各自的责任?
待续原创 2016-11-03 14:48:53 · 348 阅读 · 0 评论 -
1.2 :tomcat 启动的时候如何启动虚拟机
tomcat 启动命令 start.bat 会调用 catalina.batcatalina.bat 会调用 java 命令 并且会配置启动参数,用于优化jvm.在catalina.bat 里配置java_opts 这个时候,这个tomcat下的所有的项目都是进行过jvm 调优的原创 2016-11-03 17:45:19 · 1241 阅读 · 0 评论 -
1.1 java 虚拟机如何启动的?启动之后都做了什么?
如何启动?java 命令java命令是一个入口,执行的时候 会找到对应的执行文件,它会调用java api 接口(java api 接口和jvm 一起构成了jre),接口内部会调用其他接口创建虚拟机(虚拟内存,硬件,CPU等),然后虚拟机会创建 bootstrap 类加载器,bootstrap类加载器,会创建 扩展类加载器和应用程序类加载器,应用程序加载器 会首先会去寻找 方法原创 2016-11-03 17:37:11 · 4492 阅读 · 0 评论 -
5 :jvm 执行引擎是个啥?
JVM结构 Java编写的代码会按照下图的流程来执行:图 1: Java代码执行流程 类装载器装载负责装载编译后的字节码,并加载到运行时数据区(Runtime Data Area),然后执行引擎执行会执行这些字节码通过类装载器装载的,被分配到JVM的运行时数据区的字节码会被执行引擎执行。执行引擎以指令为单位读取Java字节码。它原创 2016-11-03 17:42:03 · 4402 阅读 · 3 评论 -
4 :jvm 垃圾回收机制
GC对它们的回收:内存区域中的程序计数器、虚拟机栈、本地方法栈这3个区域随着线程而生,线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈的操作,每个栈帧中分配多少内存基本是在类结构确定下来时就已知的。在这几个区域不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了。GC回收的主要对象:而Java堆和方法区则不同,一个接口中的多个实现类需要的内存可能不...原创 2016-11-03 17:55:48 · 322 阅读 · 0 评论 -
3 jvm runtime data area 运行时数据区 内存分配
图 4: 运行时数据区 运行时数据区是在JVM运行的时候操作系统所分配的内存区。运行时内存区可以划分为6个区域。在这6个区域中,一个PC Register,JVM stack 以及Native Method Statck都是按照线程创建的,Heap,Method Area以及Runtime Constant Pool都是被所有线程公用的。PC寄存器(PC register):每个线...原创 2016-11-03 17:40:41 · 1668 阅读 · 0 评论 -
1 :jvm 是什么?
JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。Java Runtime Environment(JRE)是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。JVM是Java Virtual Machine(Java虚拟机)的缩写,是整个java实现跨平台的原创 2016-11-03 14:40:26 · 396 阅读 · 0 评论 -
java 调用 dll文件的原因,方式,原理?
待续原创 2016-11-11 10:40:25 · 563 阅读 · 0 评论 -
2.1 :java能不能自己写一个类叫java.lang.System/String正确答案
最近学习了下Java类加载相关的知识。然后看到网上有一道面试题是能不能自己写个类叫java.lang.System?网上提供的答案:通常不可以,但可以采取另类方法达到这个需求。所谓的另类方法指自己写个类加载器来加载java.lang.System达到目的。首先表明下我的观点。上述答案完全是误导读者,是不正确的答案。我就纳闷了网上怎么把这种完全不正确的搜索结果排在前面,而且几乎搜转载 2016-11-11 13:57:53 · 736 阅读 · 0 评论 -
1.4 jvm 知识点汇总 概括
java 虚拟机知识学习:1、Java虚拟机结束生命周期的情况:执行了System.exit()方法程序正常执行结束程序执行过程中遇到了异常或者错误而终止操作系统出现错误而导致Java虚拟机进行终止2、类的加载、连接和初始化:加载:查找并加载类的二进制数据连接:验证:确保被加载的类的正确性准备:为类的静态变量分配内存,并将其初始化为默认值解析:把类中的符号引用转换为直接引原创 2016-10-19 11:20:08 · 307 阅读 · 0 评论 -
java 线程同步原语: LockSupport
LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程阻塞原语,基于lockSupport 实现了很多场景类的工具类,比如Lock ,CountDownLatch,BlockingQueue等这个类的作用就是阻塞线程,解阻塞线程,依赖于这个功能,我们可以做出好多场景实现,比如在获取某个锁的时候,获取不到我就要阻塞线程,比如向队列里添加元素的时候,如果...转载 2017-06-30 08:53:53 · 351 阅读 · 0 评论 -
原子变量 和cas 原理
synchronized的基本原理回顾在jvm内部,所有对象都含有单一的锁,jvm负责跟踪监视被加锁次数,叫做对象监视器。当线程第一次给对象加锁的时候,计数器会加1,离开时会减1.同样任务是可重入的,每次重入也是加1,离开减1. synchronized是独占式的,拿到对象锁才能继续,没有获取到锁就会阻塞。JUC CAS乐观锁基本原理synchronized就是一种独占锁转载 2017-06-30 08:53:37 · 354 阅读 · 0 评论 -
Java类继承关系中的初始化顺序
Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释。非继承关系中的初始化顺序对于非继承关系,主类InitialOrderWithoutExtend中包含了静态成员变量(类变量)SampleClass 类的一个实例,普通成员变量SampleClass 类的2个实例(在程序中的顺序不一样)以及转载 2017-06-29 15:21:30 · 429 阅读 · 0 评论 -
Java 高并发场景下的操作系统和jvm内存模型
多任务和高并发的内存交互多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题,它代表着一秒内服务器平均能响应的请求数,而TPS值与程序的并发能力有着非常密切的关系。物理机的并发问题与虚拟机中的情况有很多相似之处,物理机对并发的处理方案对于虚拟机的实现也有相当大...原创 2017-06-29 15:19:20 · 327 阅读 · 0 评论 -
HotSpot垃圾收集器
相关概念并发和并行这两个名词都是并发编程中的概念,在谈论垃圾收集器的上下文语境中,它们可以解释如下。并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。Minor转载 2017-06-29 14:18:59 · 234 阅读 · 0 评论 -
垃圾收集算法
垃圾收集算法主要有以下几种:标记-清除算法(mark-sweep)、复制算法(copying)和标记-整理算法(mark-compact)。标记-清除算法算法的执行过程与名字一样,先标记所有需要回收的对象,在标记完成后统一回收所有被标记的对象。该算法有两个问题:标记和清除过程效率不高。主要由于垃圾收集器需要从GC Roots根对象中遍历所有可达的对象,并给这些对象加上一个标转载 2017-06-29 13:45:52 · 250 阅读 · 0 评论 -
垃圾回收
为什么要垃圾回收我们知道电脑的内存是有限的,如果一段程序申请了一块内存空间并执行完计算之后,没有释放内存,会导致这块内存被占用,那么可用内存就变少了,如果一个系统很庞大,程序中迟早会把电脑内存耗尽的。为了提高内存的使用效率,内存在使用完必须释放,这样其他程序才可能重新申请这块内存。C语言中有malloc、free等于内存分配以及内存释放的函数。而Java中使用垃圾收集机制来整理内存空间。转载 2017-06-29 13:34:10 · 239 阅读 · 0 评论 -
OutOfMemoryError异常总结
JVM内存区域中,除了程序计数器外,其他几个运行时区域都有可能发生OutOfMemoryError(OOM)异常。本文对OOM异常进行总结,通过代码验证JVM规范中描述的运行时区域存储的内容;了解可能导致这些区域OOM异常的代码,能够在工作中根据异常代码对内存哪一出区域进行定位。基于Sun的HotSpot虚拟机,在Eclipse中Run/Arguments中可以进行虚拟机启动参数的设置,这转载 2017-06-29 13:13:48 · 416 阅读 · 0 评论 -
jvm 内存区域划分
JVM具有自动内存管理机制,Java不需要像c/c++一样,为每一个new操作写配对的delete/free代码,不容易出现内存泄露和溢出。JVM内存区域主要包括如下部分:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。程序计数器程序计数器可以视为当前线程所执行的字节码行号指示器,如果当前执行的是Native方法,计数器的值为空(Undefined)。在JVM的概念模型中...原创 2017-06-29 13:13:11 · 253 阅读 · 0 评论 -
Java对象的创建、内存布局、访问定位
对象的创建一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查、对象分配内存、并发处理、内存空间初始化、对象设置、执行ini方法等。主要流程如下:1. 类加载检查JVM遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初转载 2017-06-29 13:00:06 · 279 阅读 · 0 评论 -
7 :Tomcat中JVM内存溢出及合理配置
待续转载 2016-11-03 17:56:47 · 3972 阅读 · 0 评论 -
6 :java 启动参数整理
Java启动参数共分为三类;其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用; 一.标准参数-client 设转载 2016-11-07 18:46:29 · 412 阅读 · 0 评论 -
高并发量网站解决方案
一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单。随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求,已经不是原来简单的ht转载 2016-10-21 18:19:07 · 269 阅读 · 0 评论