嗨,我正在研究基于Web的java工具.我们在两个独立的服务器中部署了两个工具实例 - 一个在生产中(由许多客户同时使用),另一个在我很少使用的开发环境中.实例,开发和生产都部署在具有相同硬件规范的完全相同的服务器中,具有确切的代码,堆大小,应用程序服务器,版本等.
但是我观察到生产实例的速度慢得多,相比之下,甚至在客户使用率为零的夜晚的奇数小时(我们有工具来监控客户在生产中的使用情况).这是令人惊讶的,因为所有因素都是相同的.我假设由于生产实例使用率很高,因此堆中的堆几乎已满且碎片化,而dev中的堆相对空闲且未分段.这就是为什么dev实例要快得多,即使一切都相同.这是一个合理的假设,因为碎片几乎完整的堆将花费更多时间在对象创建中,从而降低性能?
我正在写一个服务器,它可能正在运行恶意代码.为了防止攻击者将线程抛入无限循环,我想强制执行一秒的执行时间限制.
一个InterruptedException可以无限循环内被捕获,从而允许攻击者保留线程的控制.因此Thread.interrupt()不是可接受的解决方案.
我当前的实现防止恶意线程获取任何资源(包括锁),用于Thread.stop()终止执行,并恢复线程所做的任何更改.我的主要抱怨是它使用了弃用的Thread.stop()方法; 我不喜欢使用已弃用的代码.
我想知道是否有更多行业认可的解决方案,缺少启动/杀死一个全新的JVM,这对我的目的来说会有太多的开销.
运行在32位计算机上编译并在64位计算机上运行的Java应用程序是否存在已知问题?
如何在java中编写1 + 1/2 + 1/3 .... + 1/4999 + 1/5000?我试过这个但是没有用.
public class Harmonic{
public static void main(String[] args){
double sum = 0;
for(int i=1; i<=5000; i++){
sum+=1/i;
}
System.out.println(sum);
}
}
Run Code Online (Sandbox Code Playgroud) 我怎么可能实际指定迭代器值大于int的最大大小的for循环?
即我想循环2 ^ 62 -1次.
编辑:2 ^ 62 -1
改变ArrayList<String[]>到String[][]/Object[][]桌面的最简单方法是什么?
我尝试使用size()方法,但这种类型的列表没有简单的方法get().
感谢帮助.
_rowTable[j][0] = new String[_listSelect.size()][columnCount];
for(int j=0; j < _listSelect.size(); j++)
// for(int k=0; k < columnCount; k++)
_rowTable[j][0] = _listSelect.get(0);
Run Code Online (Sandbox Code Playgroud)
如何正确使用第二个循环?
我在java中读取文件时遇到一些问题:我的文件是例如:
3,4
2
6
4
1
7
3
8
9
Run Code Online (Sandbox Code Playgroud)
第一行3和4是数组A和B的长度,然后是每个数组的元素.我做的
import java.io.*;
import java.util.Arrays;
public class Progetto {
public static void main(String args[])
{
// Open the file that is the first
// command line parameter
FileInputStream fstream = new FileInputStream("prova.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine = br.readLine(); // step 1
if (strLine != null) {
String[] delims = strLine.split(","); // step 2
// step 3
int[] a = new int[Integer.parseInt(delims[0])];
int[] b = new int[Integer.parseInt(delims[1])]; …Run Code Online (Sandbox Code Playgroud) 假设我编写了一个程序,它创建了很多String对象和intern()它们:
String someString = param1 + param2;
someString.intern();
Run Code Online (Sandbox Code Playgroud)
这对于一小组字符串来说很好,但是如果我尝试创建十亿个字符串String呢?(或者说亿亿亿?)据我所知,JVM 在PermGen区域为s 维护一个常量池,而PermGen没有得到GC -ed.String
因此,如果我String在循环中创建了过多的对象,但是我删除了对它们的引用,那么它们将得到GC -ed(我将用尽PermGen空间)吗?这些String都是独一无二的,没有任何重复.
我正在阅读帖子,它说使用BufferedReader或MappedByteBuffer.我决定用291.0 MB文件自己测试,但仍然无法决定
BufferedReader reader = new BufferedReader(new FileReader("/Users/rachana/part-00000"));
String line = null;
while((line = reader.readLine())!=null) {
System.out.println(line);
}
~~~~~~ Heap utilization in MB ~~~~~~
Start Date 21:10:20
End Date 21:17:48
Time used 448 second
7.50 min
Used Memory In MB:28
Free Memory:81
Total Memory:109
Max Memory:1820
Run Code Online (Sandbox Code Playgroud)
使用MappedByteBuffer
RandomAccessFile aFile = new RandomAccessFile
("/Users/rachana/part-00000", "r");
FileChannel inChannel = aFile.getChannel();
MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
buffer.load();
for (int i = 0; i < buffer.limit(); i++)
{
System.out.print((char) buffer.get());
}
buffer.clear(); // …Run Code Online (Sandbox Code Playgroud) 这是一个例子:
int[] a = {10};
int x = a.length;
Run Code Online (Sandbox Code Playgroud)
我们不断阅读以隐藏变量并使用访问器.为什么这条规则违反了?