实例变量:存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐。 填充数据:由于虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐,这点了解即可。 Java头对象,它实现synchronized的锁对象的基础,synchronized使用的锁对象是存储在Java对象头里的,jvm中采用2个字来存储对象头(如果对象是数组则会分配3个字,多出来的1个字记录的是数组长度),其主要结构是由Mark Word 和 Class Metadata Address 组成
a.b.c.i = 0;
//下面是异常信息
Exception in thread "main" java.lang.NullPointerException
at Prog.main(Prog.java:5)
文件名和行号不能精确指出哪个变量为空。是a还是b或c?JDK14对此做了改进。
Exception in thread "main" java.lang.NullPointerException:
Cannot read field 'c' because 'a.b' is null.
at Prog.main(Prog.java:5)
但是,这也存在一些风险。空指针异常消息包含源代码中的变量名。暴露此信息可能被视为程序的安全风险。
三、switch表达式
在Java 14之前*
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break;
case TUESDAY:
System.out.println(7);
break;
case THURSDAY:
case SATURDAY:
System.out.println(8);
break;
case WEDNESDAY:
System.out.println(9);
break;
}
Java 14增强功能
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
final class Point {
public final int x;
public final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
// 很多的equals, hashCode, toString,getters、setters
}
Warning This feature was DEPRECATED in PHP 5.5.0, and REMOVED as of PHP 7.0.0.如果设置了这个被弃用的修饰符, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线(\)和 NULL 字符在 后向引用替换时会被用反斜线转义.
This feature was DEPRECATED in PHP 5.5.0, and REMOVED as of PHP 7.0.0.如果设置了这个被弃用的修饰符, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线(\)和 NULL 字符在 后向引用替换时会被用反斜线转义.
Class – 由系统类加载器(system class loader)加载的对象,这些类是不能够被回收的,他们可以以静态字段的方式保存持有其它对象。我们需要注意的一点就是,通过用户自定义的类加载器加载的类,除非相应的java.lang.Class实例以其它的某种(或多种)方式成为roots,否则它们并不是roots,.
Thread – 活着的线程
Stack Local – Java方法的local变量或参数
JNI Local – JNI方法的local变量或参数
JNI Global – 全局JNI引用
Monitor Used – 用于同步的监控对象
Held by JVM – 用于JVM特殊目的由GC保留的对象,但实际上这个与JVM的实现是有关的。可能已知的一些类型是:系统类加载器、一些JVM知道的重要的异常类、一些用于处理异常的预分配对象以及一些自定义的类加载器等。然而,JVM并没有为这些对象提供其它的信息,因此需要去确定哪些是属于”JVM持有”的了。
看java 代码的时候,很多人都会看见用完一个树或者链表后 head = null;这样的代码。有人说为了加快gc,这里为你揭秘为什么这么写。
代码一定要跑,别的不重要。
代码一定要跑,别的不重要。
代码一定要跑,别的不重要。
/**
* @author 铁拳阿牛
* @createTime 2018/7/14 下午3:46
*
* 请把以下参数设置到jvm里
* -Xmx4000M -Xms4000M -Xmn1300M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:+PrintGCDetails
**/
public class Test {
private static final int _1MB = 1024 * 1024;
private static final int LENGTH = 40000000;
public static void main(String[] args) {
Node next = null;
for(int i = 0; i <= LENGTH; i++){
Node node = new Node(i,next);
next = node;
}
//如果不设置为null这里将会又大批量的遍历,打开这里和不打开这里,gc时间完全不一样,现在你直到为什么要设置为null了吗?
// next = null;
triggerGC();
}
/**
* 不触发gc看不见效果
* new 很多小对象。不然直接到 old区去了。
*/
private static void triggerGC(){
// byte[] all = new byte[2000 * _1MB]; //这里为什么没又直接new 一个大对象?它可能直接就到old区去了。
for(int i = 0 ; i < 500 ; i++){
byte[] bytes = new byte[2 * _1MB];
}
}
//POJO 不用看这里
static class Node {
private int valuel;
private Node node;
public Node(int valuel, Node node) {
this.valuel = valuel;
this.node = node;
}
public int getValuel() {
return valuel;
}
public void setValuel(int valuel) {
this.valuel = valuel;
}
public Node getNode() {
return node;
}
public void setNode(Node node) {
this.node = node;
}
}
}
第一次我们要把eden 的空间尽可能的占满将这两行代码注释掉,发现eden已经用了94% 很不错。
// next = null;
// triggerGC();
~~~~~~~~~~~~~~~~~
Heap
par new generation total 1198080K, used 1001063K [0x00000006c6000000, 0x0000000717400000, 0x0000000717400000)
eden space 1064960K, 94% used [0x00000006c6000000, 0x0000000703199e78, 0x0000000707000000)
from space 133120K, 0% used [0x0000000707000000, 0x0000000707000000, 0x000000070f200000)
to space 133120K, 0% used [0x000000070f200000, 0x000000070f200000, 0x0000000717400000)
concurrent mark-sweep generation total 2764800K, used 0K [0x0000000717400000, 0x00000007c0000000, 0x00000007c0000000)
Metaspace used 2674K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 288K, capacity 386K, committed 512K, reserved 1048576K
next = null;
triggerGC();
~~~~~~~~~~~~~~~~~
[GC (Allocation Failure) [ParNew: 1063732K->399K(1198080K), 0.0101658 secs] 1063732K->399K(3962880K), 0.0102629 secs] [Times: user=0.04 sys=0.00, real=0.01 secs]
Heap
par new generation total 1198080K, used 933048K [0x00000006c6000000, 0x0000000717400000, 0x0000000717400000)
eden space 1064960K, 87% used [0x00000006c6000000, 0x00000006feeca630, 0x0000000707000000)
from space 133120K, 0% used [0x000000070f200000, 0x000000070f263d38, 0x0000000717400000)
to space 133120K, 0% used [0x0000000707000000, 0x0000000707000000, 0x000000070f200000)
concurrent mark-sweep generation total 2764800K, used 0K [0x0000000717400000, 0x00000007c0000000, 0x00000007c0000000)
Metaspace used 2674K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 288K, capacity 386K, committed 512K, reserved 1048576K
// next = null;
triggerGC();
~~~~~~~~~~~~~~~~~
[GC (Allocation Failure) [ParNew: 1063732K->133119K(1198080K), 20.1710025 secs] 1063732K->938404K(3962880K), 20.1710585 secs] [Times: user=145.85 sys=1.89, real=20.17 secs]
Heap
par new generation total 1198080K, used 1065769K [0x00000006c6000000, 0x0000000717400000, 0x0000000717400000)
eden space 1064960K, 87% used [0x00000006c6000000, 0x00000006feeca630, 0x0000000707000000)
from space 133120K, 99% used [0x000000070f200000, 0x00000007173ffff8, 0x0000000717400000)
to space 133120K, 0% used [0x0000000707000000, 0x0000000707000000, 0x000000070f200000)
concurrent mark-sweep generation total 2764800K, used 805284K [0x0000000717400000, 0x00000007c0000000, 0x00000007c0000000)
Metaspace used 2676K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 288K, capacity 386K, committed 512K, reserved 1048576K
Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本。该框架基于 Expert One-on-One Java EE Design and Development(ISBN 0-7645-4385-7)一书中的代码,最初由 Rod Johnson 和 Juergen Hoeller等开发。Spring Framework 提供了一个简易的开发方式,这种开发方式,将避免那些可能致使底层代码变得繁杂混乱的大量的属性文件和帮助类。
Spring 中包含的关键特性:
强大的基于 JavaBeans 的采用控制翻转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组建更加快捷简易。
Remove the following plugin dependencies because they were dropped and aren’t supported anymore.
Dojo Plugin
Codebehind Plugin
JSF Plugin
Struts1 Plugin
StrutsPrepareAndExecuteFilter
The org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter was moved to org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.
Optionally you may remove TilesDefinitions from XML and annotate actions instead. See Tiles Plugin for more details.
Temp/Work directory of ApplicationServer/ServletContainer
Users reported it was necessary for them to remove temp/work directory of their ApplicationServer/ServletContainer. Likely to force server to recompile JSPs.
Support of XSD/DTD linked to the configuration file
It would be very nice, if the the XML configuration uses an dedicated namespace, e.g. http://logging.apache.org/log4j/2.0/config.
This feature allows using XML catalogs to locate the schema locally, e.g. with Eclipse IDE.
The Log4j-events.xsd contains already such a declaration: