「javasize函数」java finilize
今天给各位分享javasize函数的知识,其中也会对java finilize进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、关于java中size()方法的问题
- 2、java里sizeof方法怎么用啊 测字节的
- 3、JAVA中有没有类似C语言中sizeof那样的功能?
- 4、java的ArrayList大小的()函数
- 5、Java中setBounds和setSize有什么区别
关于java中size()方法的问题
(1)就是这个list的长度。你如果知道长度也可以写死。
(2)定义数组啊,基本定义方式有好几组的,你可以搜索下定义数组方式。
(3)就是把集合转成数组。可以搜索洗toArray方法。
java里sizeof方法怎么用啊 测字节的
Java有类似于C语言中sizeof()的操作器吗?表面答案是Java没有提供任何类似于C语言的sizeof()的操作器。但是,我们应该想想为什么Java 程序员偶尔也需要它。C语言程序员自己管理大多数的数据结构存储分配,并且 sizeof()不负责了解分配的存储块的尺寸大小。C 存储分配器如malloc(),只要涉及到对象初始化几乎什么事都不做:程序员必须设置作为更深一层对象指针的所有对象域。但是当所有的都说过并且编码过的时候, C/C++ 存储分配是相当有效的。相比而言,Java对象分配和构造紧密结合(不可能使用一个已经分配但是没有初始化的对象)。如果Java类定义了作为更深一层对象的引用的域,在构造阶段设置他们也是很普遍的。Java对象分配器因此频繁地分配互连对象:对象图形。与自动垃圾收集耦合,所有这一切都太方便了,并且让你觉得你根本不必担心Java存储分配的细节。当然,这只有对简单的Java应用才有效。相比C/C++而言,同样的Java数据结构往往占据更多的物理存储。在企业软件开发中,接近当今32位JVM上的最大虚拟存储是一个普遍的可缩放性限制。因此,Java 程序员可从sizeof() 或者其他类似的函数中获益,因为这些函数能够观察它的数据结构是否过大或者是否包含存储瓶颈。幸运的是,Java反射允许你相当容易的编写这种工具。接下来,我先讨论几个经常出现的对该问题的错误理解。误区1:因为Java类型的大小确定所以不需要 Sizeof()不错,Java int在所有JVM和所有的平台上都是32位,但是这只是一种语言规范要求,程序员可以接受的这种数据类型的宽度。这种int基本上是一种抽象的数据类型,并且可以被 64位设备上的64位存储器字所支持。非初级的类型也不例外:Java语言规范根本没有涉及这类问题:类域在物理存储中应该如何校准或者布尔排列在JVM内部不能作为一个简单的位向量来实现。误区2: 将对象串行成一个位通量然后查看所产生的通量长度就可以测量对象的尺寸大小这个方法无效的原因就是串行布局只是真实存储器内布局的远程反射。举例说,通过观察String是如何串行的:在存储器内每个char至少2个字节,但是在串行的格式中 String是UTF-8编码的,所以任何ASCII内容只占了一半的空间。
JAVA中有没有类似C语言中sizeof那样的功能?
Java没有提供任何类似于C语言的sizeof()的操作器。但是java中可以模拟C语言中对sizeof的实现。
实现的想法是这样的:java.lang.Runtime类中有一些简单的能涉及到内存管理的函数:
使用这些简单的内存访问,可以得到内存的一些情况,通过建立一个大的某个类的数组,来查看内存用了多少,进而可以求得类的大小。
程序代码示例:
public class Sizeof {
public static void main(String[] args) throws Exception {
// Warm up all classes/methods we will use
runGC();
usedMemory();
// Array to keep strong references to allocated objects
final int count = 100000;
Object[] objects = new Object[count];
long heap1 = 0;
// Allocate count+1 objects, discard the first one
for (int i = -1; i count; ++i) {
Object object = null;
/* Instantiate your data here and assign it to object*/
//object = new Object ();
//object = new Integer (i);
//object = new Long (i);
//object = new String ();
//object = new Byte( (byte) 0);
//object = new Float( 0.2f);
//object = new Double( 0);
//object = new HelloWorld();
if (i = 0)
objects[i] = object;
else {
object = null; // Discard the warm up object
runGC();
heap1 = usedMemory(); // Take a before heap snapshot
}
}
runGC();
long heap2 = usedMemory(); // Take an after heap snapshot:
final int size = (int) Math.round(((double) (heap2 - heap1)) / count);
System.out.println("'before' heap: " + heap1
+ ", 'after' heap: " + heap2);
System.out
.println("heap delta: " + (heap2 - heap1) + ", {"
+ objects[0].getClass() + "} size = " + size
+ " bytes");
for (int i = 0; i count; ++i)
objects[i] = null;
objects = null;
}
private static void runGC() throws Exception {
// It helps to call Runtime.gc()
// using several method calls:
for (int r = 0; r 4; ++r)
_runGC();
}
private static void _runGC() throws Exception {
long usedMem1 = usedMemory(), usedMem2 = Long.MAX_VALUE;
for (int i = 0; (usedMem1 usedMem2) (i 500); ++i) {
s_runtime.runFinalization();
s_runtime.gc();
Thread.yield();
usedMem2 = usedMem1;
usedMem1 = usedMemory();
}
}
private static long usedMemory() {
return s_runtime.totalMemory() - s_runtime.freeMemory();
}
private static final Runtime s_runtime = Runtime.getRuntime();
} // End of class
需要注意的是上面的一句:Object[] objects = new Object[count];
只是分配了数组空间,没有分配对象的空间。数组中只有引用而已。
结论:下代码测试基本对象时,得出的结果象下面:
Object类对象 : 8字节
Integer类对象 : 16字节
Long类对象 : 16字节
Byte类对象 : 16字节
此示例说明了java中基本类型封装对象所占内存的大小。
1.简单的Object对象要占用8个字节的内存空间,因为每个实例都至少必须包含一些最基本操作,比如:wait()/notify(),equals(), hashCode()等。
2.使用Integer对象占用了16个字节,而int占用4个字节,说了封装了之后内存消耗大了4倍。
3.Long看起来比Integer对象应该使用更多空间,结果Long所占的空间也是16个字节。
那么就正好说明了JVM的对于基本类型封装对象的内存分配的规则是如下:
a、Object所占内存(8个字节)+最大基本类型(long)所占内存(8个字节) = 16字节。
b、JVM强制使用8个字节作为边界。
c、所以所有基本类型封装对象所占内存的大小都是16字节。但是还是有区别,比如:Integer对象虽然占用了16个字节的内存,但是只是利用了Object所占内存(8个字节)+int所占内存(4个字节) = 12字节。还有4个字节根本没有被使用。
java的ArrayList大小的()函数
arraylist.size()返回int类型,当成员数量多于0x7FFFFFFF或2G时返回负数表示的数量
负数本身可能没有错,仍代表实际数量
用long
size=arraylist.size()
0xFFFFFFFFL;
size中得到正确数值
另外,用2G这么大的list,反应出设计上可能有潜在问题。避免用这么大的list
Java中setBounds和setSize有什么区别
1.setPreferredSize需要在使用布局管理器的时候使用,布局管理器会获取空间的preferredsize,因而可以生效。例如borderlayout在north中放入一个panel,panel的高度可以通过这样实现:panel.setPreferredSize(new Dimension(0, 100));这样就设置了一个高度为100的panel,宽度随窗口变化。
2.setSize,setLocation,setBounds方法需要在不使用布局管理器的时候使用,也就是setLayout(null)的时候可以使用这三个方法控制布局。
关于javasize函数和java finilize的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-11-27,除非注明,否则均为
原创文章,转载请注明出处。