java.lang.OutOfMemoryError: PermGen space 这一部分用于存放Class和Meta的信息,Class在被Load的时候被放入PermGen space区域。所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种是永久代内存不够,可通过调整JVM的配置: -XX:MaxPermSize、-XXermSize
java.lang.OutOfMemoryError: Direct buffer memory 可能原因是本身资源不够或者申请的太多内存。如果不是内存泄漏的话,可以使用参数-XX:MaxDirectMemorySize参数,或者-XX:MaxDirectMemorySize
java.lang.OutOfMemoryError: unable to create new native thread 可能原因是系统内存耗尽,无法为新线程分配内存或者创建线程数超过了操作系统的限制。通过两个途径解决:
排查应用是否创建了过多的线程。通过jstack确定应用创建了多少线程
调整操作系统线程数阈值。操作系统会限制进程允许创建的线程数,使用ulimit -u命令查看限制。某些服务器上此阈值设置的过小,比如1024。一旦应用创建超过1024个线程,就会遇到java.lang.OutOfMemoryError: unable to create new native thread问题。如果是这种情况,可以调大操作系统线程数阈值。
减小堆内存。一个老司机也经常忽略的非常重要的知识点:线程不在堆内存上创建,线程在堆内存之外的内存上创建。所以如果分配了堆内存之后只剩下很少的可用内存,依然可能遇到java.lang.OutOfMemoryError: unable to create new native thread。考虑如下场景:系统总内存6G,堆内存分配了5G,永久代512M。在这种情况下,JVM占用了5.5G内存,系统进程、其他用户进程和线程将共用剩下的0.5G内存,很有可能没有足够的可用内存创建新的线程。如果是这种情况,考虑减小堆内存。
在年轻代(包括Eden区和Survivor区)中的垃圾回收称之为 Minor GC。Minor GC当年轻代中eden区分配满的时候触发,只会清理年轻代。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。
Full GC
full gc是收集整个堆,包括young gen、old gen、perm gen(如果存在的话)、元空间(1.8及以上)等所有部分的模式。
import java.lang.ref.ReferenceQueue;
public class Main {
public static void main(String[] args) {
ReferenceQueue queue = new ReferenceQueue();
PhantomReference pr = new PhantomReference(new String("hello"), queue);
System.out.println(pr.get());
}
}
垃圾收集器
如果说垃圾回收算法是内存回收的方法论,那么垃圾收集器就是具体实现。jvm会结合针对不同的场景及用户的配置使用不同的收集器。 年轻代收集器: Serial、ParNew、Parallel Scavenge 老年代收集器: Serial Old、Parallel Old、CMS收集器 特殊收集器: G1收集器(新型,不在年轻、老年代范畴内)
可以认为是Serial的升级版,因为它支持多线程[GC线程],而且收集算法、Stop The World、回收策略和Serial一样,就是可以有多个GC线程并发运行,它是HotSpot第一个真正意义实现并发的收集器。默认开启线程数和当前cpu数量相同,如果cpu核数很多不想用那么多,可以通过-XX:ParallelGCThreads来控制垃圾收集线程的数量。
并发标记(concurrent mark):并发标记就需要标记出GC roots 关联到的对象的引用对象有哪些。比如说 A -> B (A引用B,假设A是GC Roots关联到的对象),那么这个阶段就是标记出B对象,A对象会在初始标记中标记出来。这个过程是可以和用户线程并发执行的。所谓的并发的实现,可以有几种方式,比如说,标记了100个对象,那么就停一停,让用户线程跑一会;再比如说,标记了10ms,再停一停,之类的实现。
g1通过并发(并行)标记阶段查找老年代存活对象,通过并行复制压缩存活对象(这样可以省出连续空间供大对象使用)。g1将一组或多组区域中存活对象以增量并行的方式复制到不同区域进行压缩,从而减少堆碎片,目标是尽可能多回收堆空间,且尽可能不超出暂停目标以达到低延迟的目的。g1提供三种垃圾回收模式 young gc、mixed gc 和 full gc,不像其它的收集器,根据区域而不是分代,新生代老年代的对象它都能回收。几个重要的默认值,更多的查看官方文档oracle官方g1中文文档 g1是自适应的回收器,提供了若干个默认值,无需修改就可高效运作
java中最常用jar包的用途
jar包用途axis.jarSOAP引擎包commons-discovery-0.2.jar用来发现、查找和实现可插入式接口,提供一些一般类实例化、单件的生命周期管理的常用方法.jaxrpc.jarAxis运行所需要的组件包saaj.jar创建到端点的点到点连接的方法、创建并处理SOAP消息和附件的方法,以及接收和处理SOAP错误的方法. w
创建图表事件监听非常简单:首先是通过addEventListener('监听类型',js监听方法)添加事件监听,然后在js监听方法中定义具体监听逻辑。
以钻取操作为例,当用户点击图表某一个point的时候弹出point的name和value,代码如下:
<script>
//创建AnyChart
var chart = new AnyChart();
//添加钻取操作&quo
我们来看下面的例子:
create or replace view testview
as
select empno,ename from emp where ename like ‘M%’
with check option;
这里我们创建了一个视图,并使用了with check option来限制了视图。 然后我们来看一下视图包含的结果:
select * from testv